commit 7243d74d0192d35a53f653a1462377d33c31a315 Author: Vojtěch Struhár Date: Wed Jun 18 12:59:24 2025 +0200 Base scene + player diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/addons/portals/README.md b/addons/portals/README.md new file mode 100644 index 0000000..682783e --- /dev/null +++ b/addons/portals/README.md @@ -0,0 +1,61 @@ +# Portals 3D + +This plugin enables you to easily create seamless plugins. + +## Documentation + +For documentation about `Portal3D`, see the portal script itself. Everything is properly documented +and viewable in the default documentation window. Go to the script editor, click _Search Help_ in +the top bar and search for "Portal3D". + +For everything else, there is this README. + +## Guides + +### Customize portals in the editor + +The portal mesh has a custom shader material assigned to it at runtime (defined in +`materials/portal_shader.gdshader`), but in editor, it uses a regular material -- find it at +`materials/editor-preview-portal-material.tres`. You can edit this material to customize how +portals look in the editor (in case the default gray color blends in too much). + +### Smooth teleportation + +The Portal3D script provides a mechanism for smooth teleportation. In order to be able to create +smooth portal transitions, you need to put a clipping shader onto all meshes that are supposed to +participate in the smooth teleportation. + +**How to convert a regular mesh to a clippable one?** Like this: + +1. On your material, click the downward arrow menu and select _Convert to ShaderMaterial_ +2. Include the shader macros and use them to inject clipping uniforms, the vertex logic +and the fragment logic. + +```c +shader_type spatial; + +// ... + +#include "res://addons/portals/materials/portalclip_mesh.gdshaderinc" + +PORTALCLIP_UNIFORMS + +void vertex() { + // ... + PORTALCLIP_VERTEX +} + +void fragment() { + // ... + PORTALCLIP_FRAGMENT +} +``` + +And that's it! Now look for `DUPLICATE_MESHES_CALLBACK` in the Portal3D script, you are ready to +get going with smooth teleportation! + +## Gizmos + +This plugin includes couple of custom gizmos. One gives a connected portal an outline and the +second one visualizes portal's front direction. You can configure the color of both gizmos in +_Project Settings / Addons / Portals_ or turn them off altogether. diff --git a/addons/portals/gizmos/portal_exit_outline.gd b/addons/portals/gizmos/portal_exit_outline.gd new file mode 100644 index 0000000..2a1f5ac --- /dev/null +++ b/addons/portals/gizmos/portal_exit_outline.gd @@ -0,0 +1,58 @@ +extends EditorNode3DGizmoPlugin + +func _init() -> void: + var exit_outline_color = PortalSettings.get_setting("gizmo_exit_outline_color") + create_material("outline", exit_outline_color, false, true, false) + +func _get_gizmo_name() -> String: + return "PortalExitOutlineGizmo" + +func _has_gizmo(for_node_3d: Node3D) -> bool: + return for_node_3d is Portal3D + +func _redraw(gizmo: EditorNode3DGizmo) -> void: + var portal = gizmo.get_node_3d() as Portal3D + assert(portal != null, "This gizmo works only for Portal3D") + gizmo.clear() + + if portal not in EditorInterface.get_selection().get_selected_nodes(): + return + + var ep: Portal3D = portal.exit_portal + if ep == null: + return + + + var extents = Vector3(ep.portal_size.x, ep.portal_size.y, ep._portal_thickness) / 2 + + var lines: Array[Vector3] = [ + # Front rect + extents, extents * Vector3(1, -1, 1), + extents, extents * Vector3(-1, 1, 1), + extents * Vector3(1, -1, 1), extents * Vector3(-1, -1, 1), + extents * Vector3(-1, 1, 1), extents * Vector3(-1, -1, 1), + + # Back rect + - extents, -extents * Vector3(1, -1, 1), + - extents, -extents * Vector3(-1, 1, 1), + - extents * Vector3(1, -1, 1), -extents * Vector3(-1, -1, 1), + - extents * Vector3(-1, 1, 1), -extents * Vector3(-1, -1, 1), + + # Short Z connections + extents * Vector3(1, 1, 1), extents * Vector3(1, 1, -1), + extents * Vector3(1, -1, 1), extents * Vector3(1, -1, -1), + extents * Vector3(-1, 1, 1), extents * Vector3(-1, 1, -1), + extents * Vector3(-1, -1, 1), extents * Vector3(-1, -1, -1), + ] + + # Double each line for visual thickness + #for i in range(lines.size()): + #lines.append(lines[i] + (lines[i].normalized() * 0.005)) + + for i in range(lines.size()): + lines[i] = portal.to_local(ep.to_global(lines[i])) + + gizmo.add_lines( + PackedVector3Array(lines), + get_material("outline", gizmo) + ) diff --git a/addons/portals/gizmos/portal_exit_outline.gd.uid b/addons/portals/gizmos/portal_exit_outline.gd.uid new file mode 100644 index 0000000..6998dc9 --- /dev/null +++ b/addons/portals/gizmos/portal_exit_outline.gd.uid @@ -0,0 +1 @@ +uid://pk5ua52g54m1 diff --git a/addons/portals/gizmos/portal_forward_direction.gd b/addons/portals/gizmos/portal_forward_direction.gd new file mode 100644 index 0000000..0f44864 --- /dev/null +++ b/addons/portals/gizmos/portal_forward_direction.gd @@ -0,0 +1,39 @@ +extends EditorNode3DGizmoPlugin + +func _init() -> void: + var forward_color = PortalSettings.get_setting("gizmo_forward_color") + create_material("forward", forward_color, false, false, false) + + +func _get_gizmo_name() -> String: + return "PortalForwardDirectionGizmo" + +func _has_gizmo(for_node_3d: Node3D) -> bool: + return for_node_3d is Portal3D + +func _redraw(gizmo: EditorNode3DGizmo) -> void: + var portal = gizmo.get_node_3d() as Portal3D + assert(portal != null, "This gizmo works only for Portal3D") + var active: bool = portal in EditorInterface.get_selection().get_selected_nodes() + + gizmo.clear() + + var lines: Array[Vector3] = [ + Vector3.ZERO, Vector3(0, 0, 1) + ] + if active: + var arrow_spread = 0.05 + lines.append_array([ + Vector3(0, 0, 1), Vector3(arrow_spread, -arrow_spread, 0.9), + Vector3(0, 0, 1), Vector3(-arrow_spread, arrow_spread, 0.9), + ]) + + var offset = 0.005 + for i in range(lines.size()): + var p = lines[i] + lines.append(Vector3(p.x + offset, p.y + offset, p.z)) + + gizmo.add_lines( + PackedVector3Array(lines), + get_material("forward", gizmo) + ) diff --git a/addons/portals/gizmos/portal_forward_direction.gd.uid b/addons/portals/gizmos/portal_forward_direction.gd.uid new file mode 100644 index 0000000..e74b08a --- /dev/null +++ b/addons/portals/gizmos/portal_forward_direction.gd.uid @@ -0,0 +1 @@ +uid://cacoywhcpn4ja diff --git a/addons/portals/materials/editor-preview-portal-material.tres b/addons/portals/materials/editor-preview-portal-material.tres new file mode 100644 index 0000000..f516e06 --- /dev/null +++ b/addons/portals/materials/editor-preview-portal-material.tres @@ -0,0 +1,5 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://dcfkcyddxkglf"] + +[resource] +cull_mode = 2 +albedo_color = Color(0.849621, 0.849621, 0.849621, 1) diff --git a/addons/portals/materials/portal3d-icon.svg b/addons/portals/materials/portal3d-icon.svg new file mode 100644 index 0000000..adfba84 --- /dev/null +++ b/addons/portals/materials/portal3d-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/portals/materials/portal3d-icon.svg.import b/addons/portals/materials/portal3d-icon.svg.import new file mode 100644 index 0000000..9a2d3dc --- /dev/null +++ b/addons/portals/materials/portal3d-icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct62bsuel5hyc" +path="res://.godot/imported/portal3d-icon.svg-a34538e0e6bdf86bd50ffe0190100a72.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/portals/materials/portal3d-icon.svg" +dest_files=["res://.godot/imported/portal3d-icon.svg-a34538e0e6bdf86bd50ffe0190100a72.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/portals/materials/portal_shader.gdshader b/addons/portals/materials/portal_shader.gdshader new file mode 100644 index 0000000..85ffd4a --- /dev/null +++ b/addons/portals/materials/portal_shader.gdshader @@ -0,0 +1,16 @@ +shader_type spatial; +render_mode unshaded; + +uniform sampler2D albedo: hint_default_black, source_color; + +void fragment() { + // The portal color is simply the screen-space color of the exit camera render target. + // This is because the exit camera views the exit portal from the perspective of the player watching + // the entrance portal, meaning the exit portal will occupy the same screen-space as the entrance portal. + vec3 portal_color = texture(albedo, SCREEN_UV).rgb; + + ALBEDO = portal_color; + + // FOR DEBUG - make portals slightly red + // ALBEDO = mix(portal_color, vec3(1, 0, 0), 0.1); +} \ No newline at end of file diff --git a/addons/portals/materials/portal_shader.gdshader.uid b/addons/portals/materials/portal_shader.gdshader.uid new file mode 100644 index 0000000..ff15d2f --- /dev/null +++ b/addons/portals/materials/portal_shader.gdshader.uid @@ -0,0 +1 @@ +uid://bhdb2skdxehes diff --git a/addons/portals/materials/portalclip_mesh.gdshaderinc b/addons/portals/materials/portalclip_mesh.gdshaderinc new file mode 100644 index 0000000..1c93304 --- /dev/null +++ b/addons/portals/materials/portalclip_mesh.gdshaderinc @@ -0,0 +1,11 @@ +#define PORTALCLIP_UNIFORMS \ +instance uniform bool portal_clip_active = false;\ +instance uniform vec3 portal_clip_point = vec3(0, 0, 0);\ +instance uniform vec3 portal_clip_normal = vec3(0, 1, 0);\ +varying vec3 portal_clip_vertex_position;\ + +#define PORTALCLIP_VERTEX \ +portal_clip_vertex_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;\ + +#define PORTALCLIP_FRAGMENT \ +if (portal_clip_active && dot(portal_clip_vertex_position - portal_clip_point, portal_clip_normal) < 0.0) ALPHA = 0.0; diff --git a/addons/portals/materials/portalclip_mesh.gdshaderinc.uid b/addons/portals/materials/portalclip_mesh.gdshaderinc.uid new file mode 100644 index 0000000..46672ba --- /dev/null +++ b/addons/portals/materials/portalclip_mesh.gdshaderinc.uid @@ -0,0 +1 @@ +uid://cpxsita6rqndc diff --git a/addons/portals/plugin.cfg b/addons/portals/plugin.cfg new file mode 100644 index 0000000..1e7164f --- /dev/null +++ b/addons/portals/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Portals 3D" +description="Seamless portals plugin in 3D" +author="Vojtech Struhar" +version="1.0" +script="plugin.gd" diff --git a/addons/portals/plugin.gd b/addons/portals/plugin.gd new file mode 100644 index 0000000..808806e --- /dev/null +++ b/addons/portals/plugin.gd @@ -0,0 +1,39 @@ +@tool +extends EditorPlugin + +const ExitOutlinesGizmo = preload("uid://pk5ua52g54m1") # gizmos/portal_exit_outline.gd +var exit_outline_gizmo + +const ForwardDirGizmo = preload("uid://cacoywhcpn4ja") # gizmos/portal_forward_direction.gd +var forward_dir_gizmo + +func _enter_tree() -> void: + + PortalSettings.init_setting("gizmo_exit_outline_active", true, true) + PortalSettings.add_info(AtExport.bool_("gizmo_exit_outline_active")) + + PortalSettings.init_setting("gizmo_exit_outline_color", Color.DEEP_SKY_BLUE, true) + PortalSettings.add_info(AtExport.color_no_alpha("gizmo_exit_outline_color")) + + PortalSettings.init_setting("gizmo_forward_active", true, true) + PortalSettings.add_info(AtExport.bool_("gizmo_forward_active")) + + PortalSettings.init_setting("gizmo_forward_color", Color.HOT_PINK, true) + PortalSettings.add_info(AtExport.color_no_alpha("gizmo_forward_color")) + + PortalSettings.init_setting("portals_group_name", "portals") + PortalSettings.add_info(AtExport.string("portals_group_name")) + + if PortalSettings.get_setting("gizmo_exit_outline_active"): + exit_outline_gizmo = ExitOutlinesGizmo.new() + add_node_3d_gizmo_plugin(exit_outline_gizmo) + + if PortalSettings.get_setting("gizmo_forward_active"): + forward_dir_gizmo = ForwardDirGizmo.new() + add_node_3d_gizmo_plugin(forward_dir_gizmo) + +func _exit_tree() -> void: + if exit_outline_gizmo: + remove_node_3d_gizmo_plugin(exit_outline_gizmo) + if forward_dir_gizmo: + remove_node_3d_gizmo_plugin(forward_dir_gizmo) diff --git a/addons/portals/plugin.gd.uid b/addons/portals/plugin.gd.uid new file mode 100644 index 0000000..266d979 --- /dev/null +++ b/addons/portals/plugin.gd.uid @@ -0,0 +1 @@ +uid://ev8ej7qedyih diff --git a/addons/portals/scripts/at_export.gd b/addons/portals/scripts/at_export.gd new file mode 100644 index 0000000..207101f --- /dev/null +++ b/addons/portals/scripts/at_export.gd @@ -0,0 +1,171 @@ +class_name AtExport extends Object + +## Helper class for defining custom export inspector. +## +## Intended usage is when using [method Object._get_property_list] to define a custom editor +## inspector. The list not exhaustive, as I didn't need every single export annotation. [br] +## [codeblock] +## @export var foo: int = 0 +## [/codeblock] +## becomes +## [codeblock] +## var foo: int = 0 +## +## func _get_property_list() -> void: +## return [ +## AtExport.int_("health") +## ] +## [/codeblock] +## Coincidentally, the dictionaries used to register [ProjectSettings] are very similar, +## too. + + +static func _base(propname: String, type: int) -> Dictionary: + return { + "name": propname, + "type": type, + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_SCRIPT_VARIABLE + } + +## Replacement for [annotation @GDScript.@export_tool_button] +static func button(propname: String, button_text: String, button_icon: String = "Callable") -> Dictionary: + var result := _base(propname, TYPE_CALLABLE) + + assert(not button_text.contains(","), "Button text cannot contain a comma") + + result["hint"] = PROPERTY_HINT_TOOL_BUTTON + result["hint_string"] = button_text + "," + button_icon + + return result + +## [annotation @GDScript.@export] bool variables +static func bool_(propname: String) -> Dictionary: + return _base(propname, TYPE_BOOL) + +## [annotation @GDScript.@export] [Color] variables +static func color(propname: String) -> Dictionary: + return _base(propname, TYPE_COLOR) + + +## Replacement for [annotation @GDScript.@export_color_no_alpha] +static func color_no_alpha(propname: String) -> Dictionary: + var result := _base(propname, TYPE_COLOR) + result["hint"] = PROPERTY_HINT_COLOR_NO_ALPHA + return result + +## Exporting an enum variable.[br]Example: +## [codeblock] +## var view_direction: ViewDirection +## # ... +## AtExport.enum_("view_direction", &"Portal3D.ViewDirection", ViewDirection) +## [/codeblock] +static func enum_(propname: String, parent_and_enum: StringName, enum_class: Variant) -> Dictionary: + var result := int_(propname) + + result["class_name"] = parent_and_enum + result["hint"] = PROPERTY_HINT_ENUM + result["hint_string"] = ",".join(enum_class.keys()) + result["usage"] |= PROPERTY_USAGE_CLASS_IS_ENUM + + return result + +## [annotation @GDScript.@export] float variables +static func float_(propname: String) -> Dictionary: + return _base(propname, TYPE_FLOAT) + +## Replacement for [annotation @GDScript.@export_range] with float variables. +## Also see [method int_range] +static func float_range(propname: String, min: float, max: float, step: float = 0.01, extra_hints: Array[String] = []) -> Dictionary: + var result := float_(propname) + var hint_string = "%f,%f,%f" % [min, max, step] + + if extra_hints.size() > 0: + for h in extra_hints: + hint_string += ("," + h) + + result["hint"] = PROPERTY_HINT_RANGE + result["hint_string"] = hint_string + + return result + +## [annotation @GDScript.@export] integer variables +static func int_(propname: String) -> Dictionary: + return _base(propname, TYPE_INT) + +## Replacement for [annotation @GDScript.@export_flags] +static func int_flags(propname: String, options: Array) -> Dictionary: + var result := int_(propname) + result["hint"] = PROPERTY_HINT_FLAGS + result["hint_string"] = ",".join(options) + return result + +## Replacement for [annotation @GDScript.@export_flags_3d_physics] +static func int_physics_3d(propname: String) -> Dictionary: + var result := int_(propname) + result["hint"] = PROPERTY_HINT_LAYERS_3D_PHYSICS + return result + +## Replacement for [annotation @GDScript.@export_range] with integer variables. +## Also see [method float_range] +static func int_range(propname: String, min: int, max: int, step: int = 1, extra_hints: Array[String] = []) -> Dictionary: + var result := float_range(propname, min, max, step, extra_hints) + result["type"] = TYPE_INT + return result + +## Replacement for [annotation @GDScript.@export_flags_3d_render] +static func int_render_3d(propname: String) -> Dictionary: + var result := int_(propname) + result["hint"] = PROPERTY_HINT_LAYERS_3D_RENDER + return result + +## Replacement for [annotation @GDScript.@export_group]. +static func group(group_name: String, prefix: String = "") -> Dictionary: + var result := _base(group_name, TYPE_NIL) + # Overwrite the usage! + result["usage"] = PROPERTY_USAGE_GROUP + result["hint_string"] = prefix + return result + +## Close the group that began with [method group]. If you've supplied a prefix to [method group], +## it should close itself. +static func group_end() -> Dictionary: + return group("") + +## [annotation @GDScript.@export] NodePath variables. Variables of [i]node type[/i] also only store +## [NodePath]s. +## [codeblock] +## var mesh: MeshInstance3D +## # inside _get_property_list +## AtExport.node("mesh", "MeshInstance3D") +## [/codeblock] +static func node(propname: String, node_class: StringName) -> Dictionary: + var result = _base(propname, TYPE_OBJECT) + result["hint"] = PROPERTY_HINT_NODE_TYPE + result["class_name"] = node_class + result["hint_string"] = node_class + return result + +## [annotation @GDScript.@export] for [String] variables +static func string(propname: String) -> Dictionary: + return _base(propname, TYPE_STRING) + +## Replacement for [annotation @GDScript.@export_subgroup]. Only works when nested inside +## [method group]. +static func subgroup(subgroup_name: String, prefix: String = "") -> Dictionary: + var result := _base(subgroup_name, TYPE_NIL) + # Overwrite the usage! + result["usage"] = PROPERTY_USAGE_SUBGROUP + result["hint_string"] = prefix + return result + +## Closes a subgroup created with [method subgroup]. Also see [method group_end] +static func subgroup_end() -> Dictionary: + return subgroup("") + +## [annotation @GDScript.@export] for [Vector2] variables +static func vector2(propname: String) -> Dictionary: + return _base(propname, TYPE_VECTOR2) + +## [annotation @GDScript.@export] for [Vector3] variables +static func vector3(propname: String) -> Dictionary: + return _base(propname, TYPE_VECTOR3) diff --git a/addons/portals/scripts/at_export.gd.uid b/addons/portals/scripts/at_export.gd.uid new file mode 100644 index 0000000..3dab157 --- /dev/null +++ b/addons/portals/scripts/at_export.gd.uid @@ -0,0 +1 @@ +uid://d2ufiv5n1dcdr diff --git a/addons/portals/scripts/portal_3d.gd b/addons/portals/scripts/portal_3d.gd new file mode 100644 index 0000000..a0159ce --- /dev/null +++ b/addons/portals/scripts/portal_3d.gd @@ -0,0 +1,967 @@ +@tool +@icon("uid://ct62bsuel5hyc") +class_name Portal3D extends Node3D + +## Seamless 3D portal +## +## To get started, create two Portal3D instances and set their [member exit_portal] to each other. +## This creates a linked portal pair that you can look through. Make your player to collide with +## [member teleport_collision_mask] and you will be able to walk back and forth through the portal. +## [br][br] +## To integrate portals into your game, you can make use of the [signal on_teleport] and +## [signal on_teleport_receive] signals. You can link a portal a different one by chaning its +## [member exit_portal] during gameplay. The next level is to make use of the portal's callbacks, +## mainly the [member ON_TELEPORT_CALLBACK]. If you need to raycast through a portal, then the +## [method forward_raycast] method might come in handy! When it comes to optimization, you can use +## the [method activate] and [method deactivate] methods to control which portals are consuming +## resources. +## [br][br] +## [b]TIP:[/b] If you change the default value of some property, it will not get synchronized into existing +## portal instances due to how Godot handles custom inspectors. For easier defaults management, +## I recommend creating a scene with Portal3D as a root and re-using that. + + +#region Public API + +## Emitted when this portal teleports something. Also see [signal on_teleport_receive] +signal on_teleport(node: Node3D) + +## Emitted when this portal [i]receives[/i] a teleported node. Whoever had [b]this[/b] portal as +## its [member exit_portal] triggered a teleport! +signal on_teleport_receive(node: Node3D) + +## Activates the portal, making it visible and teleporting again. THe assumption is that it was +## previously deactivated by [method deactivate] or [member start_deactivated]. Recreates internal +## viewports if needed. +func activate() -> void: + process_mode = Node.PROCESS_MODE_INHERIT + + if portal_viewport == null: + # Viewports have been destroyed + _setup_cameras() + + show() + + +## Disables all processing (this includes teleportation) and hides the portal. Optionally destroys +## the viewports, freeing up memory. [br][br] +## Setting [member start_deactivated] to [code]true[/code] avoid viewport allocation at the start of +## the game. [br][br] +## Deactivated portal has to be explicitly activated by calling [method activate]. +func deactivate(destroy_viewports: bool = false) -> void: + hide() + _watchlist_teleportables.clear() + + if destroy_viewports: + if portal_viewport: + portal_viewport.queue_free() + portal_viewport = null + portal_camera = null + + process_mode = Node.PROCESS_MODE_DISABLED + +## Helper method for checking for raycast collisions through portals. If your [RayCast3D] node hits +## a portal collider, pass the [RayCast3D] node to this function to find out what's on the other +## side of the portal! [br][br] +## Uses [method PhysicsDirectSpaceState3D.intersect_ray] under the hood.[br][br] +## Also see [method forward_raycast_query]. +func forward_raycast(raycast: RayCast3D) -> Dictionary: + var start := to_exit_position(raycast.get_collision_point()) + var goal := to_exit_position(raycast.to_global(raycast.target_position)) + + var query = PhysicsRayQueryParameters3D.create( + start, + goal, + raycast.collision_mask, + [self.teleport_area, exit_portal.teleport_area] + ) + query.collide_with_areas = raycast.collide_with_areas + query.collide_with_bodies = raycast.collide_with_bodies + query.hit_back_faces = raycast.hit_back_faces + query.hit_from_inside = raycast.hit_from_inside + + return get_world_3d().direct_space_state.intersect_ray(query) + +## When doing raycasts with [method PhysicsDirectSpaceState3D.intersect_ray] and you hit a portal +## that you want to go through, pass the [PhysicsRayQueryParameters3D] you are using to this +## function. It will calculate the ray's continuation and execute the raycast again, returning the +## result dictionary. [br][br] +## If you are using [RayCast3D] for raycasting, see [method forward_raycast]. +func forward_raycast_query(params: PhysicsRayQueryParameters3D) -> Dictionary: + var start := to_exit_position(params.from) + var end := to_exit_position(params.to) + start = exit_portal.line_intersection(start, end) + + var excludes = [self.teleport_area, exit_portal.teleport_area] + excludes.append_array(params.exclude) + + var query = PhysicsRayQueryParameters3D.create( + start, end, params.collision_mask, excludes + ) + query.collide_with_areas = params.collide_with_areas + query.collide_with_bodies = params.collide_with_bodies + query.hit_back_faces = params.hit_back_faces + query.hit_from_inside = params.hit_from_inside + + return get_world_3d().direct_space_state.intersect_ray(query) + + +## This method will be called on a teleported node if [member TeleportInteractions.CALLBACK] +## is checked in [member teleport_interactions]. The portal will try to call the method +## [code]on_teleport[/code] on any object being teleported by it.[br][br] +## Example: +## [codeblock] +## func on_teleport(portal: Portal3D) -> void: +## print("Teleported by %s!" % portal.name) +## [/codeblock] +const ON_TELEPORT_CALLBACK: StringName = &"on_teleport" + +## This method will be called on a node that will get into close proximity of a portal that has +## [member TeleportInteractions.DUPLICATE_MESHES] turned on. The method is expected to return an +## array of [MeshInstance3D]s.[br][br] +## Example: +## [codeblock] +## @onready var character_mesh: MeshInstance = $CharacterMesh +## +## func get_teleportable_meshes() -> Array[MeshInstance3D]: +## return [character_mesh] +## [/codeblock] +## +## The returned meshes require a special material. Check out the plugin's README for more +## information! +const DUPLICATE_MESHES_CALLBACK: StringName = &"get_teleportable_meshes" + +## By default, object triggering the teleport gets teleported. You can override this with a +## metadata property that contains a [NodePath]. If the metadata property is set, then the node at +## the node path will be teleported instead. Setting this to ancestor nodes is recommended.[br][br] +## Example: +## [codeblock] +## func _ready() -> void: +## self.set_meta("teleport_root", ^"..") # parent +## [/codeblock] +## Or you can set the metadata property via the inspector! +const TELEPORT_ROOT_META: StringName = &"teleport_root" + + +#endregion + +## Size of the portal rectangle, height and width. +var portal_size: Vector2 = Vector2(2.0, 2.5): + set(v): + portal_size = v + if _caused_by_user_interaction(): + _on_portal_size_changed() + update_configuration_warnings() + if exit_portal: + exit_portal.update_configuration_warnings() + +## The exit of this particular portal. Portal camera renders what it sees through this +## [member exit_portal] and teleports take you here. This is a [b]required[/b] property, it +## can never be [code]null[/code]. +## [br][br] +## You can change this property during gameplay to switch the portal to a different destination. +## To disable a portal, see [method deactivate]. +## [br][br] +## [b]TIP:[/b] Commonly, two portals have set each other as [member exit_portal], which +## allows you to travel back and forth. But you can experiment with one-way portals too! +var exit_portal: Portal3D: + set(v): + exit_portal = v + update_configuration_warnings() + notify_property_list_changed() + +var _tb_pair_portals: Callable = _editor_pair_portals.bind() +var _tb_sync_portal_sizes: Callable = _editor_sync_portal_sizes.bind() + +## Manually override what's the main camera of the scene. By default it's inferred as the camera +## rendering the parent viewport of the portal. You might have to specify this, if your game uses +## multiple [SubViewport]s. +var player_camera: Camera3D + +## The portal camera sets its [member Camera3D.near] as close to the portal as possible, in an +## effort to clip objects close behind the portal. This value offsets the [member portal_camera]'s +## near clip plane. Might be useful, if the portal has a thick frame around it. +var portal_frame_width: float = 0 + +## Options for different sizes of the internal viewports. It helps to reduce the memory usage +## by not rendering the portals at full resolution. Viewports are resized on window resize. +enum PortalViewportSizeMode { + ## Render at full window resolution. + FULL, + ## The portal will be [b]at most[/b] this wide. Height is calculated from window aspect ratio. + MAX_WIDTH_ABSOLUTE, + ## Portal viewport will be a fraction of full window size. + FRACTIONAL +} + +## Size mode to use for the portal viewport size. Only set this via the inspector. +var viewport_size_mode: PortalViewportSizeMode = PortalViewportSizeMode.FULL: + set(v): + viewport_size_mode = v + notify_property_list_changed() +var _viewport_size_max_width_absolute: int = ProjectSettings.get_setting("display/window/size/viewport_width") +var _viewport_size_fractional: float = 0.5 + + +## Hints the direction from which you expect the portal to be viewed.[br][br] +## Use cases: one-way portals, visual-only portals (with [member is_teleport] set to +## [code]false[/code]), or portals that are flush with a wall. +enum ViewDirection { + ## Portal is expected to be viewed from either side (default) + FRONT_AND_BACK, + ## Corresponds to portal's FORWARD direction (-Z) + ONLY_FRONT, + ## Corresponds to portal's BACK direction (+Z) + ONLY_BACK, +} + +## The direction from which you expect the portal to be viewed. Restricting this restricts the +## way the portal mesh is shifted around when player looks at the portal from different sides.[br] +## Restrict this if the portal can be seen from the sides and has no portal frame around it to +## cover the shifting mesh.[br][br] +## Also see [member teleport_direction] +var view_direction: ViewDirection = ViewDirection.FRONT_AND_BACK + + +## The [member portal_mesh] setting for [member VisualInstance3D.layers], so that the portal +## cameras don't see other portals. +var portal_render_layer: int = 1 << 19: + set(v): + portal_render_layer = v + if _caused_by_user_interaction(): + portal_mesh.layers = v + +## If [code]true[/code], the portal is also a teleport. If [code]false[/code], the portal is +## visual-only. +## [br][br] +## You are expected to toggle this in the editor. For runtime teleport toggling, see +## [method activate] and [method deactivate]. +var is_teleport: bool = true: + set(v): + is_teleport = v + if _caused_by_user_interaction(): + _setup_teleport() + notify_property_list_changed() + +## Dictates from which direction an object has to enter the portal to be teleported. +enum TeleportDirection { + ## Corresponds to portal's FORWARD direction (-Z) + FRONT, + ## Corresponds to portal's BACK direction (+Z) + BACK, + ## Teleports stuff coming from either side. (default) + FRONT_AND_BACK +} + +## Portal will only teleport things coming from this direction. +var teleport_direction: TeleportDirection = TeleportDirection.FRONT_AND_BACK + +## When a [RigidBody3D] goes through the portal, give its new normalized velocity a +## little boost. Makes stuff flying out of portals more fun. [br][br] +## Recommended values: 1 to 3 +var rigidbody_boost: float = 0.0 + +## When teleporting, the portal checks if the teleported object is less than [b]this[/b] near. +## Prevents false negatives when multiple portals are on top of each other. +var teleport_tolerance: float = 0.5 + +## Flags for everything that happens when a something is teleported. +enum TeleportInteractions { + ## The portal will try to call [constant ON_TELEPORT_CALLBACK] method on the teleported + ## node. You need to implement this function with a script. + CALLBACK = 1 << 0, + ## When the player is teleported, his X and Z rotations are tweened to zero. Resets unwanted + ## from going through a tilted portal. If checked, this will happen BEFORE the callback. + PLAYER_UPRIGHT = 1 << 1, + ## Duplicate meshes present on the teleported object, resulting in a [i]smooth teleport[/i] + ## from a 3rd point of view. [br] + ## To use this feature, implement a method named [constant DUPLICATE_MESHES_CALLBACK] on the + ## teleported body, which returns an array of mesh instances that should be duplicated. + ## Every one of those meshes also needs to implement a special shader material to clip it along + ## the portal plane. + ## See shaderinclude at [code]addons/portals/materials/portalclip_mesh.gdshaderinc[/code] + DUPLICATE_MESHES = 1 << 2 +} + +## See [enum TeleportInteractions] for options. +var teleport_interactions: int = TeleportInteractions.CALLBACK \ + | TeleportInteractions.PLAYER_UPRIGHT + + +## Any [CollisionObject3D]s detected by this mask will be registered by the portal and teleported, +## when they cross the portal boundary. +var teleport_collision_mask: int = 1 << 15 + +## If the portal is not immediately visible on scene start, you can start it in [i]disabled +## mode[/i]. This just means it will not create the appropriate subviewports, saving memory. +## It will also not be processed.[br][br] +## You have to call [method activate] on it to wake it up! Also see [method disable] +var start_deactivated: bool = false + +#region INTERNALS + +@export_storage var _portal_thickness: float = 0.05: + set(v): + _portal_thickness = v + if _caused_by_user_interaction(): _on_portal_size_changed() + +@export_storage var _portal_mesh_path: NodePath +## Mesh used to visualize the portal surface. Created when the portal is added to the scene +## [b]in the editor[/b]. +var portal_mesh: MeshInstance3D: + get(): + return get_node(_portal_mesh_path) if _portal_mesh_path else null + set(v): assert(false, "Proxy variable, use '_portal_mesh_path' instead") + +@export_storage var _teleport_area_path: NodePath +## When a teleportable object comes near the portal, it's registered by this area and watched +## every frame to trigger the teleport. [br][br] Created by toggling [member is_teleport] in editor. +var teleport_area: Area3D: + get(): + return get_node(_teleport_area_path) if _teleport_area_path else null + set(v): assert(false, "Proxy variable, use '_teleport_area_path' instead") + +@export_storage var _teleport_collider_path: NodePath +## Collider for [member teleport_area]. +var teleport_collider: CollisionShape3D: + get(): + return get_node(_teleport_collider_path) if _teleport_collider_path else null + set(v): assert(false, "Proxy variable, use '_teleport_collider_path' instead") + + +## Camera that looks through the exit portal and renders to [member portal_viewport]. +## Created in [method Node._ready] +var portal_camera: Camera3D = null + +## Viewport that supplies the albedo texture to portal mesh. Rendered by [member portal_camera]. +## Created in [method Node._ready] +var portal_viewport: SubViewport = null + +## Metadata about teleported objects. +## +## When the portal detects a teleportable body (or area) nearby, it gathers this metadata and +## starts watching it every frame for teleportation. +class TeleportableMeta: + ## Forward distance from the portal + var forward: float = 0 + ## Meshes that the object gave for duplication. Retrieved by the + ## [constant Portal3D.DUPLICATE_MESHES_CALLBACK] callback. + var meshes: Array[MeshInstance3D] = [] + ## Cloned [member Portal3D.TeleportableMeta.meshes] with [method Node.duplicate] + var mesh_clones: Array[MeshInstance3D] = [] + +# These physics bodies are being watched by the portal. They are registered with their instance IDs +# as the keys of the dictionary. Registering them by their object references becomes unreliable +# when the teleport candidate gets freed. +var _watchlist_teleportables: Dictionary[int, TeleportableMeta] = {} + +#endregion + +#region Editor Configuration + +const _PORTAL_SHADER: Shader = preload("uid://bhdb2skdxehes") +const _EDITOR_PREVIEW_PORTAL_MATERIAL: StandardMaterial3D = preload("uid://dcfkcyddxkglf") + +# _ready(), but only in editor. +func _editor_ready() -> void: + add_to_group(PortalSettings.get_setting("portals_group_name"), true) + set_notify_transform(true) + + process_priority = 100 + process_physics_priority = 100 + + _setup_mesh() + _setup_teleport() + + self._group_node(self) + +func _notification(what: int) -> void: + match what: + NOTIFICATION_TRANSFORM_CHANGED: + update_gizmos() + +func _editor_pair_portals() -> void: + assert(exit_portal != null, "My own exit has to be set!") + exit_portal.exit_portal = self + notify_property_list_changed() + +func _editor_sync_portal_sizes() -> void: + assert(exit_portal != null, "My own exit has to be set!") + portal_size = exit_portal.portal_size + notify_property_list_changed() + +func _setup_teleport(): + if is_teleport == false: + if teleport_area: + teleport_area.queue_free() + _teleport_area_path = NodePath("") + if teleport_collider: + teleport_collider.queue_free() + _teleport_collider_path = NodePath("") + return + + # Teleport is already set up + if teleport_area and teleport_collider: + return + + var area = Area3D.new() + area.name = "TeleportArea" + + _add_child_in_editor(self, area) + _teleport_area_path = get_path_to(area) + + var collider = CollisionShape3D.new() + collider.name = "Collider" + var box = BoxShape3D.new() + box.size.x = portal_size.x + box.size.y = portal_size.y + collider.shape = box + + _add_child_in_editor(teleport_area, collider) + _teleport_collider_path = get_path_to(collider) + + +func _on_portal_size_changed() -> void: + if portal_mesh == null: + push_error("Failed to update portal size, portal has no mesh") + return + + var p: PortalBoxMesh = portal_mesh.mesh + p.size = Vector3(portal_size.x, portal_size.y, 1) + portal_mesh.scale.z = _portal_thickness + + if is_teleport and teleport_collider: + var box: BoxShape3D = teleport_collider.shape + box.size.x = portal_size.x + box.size.y = portal_size.y + +#endregion + +#region GAMEPLAY LOGIC + +func _ready() -> void: + if Engine.is_editor_hint(): + _editor_ready.call_deferred() + return + + if player_camera == null: + player_camera = get_viewport().get_camera_3d() + assert(player_camera != null, "Player camera is missing!") + + + var mat: ShaderMaterial = ShaderMaterial.new() + mat.shader = _PORTAL_SHADER + portal_mesh.material_override = mat + + if not start_deactivated: + _setup_cameras() + get_viewport().size_changed.connect(_on_window_resize) + else: + deactivate.call_deferred(true) + + if is_teleport: + assert(teleport_area, "Teleport area should be already set up from editor") + teleport_area.area_entered.connect(self._on_teleport_area_entered) + teleport_area.area_exited.connect(self._on_teleport_area_exited) + teleport_area.body_entered.connect(self._on_teleport_body_entered) + teleport_area.body_exited.connect(self._on_teleport_body_exited) + teleport_area.collision_mask = teleport_collision_mask + + +func _process(delta: float) -> void: + if Engine.is_editor_hint(): + return + + if is_teleport: + _process_teleports() + + _process_cameras() + + +func _process_cameras() -> void: + if portal_camera == null: + push_error("%s: No portal camera" % name) + return + if player_camera == null: + push_error("%s: No player camera" % name) + return + if exit_portal == null: + push_error("%s: No exit portal" % name) + return + + # Update camera + portal_camera.global_transform = self.to_exit_transform(player_camera.global_transform) + portal_camera.near = _calculate_near_plane() + portal_camera.fov = player_camera.fov + + # Prevent flickering + var pv_size: Vector2i = portal_viewport.size + var half_height: float = player_camera.near * tan(deg_to_rad(player_camera.fov * 0.5)) + var half_width: float = half_height * pv_size.x / float(pv_size.y) + var near_diagonal: float = Vector3(half_width, half_height, player_camera.near).length() + portal_mesh.scale.z = near_diagonal + + var player_in_front_of_portal: bool = forward_distance(player_camera) > 0 + var portal_shift: float = 0 + match view_direction: + ViewDirection.ONLY_FRONT: + portal_shift = 1 + ViewDirection.ONLY_BACK: + portal_shift = -1 + ViewDirection.FRONT_AND_BACK: + portal_shift = 1 if player_in_front_of_portal else -1 + + portal_mesh.scale.z *= signf(portal_shift) # Turn the portal towards the player + + +func _process_teleports() -> void: + for body_id: int in _watchlist_teleportables.keys(): + if not is_instance_id_valid(body_id): # Watched body has been freed + _erase_tp_metadata(body_id) + continue + + var tp_meta: TeleportableMeta = _watchlist_teleportables.get(body_id) + var body = instance_from_id(body_id) as Node3D + var last_fw_angle: float = tp_meta.forward + var current_fw_angle: float = forward_distance(body) + + var should_teleport: bool = false + match teleport_direction: + TeleportDirection.FRONT: + should_teleport = last_fw_angle > 0 and current_fw_angle <= 0 + TeleportDirection.BACK: + should_teleport = last_fw_angle < 0 and current_fw_angle >= 0 + TeleportDirection.FRONT_AND_BACK: + should_teleport = sign(last_fw_angle) != sign(current_fw_angle) + _: + assert(false, "This match statement should be exhaustive") + + if should_teleport and abs(current_fw_angle) < teleport_tolerance: + var teleportable_path = body.get_meta(TELEPORT_ROOT_META, ".") + var teleportable: Node3D = body.get_node(teleportable_path) + + teleportable.global_transform = self.to_exit_transform(teleportable.global_transform) + + if teleportable is RigidBody3D: + teleportable.linear_velocity = to_exit_direction(teleportable.linear_velocity) + teleportable.apply_central_impulse( + teleportable.linear_velocity.normalized() * rigidbody_boost + ) + + + on_teleport.emit(teleportable) + exit_portal.on_teleport_receive.emit(teleportable) + + # Force the cameras to refresh if we just teleported a player + var was_player := not str(teleportable.get_path_to(player_camera)).begins_with(".") + if was_player: + _process_cameras() + exit_portal._process_cameras() + + # Resolve teleport interactions + if was_player and _check_tp_interaction(TeleportInteractions.PLAYER_UPRIGHT): + get_tree().create_tween().tween_property(teleportable, "rotation:x", 0, 0.3) + get_tree().create_tween().tween_property(teleportable, "rotation:z", 0, 0.3) + + if _check_tp_interaction(TeleportInteractions.CALLBACK): + if teleportable.has_method(ON_TELEPORT_CALLBACK): + teleportable.call(ON_TELEPORT_CALLBACK, self) + + # transfer the thing to exit portal + _transfer_tp_metadata_to_exit(body) + else: + tp_meta.forward = current_fw_angle + for i in tp_meta.mesh_clones.size(): + var mesh = tp_meta.meshes[i] + var clone = tp_meta.mesh_clones[i] + clone.global_transform = to_exit_transform(mesh.global_transform) + +func _calculate_near_plane() -> float: + # Adjustment for cube portals. This AABB is basically a plane. + var _aabb: AABB = AABB( + Vector3(-exit_portal.portal_size.x / 2, -exit_portal.portal_size.y / 2, 0), + Vector3(exit_portal.portal_size.x, exit_portal.portal_size.y, 0) + ) + var _pos := _aabb.position + var _size := _aabb.size + + var corner_1: Vector3 = exit_portal.to_global(Vector3(_pos.x, _pos.y, 0)) + var corner_2: Vector3 = exit_portal.to_global(Vector3(_pos.x + _size.x, _pos.y, 0)) + var corner_3: Vector3 = exit_portal.to_global(Vector3(_pos.x + _size.x, _pos.y + _size.y, 0)) + var corner_4: Vector3 = exit_portal.to_global(Vector3(_pos.x, _pos.y + _size.y, 0)) + + # Calculate the distance along the exit camera forward vector at which each of the portal + # corners projects + var camera_forward: Vector3 = - portal_camera.global_transform.basis.z.normalized() + + var d_1: float = (corner_1 - portal_camera.global_position).dot(camera_forward) + var d_2: float = (corner_2 - portal_camera.global_position).dot(camera_forward) + var d_3: float = (corner_3 - portal_camera.global_position).dot(camera_forward) + var d_4: float = (corner_4 - portal_camera.global_position).dot(camera_forward) + + # The near clip distance is the shortest distance which still contains all the corners + return max(0.01, min(d_1, d_2, d_3, d_4) - exit_portal.portal_frame_width) + +func _setup_mesh() -> void: + if portal_mesh: + return + + var mi = MeshInstance3D.new() + + mi = MeshInstance3D.new() + mi.name = self.name + "_Mesh" + mi.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + mi.layers = portal_render_layer + + var p := PortalBoxMesh.new() + p.size = Vector3(portal_size.x, portal_size.y, 1) + mi.mesh = p + mi.scale.z = _portal_thickness + + # Editor-only material. Will be replaced when game starts. + mi.material_override = _EDITOR_PREVIEW_PORTAL_MATERIAL + + _add_child_in_editor(self, mi) + _portal_mesh_path = get_path_to(mi) + +func _setup_cameras() -> void: + assert(not Engine.is_editor_hint(), "This should never run in editor") + assert(portal_camera == null) + assert(portal_viewport == null) + + if exit_portal != null: + portal_viewport = SubViewport.new() + portal_viewport.name = self.name + "_SubViewport" + portal_viewport.size = _calculate_viewport_size() + self.add_child(portal_viewport, true) + + # Disable tonemapping on portal cameras + var adjusted_env: Environment = player_camera.environment.duplicate() \ + if player_camera.environment \ + else player_camera.get_world_3d().environment.duplicate() + + adjusted_env.tonemap_mode = Environment.TONE_MAPPER_LINEAR + adjusted_env.tonemap_exposure = 1 + + portal_camera = Camera3D.new() + portal_camera.name = self.name + "_Camera3D" + portal_camera.environment = adjusted_env + + # Ensure that portals don't see other portals. + portal_camera.cull_mask = portal_camera.cull_mask ^ portal_render_layer + + portal_viewport.add_child(portal_camera, true) + portal_camera.global_position = exit_portal.global_position + + # Connect the viewport to the mesh. Mesh material setup has to run BEFORE this + portal_mesh.material_override.set_shader_parameter("albedo", portal_viewport.get_texture()) + else: + push_error("%s has no exit_portal! Failed to setup cameras." % name) + +#endregion + +#region Event handlers + +func _on_teleport_area_entered(area: Area3D) -> void: + if _watchlist_teleportables.has(area.get_instance_id()): + # Already on watchlist + return + + _construct_tp_metadata(area) + +func _on_teleport_body_entered(body: Node3D) -> void: + if _watchlist_teleportables.has(body.get_instance_id()): + # Already on watchlist + return + + _construct_tp_metadata(body) + +func _on_teleport_area_exited(area: Area3D) -> void: + _erase_tp_metadata(area.get_instance_id()) + +func _on_teleport_body_exited(body: Node3D) -> void: + _erase_tp_metadata(body.get_instance_id()) + +func _on_window_resize() -> void: + if portal_viewport: + portal_viewport.size = _calculate_viewport_size() + +#endregion + +#region UTILS + +func _construct_tp_metadata(node: Node3D) -> void: + var meta = TeleportableMeta.new() + meta.forward = forward_distance(node) + + if _check_tp_interaction(TeleportInteractions.DUPLICATE_MESHES) and \ + node.has_method(DUPLICATE_MESHES_CALLBACK): + meta.meshes = node.call(DUPLICATE_MESHES_CALLBACK) + for m: MeshInstance3D in meta.meshes: + var dupe = m.duplicate(0) + dupe.name = m.name + "_Clone" + meta.mesh_clones.append(dupe) + self.add_child(dupe, true) + + _enable_mesh_clipping(meta, self) + + _watchlist_teleportables.set(node.get_instance_id(), meta) + +func _erase_tp_metadata(node_id: int) -> void: + var meta = _watchlist_teleportables.get(node_id) + if meta != null: + meta = meta as TeleportableMeta + for m in meta.meshes: _disable_mesh_clipping(m) + for c in meta.mesh_clones: c.queue_free() + + _watchlist_teleportables.erase(node_id) + +func _enable_mesh_clipping(meta: TeleportableMeta, along_portal: Portal3D) -> void: + for mi: MeshInstance3D in meta.meshes: + var clip_normal = signf(meta.forward) * along_portal.global_basis.z + mi.set_instance_shader_parameter("portal_clip_active", true) + mi.set_instance_shader_parameter("portal_clip_point", along_portal.global_position) + mi.set_instance_shader_parameter("portal_clip_normal", clip_normal) + + var exit = along_portal.exit_portal + for clone: MeshInstance3D in meta.mesh_clones: + var clip_normal = signf(meta.forward) * exit.global_basis.z + clone.set_instance_shader_parameter("portal_clip_active", true) + clone.set_instance_shader_parameter("portal_clip_point", exit.global_position) + clone.set_instance_shader_parameter("portal_clip_normal", clip_normal) + +func _disable_mesh_clipping(mi: MeshInstance3D) -> void: + mi.set_instance_shader_parameter("portal_clip_active", false) + +func _transfer_tp_metadata_to_exit(for_body: Node3D) -> void: + if not exit_portal.is_teleport: + return # One-way teleport scenario + + var body_id = for_body.get_instance_id() + var tp_meta = _watchlist_teleportables[body_id] + if tp_meta == null: + push_error("Attempted to trasfer teleport metadata for a node that is not being watched.") + return + + tp_meta.forward = exit_portal.forward_distance(for_body) + _enable_mesh_clipping(tp_meta, exit_portal) # Switch, the main mesh is clipped by exit portal! + + exit_portal._watchlist_teleportables.set(body_id, tp_meta) + # NOTE: Not using '_erase_tp_metadata' here, as it also frees the cloned meshes! + _watchlist_teleportables.erase(body_id) + +## [b]Crucial[/b] piece of a portal - transforming where objects should appear +## on the other side. Used for both cameras and teleports. +func to_exit_transform(g_transform: Transform3D) -> Transform3D: + var relative_to_portal: Transform3D = global_transform.affine_inverse() * g_transform + var flipped: Transform3D = relative_to_portal.rotated(Vector3.UP, PI) + var relative_to_target = exit_portal.global_transform * flipped + return relative_to_target + + +## Similar to [method to_exit_transform], but this one uses [member global_basis] for calculations, +## so it [b]only transforms rotation[/b], since portal scale should aways be 1. Use for transforming +## directions. +func to_exit_direction(real: Vector3) -> Vector3: + var relative_to_portal: Vector3 = global_basis.inverse() * real + var flipped: Vector3 = relative_to_portal.rotated(Vector3.UP, PI) + var relative_to_target: Vector3 = exit_portal.global_basis * flipped + return relative_to_target + + +## Similar to [method to_exit_transform], but expects a global position. +func to_exit_position(g_pos: Vector3) -> Vector3: + var local: Vector3 = global_transform.affine_inverse() * g_pos + var rotated = local.rotated(Vector3.UP, PI) + var local_at_exit: Vector3 = exit_portal.global_transform * rotated + return local_at_exit + + +## Calculates the dot product of portal's forward vector with the global +## position of [param node] relative to the portal. Used for detecting teleports. +## [br] +## The result is positive when the node is in front of the portal. The value measures how far in +## front (or behind) the other node is compared to the portal. +func forward_distance(node: Node3D) -> float: + var portal_front: Vector3 = self.global_transform.basis.z.normalized() + var node_relative: Vector3 = (node.global_transform.origin - self.global_transform.origin) + return portal_front.dot(node_relative) + +# Helper function meant to be used in editor. Adds [param node] as a child to +# [param parent]. Forces a readable name and sets the child's owner to the same +# as parent's. +func _add_child_in_editor(parent: Node, node: Node) -> void: + parent.add_child(node, true) + # self.owner is null if this node is the scene root. Supply self. + node.owner = self if self.owner == null else self.owner + +# Used to conditionally run property setters. +# [br] +# Setters fire both on editor set and when the scene starts up (the engine is +# assigning exported members). This should prevent the second case. +func _caused_by_user_interaction() -> bool: + return Engine.is_editor_hint() and is_node_ready() + +# Editor helper function. Groups nodes in 3D editor view. +func _group_node(node: Node) -> void: + node.set_meta("_edit_group_", true) + +func _calculate_viewport_size() -> Vector2i: + var vp_size: Vector2i = get_viewport().size + var aspect_ratio: float = float(vp_size.x) / float(vp_size.y) + + match viewport_size_mode: + PortalViewportSizeMode.FULL: + return vp_size + PortalViewportSizeMode.MAX_WIDTH_ABSOLUTE: + var width = min(_viewport_size_max_width_absolute, vp_size.x) + return Vector2i(width, int(width / aspect_ratio)) + PortalViewportSizeMode.FRACTIONAL: + return Vector2i(vp_size * _viewport_size_fractional) + + push_error("Failed to determine desired viewport size") + return Vector2i( + ProjectSettings.get_setting("display/window/size/viewport_width"), + ProjectSettings.get_setting("display/window/size/viewport_height") + ) + +func _check_tp_interaction(flag: int) -> bool: + return (teleport_interactions & flag) > 0 + +## Get a point where the portal plane intersects a line. Line [param start] and [param end] +## are in global coordinates and so is the result. Used for forwarding raycast queries. +func line_intersection(start: Vector3, end: Vector3) -> Vector3: + var plane_normal = - global_basis.z + var plane_point = global_position + + var line_dir = end - start + var denom = plane_normal.dot(line_dir) + + if abs(denom) < 1e-6: + return Vector3.ZERO # No intersection, line is parallel to the plane + + var t = plane_normal.dot(plane_point - start) / denom + return start + line_dir * t + +#endregion + +#region GODOT EDITOR INTEGRATIONS + +func _get_configuration_warnings() -> PackedStringArray: + var warnings: Array[String] = [] + + var global_scale = global_basis.get_scale() + if not global_scale.is_equal_approx(Vector3.ONE): + warnings.append( + ("Portals should NOT be scaled. Global portal scale is %v, " % global_scale) + + "but should be (1.0, 1.0, 1.0). Make sure the portal and any of portal parents " + + "aren't scaled." + ) + + if exit_portal == null: + warnings.append("Exit portal is null") + + if exit_portal != null: + if not portal_size.is_equal_approx(exit_portal.portal_size): + warnings.append( + "Portal size should be the same as exit portal's (it's %s, but should be %s)" % + [portal_size, exit_portal.portal_size] + ) + + return PackedStringArray(warnings) + +func _get_property_list() -> Array[Dictionary]: + var config: Array[Dictionary] = [] + + config.append(AtExport.vector2("portal_size")) + + if exit_portal != null and not portal_size.is_equal_approx(exit_portal.portal_size): + config.append( + AtExport.button("_tb_sync_portal_sizes", "Take Exit Portal's Size", "Vector2")) + + config.append(AtExport.node("exit_portal", "Portal3D")) + + if exit_portal != null and exit_portal.exit_portal == null: + config.append(AtExport.button("_tb_pair_portals", "Pair Portals", "SliderJoint3D")) + + + config.append(AtExport.group("Rendering")) + config.append(AtExport.node("player_camera", "Camera3D")) + config.append(AtExport.float_range("portal_frame_width", 0.0, 10.0, 0.01)) + + config.append(AtExport.enum_( + "viewport_size_mode", &"Portal3D.PortalViewportSizeMode", PortalViewportSizeMode)) + + if viewport_size_mode == PortalViewportSizeMode.MAX_WIDTH_ABSOLUTE: + config.append(AtExport.int_range("_viewport_size_max_width_absolute", 2, 4096)) + elif viewport_size_mode == PortalViewportSizeMode.FRACTIONAL: + config.append(AtExport.float_range("_viewport_size_fractional", 0, 1)) + + config.append(AtExport.enum_("view_direction", &"Portal3D.ViewDirection", ViewDirection)) + + config.append(AtExport.int_render_3d("portal_render_layer")) + + config.append(AtExport.group_end()) + + config.append(AtExport.bool_("is_teleport")) + + if is_teleport: + config.append(AtExport.group("Teleport")) + + config.append( + AtExport.enum_("teleport_direction", &"Portal3D.TeleportDirection", TeleportDirection)) + config.append(AtExport.float_range("rigidbody_boost", 0, 5, 0.1, ["or_greater"])) + config.append(AtExport.float_range("teleport_tolerance", 0.0, 5.0, 0.1, ["or_greater"])) + var opts: Array = TeleportInteractions.keys().map(func(s): return s.capitalize()) + config.append(AtExport.int_flags("teleport_interactions", opts)) + config.append(AtExport.int_physics_3d("teleport_collision_mask")) + config.append(AtExport.group_end()) + + config.append(AtExport.group("Advanced")) + config.append(AtExport.bool_("start_deactivated")) + + return config + +func _property_can_revert(property: StringName) -> bool: + return property in [ + &"portal_size", + &"player_camera", + &"portal_frame_width", + &"_viewport_size_max_width_absolute", + &"view_direction", + &"portal_render_layer", + &"teleport_direction", + &"rigidbody_boost", + &"teleport_tolerance", + &"teleport_interactions", + &"teleport_collision_mask", + &"start_deactivated", + ] + +func _property_get_revert(property: StringName) -> Variant: + match property: + &"portal_size": + return Vector2(2, 2.5) + &"portal_frame_width": + return 0.0 + &"_viewport_size_max_width_absolute": + return ProjectSettings.get_setting("display/window/size/viewport_width") + &"view_direction": + return ViewDirection.FRONT_AND_BACK + &"portal_render_layer": + return 1 << 19 + &"teleport_direction": + return TeleportDirection.FRONT_AND_BACK + &"rigidbody_boost": + return 0.0 + &"teleport_tolerance": + return 0.5 + &"teleport_interactions": + return TeleportInteractions.CALLBACK | TeleportInteractions.PLAYER_UPRIGHT + &"teleport_collision_mask": + return 1 << 15 + &"start_deactivated": + return false + return null + +#endregion diff --git a/addons/portals/scripts/portal_3d.gd.uid b/addons/portals/scripts/portal_3d.gd.uid new file mode 100644 index 0000000..6d527df --- /dev/null +++ b/addons/portals/scripts/portal_3d.gd.uid @@ -0,0 +1 @@ +uid://cw1r4c1d7beyv diff --git a/addons/portals/scripts/portal_boxmesh.gd b/addons/portals/scripts/portal_boxmesh.gd new file mode 100644 index 0000000..984229b --- /dev/null +++ b/addons/portals/scripts/portal_boxmesh.gd @@ -0,0 +1,96 @@ +@tool +extends ArrayMesh +class_name PortalBoxMesh + +## Inverted box with a flipped front side +## +## This mesh class generates a mesh similar to [BoxMesh]. However, its sides are all facing +## [i]inwards[/i], except for the fron side, which is facing outwards. The origin point of this +## mesh is in the middle of its front face, instead of in the center of its volume (like you'd +## expect with a box).[br] +## It is a special mesh built for portal surfaces. The front face provides a nice flat surface and +## the other sides try to reduce clipping issues when traveling through portals. See [Portal3D] + +@export var size: Vector3 = Vector3(1, 1, 1): + set(v): + size = v + generate_portal_mesh() + +func _init() -> void: + if Engine.is_editor_hint(): + generate_portal_mesh() + +func generate_portal_mesh() -> void: + var _start_time: int = Time.get_ticks_usec() + clear_surfaces() # Reset + + var surface_array: Array = [] + surface_array.resize(Mesh.ARRAY_MAX) + + var verts: PackedVector3Array = PackedVector3Array() + var uvs: PackedVector2Array = PackedVector2Array() + var normals: PackedVector3Array = PackedVector3Array() + var indices: PackedInt32Array = PackedInt32Array() + + # Just to save some chars + var w: float = size.x / 2 + var h: float = size.y / 2 + var depth: Vector3 = Vector3(0, 0, -size.z) + + # Outside rect + var TOP_LEFT: Vector3 = Vector3(-w, h, 0) + var TOP_RIGHT: Vector3 = Vector3(w, h, 0) + var BOTTOM_LEFT: Vector3 = Vector3(-w, -h, 0) + var BOTTOM_RIGHT: Vector3 = Vector3(w, -h, 0) + + + verts.append_array([ + TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, + TOP_LEFT + depth, TOP_RIGHT + depth, BOTTOM_LEFT + depth, BOTTOM_RIGHT + depth, + ]) + uvs.append_array([ + Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1), # Front UVs + Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1), # Back UVs (the same) + ]) + + # We are going for a flat-surface look here. Portals should be unshaded anyways. + normals.append_array([ + Vector3.BACK, Vector3.BACK, Vector3.BACK, Vector3.BACK, + Vector3.BACK, Vector3.BACK, Vector3.BACK, Vector3.BACK + ]) + + # 0 ----------- 1 + # | \ / | + # | 4-------5 | + # | | | | + # | | | | + # | 6-------7 | + # | / \ | + # 2 ----------- 3 + + # Triangles are clockwise! + + indices.append_array([ + 0, 1, 4, + 4, 1, 5, # Top section done + 1, 3, 5, + 5, 3, 7, # right section done + 3, 2, 7, + 7, 2, 6, # bottom section done + 2, 0, 6, + 6, 0, 4, # left section done + + 4, 5, 6, + 6, 5, 7, # back section done + + 0, 1, 2, + 2, 1, 3, # front section done + ]) + + surface_array[Mesh.ARRAY_VERTEX] = verts + surface_array[Mesh.ARRAY_TEX_UV] = uvs + surface_array[Mesh.ARRAY_NORMAL] = normals + surface_array[Mesh.ARRAY_INDEX] = indices + + add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array) + diff --git a/addons/portals/scripts/portal_boxmesh.gd.uid b/addons/portals/scripts/portal_boxmesh.gd.uid new file mode 100644 index 0000000..699f53c --- /dev/null +++ b/addons/portals/scripts/portal_boxmesh.gd.uid @@ -0,0 +1 @@ +uid://bxcel82b180o3 diff --git a/addons/portals/scripts/portal_settings.gd b/addons/portals/scripts/portal_settings.gd new file mode 100644 index 0000000..078e552 --- /dev/null +++ b/addons/portals/scripts/portal_settings.gd @@ -0,0 +1,38 @@ +class_name PortalSettings extends Object + +## Static helper class for portal project settings. +## +## Features helper methods for inserting addon-related settings into [ProjectSettings]. +## Used mainly in plugin initialization and for getting defaults in [Portal3D] + +static func _qual_name(setting: String) -> String: + return "addons/portals/" + setting + +## Initializes a setting, it it's not present already. The setting is [i]basic[/i] by default. +static func init_setting(setting: String, + default_value: Variant, + requires_restart: bool = false) -> void: + setting = _qual_name(setting) + + # This would mean the setting is already overriden + if not ProjectSettings.has_setting(setting): + ProjectSettings.set_setting(setting, default_value) + + ProjectSettings.set_initial_value(setting, default_value) + ProjectSettings.set_restart_if_changed(setting, requires_restart) + ProjectSettings.set_as_basic(setting, true) + +## See companion class [class AtExport], it has some utilities which might be helpful! +static func add_info(config: Dictionary) -> void: + var qual_name = _qual_name(config["name"]) + + config["name"] = qual_name + # In case this is coming from AtExport, which is geared towards inspector properties + config.erase("usage") + + ProjectSettings.add_property_info(config) + +## Calls [method ProjectSettings.get_setting] +static func get_setting(setting: String) -> Variant: + setting = _qual_name(setting) + return ProjectSettings.get_setting(setting) diff --git a/addons/portals/scripts/portal_settings.gd.uid b/addons/portals/scripts/portal_settings.gd.uid new file mode 100644 index 0000000..3a04f94 --- /dev/null +++ b/addons/portals/scripts/portal_settings.gd.uid @@ -0,0 +1 @@ +uid://yb4p7f7n5gid diff --git a/addons/proton_scatter/LICENSE b/addons/proton_scatter/LICENSE new file mode 100644 index 0000000..ba6eddb --- /dev/null +++ b/addons/proton_scatter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 HungryProton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/proton_scatter/demos/assets/brick.tscn b/addons/proton_scatter/demos/assets/brick.tscn new file mode 100644 index 0000000..bd15c8a --- /dev/null +++ b/addons/proton_scatter/demos/assets/brick.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=5 format=3 uid="uid://b4ted6l27vuyd"] + +[ext_resource type="PackedScene" uid="uid://d1d1fag0m04yc" path="res://addons/proton_scatter/demos/assets/models/brick.glb" id="1_bkmk2"] +[ext_resource type="Texture2D" uid="uid://dqa2jfs1jy0hq" path="res://addons/proton_scatter/demos/assets/textures/t_rock.jpg" id="2_235bd"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nwvh2"] +albedo_color = Color(0.678431, 0.596078, 0.466667, 1) +albedo_texture = ExtResource("2_235bd") +uv1_scale = Vector3(0.75, 0.75, 0.75) +uv1_triplanar = true + +[sub_resource type="BoxShape3D" id="BoxShape3D_0rrnn"] +size = Vector3(0.4, 0.4, 0.4) + +[node name="brick" instance=ExtResource("1_bkmk2")] + +[node name="Cube" parent="." index="0"] +material_override = SubResource("StandardMaterial3D_nwvh2") + +[node name="StaticBody3D" type="StaticBody3D" parent="." index="1"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"] +shape = SubResource("BoxShape3D_0rrnn") diff --git a/addons/proton_scatter/demos/assets/bush.tscn b/addons/proton_scatter/demos/assets/bush.tscn new file mode 100644 index 0000000..7e0d3a8 --- /dev/null +++ b/addons/proton_scatter/demos/assets/bush.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://b8abs8me7ckgo"] + +[ext_resource type="PackedScene" uid="uid://dbb4culid55v5" path="res://addons/proton_scatter/demos/assets/models/bush.glb" id="1_kv8tm"] +[ext_resource type="Material" uid="uid://bn3fr3m3glrnp" path="res://addons/proton_scatter/demos/assets/materials/m_bush.tres" id="2_bkwoq"] + +[node name="bush" instance=ExtResource("1_kv8tm")] + +[node name="Bush" parent="." index="0"] +material_override = ExtResource("2_bkwoq") +instance_shader_parameters/camera_bend_strength = 0.0 diff --git a/addons/proton_scatter/demos/assets/dead_branch.tscn b/addons/proton_scatter/demos/assets/dead_branch.tscn new file mode 100644 index 0000000..956a667 --- /dev/null +++ b/addons/proton_scatter/demos/assets/dead_branch.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://ctkii8aivl17n"] + +[ext_resource type="PackedScene" uid="uid://cmqlv88xp71tw" path="res://addons/proton_scatter/demos/assets/models/dead_branch.glb" id="1_5foyv"] +[ext_resource type="Material" uid="uid://d01d0h08lqqn6" path="res://addons/proton_scatter/demos/assets/materials/m_trunk.tres" id="2_tldro"] + +[node name="dead_branch" instance=ExtResource("1_5foyv")] + +[node name="DeadBranch" parent="." index="0"] +surface_material_override/0 = ExtResource("2_tldro") diff --git a/addons/proton_scatter/demos/assets/fence_planks.tscn b/addons/proton_scatter/demos/assets/fence_planks.tscn new file mode 100644 index 0000000..7a60b84 --- /dev/null +++ b/addons/proton_scatter/demos/assets/fence_planks.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3 uid="uid://bfcjigq0vdl4d"] + +[ext_resource type="PackedScene" uid="uid://6gxiul1pw13t" path="res://addons/proton_scatter/demos/assets/models/fence_planks.glb" id="1"] +[ext_resource type="Material" path="res://addons/proton_scatter/demos/assets/materials/m_fence.tres" id="2"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_fesk1"] +size = Vector3(1, 0.5, 0.1) + +[node name="fence_planks" instance=ExtResource("1")] + +[node name="fence_planks2" parent="." index="0"] +surface_material_override/0 = ExtResource("2") + +[node name="StaticBody3D" type="StaticBody3D" parent="." index="1"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.197684, 0.0236663) +shape = SubResource("BoxShape3D_fesk1") diff --git a/addons/proton_scatter/demos/assets/gobot.tscn b/addons/proton_scatter/demos/assets/gobot.tscn new file mode 100644 index 0000000..5b005eb --- /dev/null +++ b/addons/proton_scatter/demos/assets/gobot.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://bmglbfn5jaubp"] + +[ext_resource type="PackedScene" uid="uid://d3f4d3m7n8tpr" path="res://addons/proton_scatter/demos/assets/models/gobot.glb" id="1_gfyx7"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rhuea"] +albedo_color = Color(0.278431, 0.54902, 0.74902, 1) +metallic = 0.4 +metallic_specular = 0.2 +roughness = 0.15 +rim_enabled = true +rim = 0.3 + +[node name="gobot" instance=ExtResource("1_gfyx7")] + +[node name="Sphere001" parent="." index="0"] +surface_material_override/0 = SubResource("StandardMaterial3D_rhuea") diff --git a/addons/proton_scatter/demos/assets/grass.tscn b/addons/proton_scatter/demos/assets/grass.tscn new file mode 100644 index 0000000..ccca8a6 --- /dev/null +++ b/addons/proton_scatter/demos/assets/grass.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://c3c76je2y6vfj"] + +[ext_resource type="PackedScene" uid="uid://018flajgtx7t" path="res://addons/proton_scatter/demos/assets/models/grass.glb" id="1_203fe"] +[ext_resource type="Material" uid="uid://c4mot1fo3siox" path="res://addons/proton_scatter/demos/assets/materials/m_grass.tres" id="2_sv1ar"] + +[node name="grass" instance=ExtResource("1_203fe")] + +[node name="Plane_011" parent="." index="0"] +surface_material_override/0 = ExtResource("2_sv1ar") diff --git a/addons/proton_scatter/demos/assets/grass_2.tscn b/addons/proton_scatter/demos/assets/grass_2.tscn new file mode 100644 index 0000000..6810785 --- /dev/null +++ b/addons/proton_scatter/demos/assets/grass_2.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://cia3jakp3wj1d"] + +[ext_resource type="PackedScene" uid="uid://dcnm2ijk7hj4j" path="res://addons/proton_scatter/demos/assets/models/grass_2.glb" id="1_xyqky"] +[ext_resource type="Material" uid="uid://c4mot1fo3siox" path="res://addons/proton_scatter/demos/assets/materials/m_grass.tres" id="2_63qe5"] + +[node name="grass_2" instance=ExtResource("1_xyqky")] + +[node name="Grass" parent="." index="0"] +surface_material_override/0 = ExtResource("2_63qe5") diff --git a/addons/proton_scatter/demos/assets/large_rock.tscn b/addons/proton_scatter/demos/assets/large_rock.tscn new file mode 100644 index 0000000..2234439 --- /dev/null +++ b/addons/proton_scatter/demos/assets/large_rock.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://8ay5rlrutcmx"] + +[ext_resource type="PackedScene" uid="uid://bxqkgplyoipsx" path="res://addons/proton_scatter/demos/assets/models/large_rock.glb" id="1_etns1"] +[ext_resource type="Material" uid="uid://i0jgjmbbl2m5" path="res://addons/proton_scatter/demos/assets/materials/m_rock.tres" id="2_fes1d"] + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_6ssqc"] +data = PackedVector3Array(0.0629, 0.1755, -1.8335, -0.0082, 0.0041, -1.6822, 0.2717, -0.1032, -1.6837, 0.6881, 0.5954, 1.4818, 1.1748, -0.0814, 1.7311, 0.3761, 0.3877, 1.5951, 0.8004, 0.2889, -1.6673, 0.453, 0.787, -1.6234, 0.2234, 0.3394, -1.8428, 0.0438, -0.3535, -1.5059, 0.0958, -0.4313, -1.5075, 0.2334, -0.4206, -1.5131, 1.7542, -0.4854, 0.9086, 1.6573, -0.2166, 1.2501, 1.8018, -0.1166, 1.0465, -0.9001, 0.6982, -1.3812, 0.4904, 0.8361, -0.4902, -1.2997, 0.5397, -0.7858, -1.3066, -0.6146, -0.0152, -1.3934, -0.7148, -0.3785, -1.6779, -0.4855, -0.1607, -1.6422, -0.27, -0.3156, -1.3474, 0.367, -0.2501, -1.5688, -0.3115, 0.1105, 0.7765, -0.6276, -1.2561, 0.9699, -0.5671, -1.2091, 0.6074, -0.5308, -1.4001, -0.9001, 0.6982, -1.3812, -0.534, 0.3122, -1.6595, -0.4893, 0.652, -1.605, 1.5141, -0.6082, 1.2539, 1.502, -0.4979, 1.4563, 1.5644, -0.4551, 1.31, 1.6136, 0.2882, 1.3723, 1.2715, 0.1425, 1.7004, 1.307, 0.4153, 1.6132, -0.0974, 0.1771, -1.7741, -0.0692, 0.1191, -1.7434, -0.0832, 0.1572, -1.7751, -0.0258, 0.0213, -1.688, -0.3113, -0.1613, -1.5779, 0.0157, -0.0532, -1.6436, -0.0864, 0.2978, -1.7808, 0.0784, 0.5885, -1.8004, -0.0895, 0.5831, -1.6991, 1.8072, -0.4701, -0.0799, 1.571, 0.5779, 0.2372, 1.7035, -0.1804, -0.405, 0.7935, 0.8229, -1.3081, 0.9762, 0.8279, -1.1273, 0.6719, 0.9108, -1.1199, -1.2328, -0.714, -0.1886, -1.3066, -0.6146, -0.0152, -1.0843, -0.5896, 0.1569, -1.6727, -0.3783, -0.0804, -1.6583, -0.5073, -0.3071, -1.6422, -0.27, -0.3156, 1.7542, -0.4854, 0.9086, 1.4359, -0.8794, 0.8237, 1.5663, -0.6718, 1.1167, 0.6096, -0.219, -1.5025, 0.6415, -0.1642, -1.5814, 0.2717, -0.1032, -1.6837, -0.0258, 0.0213, -1.688, 0.0157, -0.0532, -1.6436, -0.0082, 0.0041, -1.6822, 0.4631, 0.9672, -1.1988, 0.6719, 0.9108, -1.1199, 0.5883, 0.9628, -1.0063, 1.6466, 0.5513, 1.0625, 1.6113, 0.4774, 1.1526, 1.487, 0.6285, 1.1421, 1.259, -0.746, -0.7881, 0.8809, -0.6144, -1.19, -0.8459, -0.6965, -0.1217, 1.2972, 0.6831, -0.5577, 1.3496, 0.6378, -0.4421, 1.3469, 0.6517, -0.3691, 1.0299, -0.8113, 1.3675, 1.1519, -0.8005, 1.3807, 1.0338, -0.9119, 1.2882, 0.1273, -0.231, -1.5631, 0.2717, -0.1032, -1.6837, 0.0157, -0.0532, -1.6436, 0.0157, -0.0532, -1.6436, 0.2717, -0.1032, -1.6837, -0.0082, 0.0041, -1.6822, -0.0082, 0.0041, -1.6822, 0.0629, 0.1755, -1.8335, -0.0258, 0.0213, -1.688, -0.0258, 0.0213, -1.688, 0.0629, 0.1755, -1.8335, -0.0692, 0.1191, -1.7434, -0.0832, 0.1572, -1.7751, -0.0864, 0.2978, -1.7808, -0.0974, 0.1771, -1.7741, -0.0692, 0.1191, -1.7434, 0.0629, 0.1755, -1.8335, -0.0832, 0.1572, -1.7751, -0.0864, 0.2978, -1.7808, -0.0832, 0.1572, -1.7751, 0.0629, 0.1755, -1.8335, 0.1504, 0.3249, 1.5256, 0.2321, -0.5546, 1.2968, -0.1811, 0.3534, 1.33, -0.1811, 0.3534, 1.33, -0.7713, -0.4525, 0.8629, -0.8882, 0.3173, 0.8972, -0.8882, 0.3173, 0.8972, -0.7713, -0.4525, 0.8629, -1.057, 0.126, 0.9512, -1.057, 0.126, 0.9512, -0.7713, -0.4525, 0.8629, -1.1208, -0.2211, 0.8364, -0.7713, -0.4525, 0.8629, -0.1811, 0.3534, 1.33, 0.2321, -0.5546, 1.2968, 0.2321, -0.5546, 1.2968, 0.5577, -0.3719, 1.5982, 0.5902, -0.5067, 1.4887, 0.6927, -0.351, 1.6834, 1.1748, -0.0814, 1.7311, 1.0161, -0.3973, 1.7034, 0.2321, -0.5546, 1.2968, 0.1504, 0.3249, 1.5256, 0.5577, -0.3719, 1.5982, 0.1504, 0.3249, 1.5256, 0.3761, 0.3877, 1.5951, 0.5577, -0.3719, 1.5982, 0.5577, -0.3719, 1.5982, 0.3761, 0.3877, 1.5951, 0.6927, -0.351, 1.6834, 0.6927, -0.351, 1.6834, 0.3761, 0.3877, 1.5951, 1.1748, -0.0814, 1.7311, 1.1748, -0.0814, 1.7311, 0.6881, 0.5954, 1.4818, 1.2715, 0.1425, 1.7004, 1.2715, 0.1425, 1.7004, 0.6881, 0.5954, 1.4818, 1.307, 0.4153, 1.6132, 1.307, 0.4153, 1.6132, 1.0721, 0.6892, 1.1619, 1.3943, 0.5306, 1.4472, 1.0721, 0.6892, 1.1619, 1.307, 0.4153, 1.6132, 0.6881, 0.5954, 1.4818, 0.5536, 0.8275, -1.4892, 0.7935, 0.8229, -1.3081, 0.606, 0.847, -1.3151, 0.5536, 0.8275, -1.4892, 0.8004, 0.2889, -1.6673, 0.7935, 0.8229, -1.3081, 0.7935, 0.8229, -1.3081, 0.8004, 0.2889, -1.6673, 0.9175, 0.7849, -1.3125, 0.0784, 0.5885, -1.8004, 0.2234, 0.3394, -1.8428, 0.2304, 0.721, -1.7333, 0.2304, 0.721, -1.7333, 0.2234, 0.3394, -1.8428, 0.453, 0.787, -1.6234, 0.453, 0.787, -1.6234, 0.8004, 0.2889, -1.6673, 0.5536, 0.8275, -1.4892, 0.9625, 0.7976, -1.2398, 1.1721, 0.7244, -1.0147, 0.9762, 0.8279, -1.1273, 0.8004, 0.2889, -1.6673, 1.0764, 0.3168, -1.4944, 0.9175, 0.7849, -1.3125, 0.9175, 0.7849, -1.3125, 1.0764, 0.3168, -1.4944, 0.9625, 0.7976, -1.2398, 0.9625, 0.7976, -1.2398, 1.1928, 0.2492, -1.3592, 1.1721, 0.7244, -1.0147, 1.0764, 0.3168, -1.4944, 1.1928, 0.2492, -1.3592, 0.9625, 0.7976, -1.2398, 1.1721, 0.7244, -1.0147, 1.1928, 0.2492, -1.3592, 1.3553, 0.3188, -1.0845, 0.0438, -0.3535, -1.5059, 0.2334, -0.4206, -1.5131, 0.1273, -0.231, -1.5631, 1.8018, -0.1166, 1.0465, 1.6936, -0.0517, 1.195, 1.7358, 0.1659, 1.068, 1.7358, 0.1659, 1.068, 1.6944, 0.1451, 1.1403, 1.7079, 0.2069, 1.098, 1.6936, -0.0517, 1.195, 1.6944, 0.1451, 1.1403, 1.7358, 0.1659, 1.068, 1.6936, -0.0517, 1.195, 1.8018, -0.1166, 1.0465, 1.6573, -0.2166, 1.2501, 1.6573, -0.2166, 1.2501, 1.7542, -0.4854, 0.9086, 1.5644, -0.4551, 1.31, 1.7542, -0.4854, 0.9086, 1.5663, -0.6718, 1.1167, 1.5644, -0.4551, 1.31, 1.5644, -0.4551, 1.31, 1.5663, -0.6718, 1.1167, 1.5141, -0.6082, 1.2539, 0.3565, 0.8862, -1.3307, 0.5536, 0.8275, -1.4892, 0.606, 0.847, -1.3151, 0.5536, 0.8275, -1.4892, 0.3565, 0.8862, -1.3307, 0.453, 0.787, -1.6234, 0.453, 0.787, -1.6234, 0.3565, 0.8862, -1.3307, 0.2304, 0.721, -1.7333, 0.2304, 0.721, -1.7333, -0.0895, 0.5831, -1.6991, 0.0784, 0.5885, -1.8004, -0.2181, 0.7012, -1.5976, -0.9001, 0.6982, -1.3812, -0.4893, 0.652, -1.605, 0.2304, 0.721, -1.7333, 0.3565, 0.8862, -1.3307, -0.0895, 0.5831, -1.6991, -0.0895, 0.5831, -1.6991, 0.3565, 0.8862, -1.3307, -0.2181, 0.7012, -1.5976, 0.5883, 0.9628, -1.0063, 0.4904, 0.8361, -0.4902, 0.4631, 0.9672, -1.1988, 0.4631, 0.9672, -1.1988, 0.4904, 0.8361, -0.4902, 0.3565, 0.8862, -1.3307, 0.3127, 0.6878, 0.2041, -1.2997, 0.5397, -0.7858, 0.4904, 0.8361, -0.4902, 1.0721, 0.6892, 1.1619, 0.6881, 0.5954, 1.4818, 0.6961, 0.7351, 0.3218, 0.6961, 0.7351, 0.3218, 0.6881, 0.5954, 1.4818, 0.3127, 0.6878, 0.2041, 0.3761, 0.3877, 1.5951, 0.1504, 0.3249, 1.5256, 0.6881, 0.5954, 1.4818, -0.1811, 0.3534, 1.33, 0.3127, 0.6878, 0.2041, 0.1504, 0.3249, 1.5256, 0.3127, 0.6878, 0.2041, 0.6881, 0.5954, 1.4818, 0.1504, 0.3249, 1.5256, -1.2352, 0.3268, 0.2088, 0.3127, 0.6878, 0.2041, -0.8882, 0.3173, 0.8972, -0.8882, 0.3173, 0.8972, 0.3127, 0.6878, 0.2041, -0.1811, 0.3534, 1.33, -1.2997, 0.5397, -0.7858, 0.3127, 0.6878, 0.2041, -1.3474, 0.367, -0.2501, -1.3474, 0.367, -0.2501, 0.3127, 0.6878, 0.2041, -1.2352, 0.3268, 0.2088, -0.9001, 0.6982, -1.3812, -1.2997, 0.5397, -0.7858, -1.1636, 0.6589, -1.169, -0.2181, 0.7012, -1.5976, 0.4904, 0.8361, -0.4902, -0.9001, 0.6982, -1.3812, 0.3565, 0.8862, -1.3307, 0.4904, 0.8361, -0.4902, -0.2181, 0.7012, -1.5976, -1.1208, -0.2211, 0.8364, -1.0843, -0.5896, 0.1569, -1.4177, -0.2864, 0.367, -1.4177, -0.2864, 0.367, -1.3066, -0.6146, -0.0152, -1.5688, -0.3115, 0.1105, -1.0843, -0.5896, 0.1569, -1.3066, -0.6146, -0.0152, -1.4177, -0.2864, 0.367, -1.5688, -0.3115, 0.1105, -1.3066, -0.6146, -0.0152, -1.6727, -0.3783, -0.0804, -1.6727, -0.3783, -0.0804, -1.3066, -0.6146, -0.0152, -1.6779, -0.4855, -0.1607, -1.6779, -0.4855, -0.1607, -1.3934, -0.7148, -0.3785, -1.6583, -0.5073, -0.3071, -1.6583, -0.5073, -0.3071, -1.3934, -0.7148, -0.3785, -1.5776, -0.5652, -0.4479, -1.5776, -0.5652, -0.4479, -1.3934, -0.7148, -0.3785, -1.4282, -0.6229, -0.5707, -1.3934, -0.7148, -0.3785, -1.3066, -0.6146, -0.0152, -1.2328, -0.714, -0.1886, -1.0843, -0.5896, 0.1569, -1.1208, -0.2211, 0.8364, -0.7713, -0.4525, 0.8629, -1.4177, -0.2864, 0.367, -1.2352, 0.3268, 0.2088, -1.1208, -0.2211, 0.8364, -1.1208, -0.2211, 0.8364, -1.2352, 0.3268, 0.2088, -1.057, 0.126, 0.9512, -1.057, 0.126, 0.9512, -1.2352, 0.3268, 0.2088, -0.8882, 0.3173, 0.8972, -1.2352, 0.3268, 0.2088, -1.5688, -0.3115, 0.1105, -1.3474, 0.367, -0.2501, -1.5688, -0.3115, 0.1105, -1.2352, 0.3268, 0.2088, -1.4177, -0.2864, 0.367, -1.6422, -0.27, -0.3156, -1.5688, -0.3115, 0.1105, -1.6727, -0.3783, -0.0804, -1.387, 0.0341, -0.9932, -1.2997, 0.5397, -0.7858, -1.4997, -0.1393, -0.7307, -1.4997, -0.1393, -0.7307, -1.3474, 0.367, -0.2501, -1.6422, -0.27, -0.3156, -1.2722, 0.4609, -1.2479, -1.387, 0.0341, -0.9932, -1.1493, 0.3036, -1.3146, -1.1636, 0.6589, -1.169, -1.2997, 0.5397, -0.7858, -1.2362, 0.5774, -1.237, -1.2362, 0.5774, -1.237, -1.2997, 0.5397, -0.7858, -1.2722, 0.4609, -1.2479, -1.2722, 0.4609, -1.2479, -1.2997, 0.5397, -0.7858, -1.387, 0.0341, -0.9932, -1.4997, -0.1393, -0.7307, -1.2997, 0.5397, -0.7858, -1.3474, 0.367, -0.2501, 1.1928, 0.2492, -1.3592, 1.0502, -0.6021, -1.1682, 1.3553, 0.3188, -1.0845, 1.3553, 0.3188, -1.0845, 1.259, -0.746, -0.7881, 1.7035, -0.1804, -0.405, 1.3553, 0.3188, -1.0845, 1.1109, -0.6863, -1.0196, 1.259, -0.746, -0.7881, 1.7035, -0.1804, -0.405, 1.5814, -0.7117, -0.4108, 1.8072, -0.4701, -0.0799, 1.8072, -0.4701, -0.0799, 1.6645, -0.7082, -0.1973, 1.7652, -0.6177, 0.216, 1.5814, -0.7117, -0.4108, 1.6645, -0.7082, -0.1973, 1.8072, -0.4701, -0.0799, 1.7652, -0.6177, 0.216, 1.6645, -0.7082, -0.1973, 1.6461, -0.7592, 0.1617, 1.436, -0.7221, -0.624, 1.5814, -0.7117, -0.4108, 1.7035, -0.1804, -0.405, 0.8004, 0.2889, -1.6673, 0.6415, -0.1642, -1.5814, 1.0764, 0.3168, -1.4944, 1.0764, 0.3168, -1.4944, 0.6415, -0.1642, -1.5814, 1.1928, 0.2492, -1.3592, 0.6415, -0.1642, -1.5814, 0.6096, -0.219, -1.5025, 1.1928, 0.2492, -1.3592, 0.0629, 0.1755, -1.8335, 0.2717, -0.1032, -1.6837, 0.2234, 0.3394, -1.8428, 0.2234, 0.3394, -1.8428, 0.2717, -0.1032, -1.6837, 0.8004, 0.2889, -1.6673, 0.6415, -0.1642, -1.5814, 0.8004, 0.2889, -1.6673, 0.2717, -0.1032, -1.6837, 0.2334, -0.4206, -1.5131, 0.6096, -0.219, -1.5025, 0.1273, -0.231, -1.5631, 0.6074, -0.5308, -1.4001, 0.6096, -0.219, -1.5025, 0.2334, -0.4206, -1.5131, 1.7035, -0.1804, -0.405, 1.259, -0.746, -0.7881, 1.436, -0.7221, -0.624, 1.1928, 0.2492, -1.3592, 0.9699, -0.5671, -1.2091, 1.0502, -0.6021, -1.1682, 1.1109, -0.6863, -1.0196, 1.3553, 0.3188, -1.0845, 1.0502, -0.6021, -1.1682, 0.6074, -0.5308, -1.4001, 0.9699, -0.5671, -1.2091, 0.6096, -0.219, -1.5025, 0.9699, -0.5671, -1.2091, 1.1928, 0.2492, -1.3592, 0.6096, -0.219, -1.5025, 0.8809, -0.6144, -1.19, 0.9699, -0.5671, -1.2091, 0.7765, -0.6276, -1.2561, -0.534, 0.3122, -1.6595, -0.9001, 0.6982, -1.3812, -1.1493, 0.3036, -1.3146, -1.1493, 0.3036, -1.3146, -1.2362, 0.5774, -1.237, -1.2722, 0.4609, -1.2479, -0.9001, 0.6982, -1.3812, -1.2362, 0.5774, -1.237, -1.1493, 0.3036, -1.3146, -1.2362, 0.5774, -1.237, -0.9001, 0.6982, -1.3812, -1.1636, 0.6589, -1.169, 1.502, -0.4979, 1.4563, 1.5141, -0.6082, 1.2539, 1.3317, -0.6356, 1.518, 1.3317, -0.6356, 1.518, 1.5141, -0.6082, 1.2539, 1.2689, -0.7439, 1.3995, 1.2689, -0.7439, 1.3995, 1.124, -0.9978, 1.0499, 1.1519, -0.8005, 1.3807, 1.1519, -0.8005, 1.3807, 1.124, -0.9978, 1.0499, 1.0338, -0.9119, 1.2882, 1.0338, -0.9119, 1.2882, 1.124, -0.9978, 1.0499, 1.0169, -0.9992, 1.153, 1.124, -0.9978, 1.0499, 1.5663, -0.6718, 1.1167, 1.2368, -0.9984, 0.9293, 1.2368, -0.9984, 0.9293, 1.5663, -0.6718, 1.1167, 1.4359, -0.8794, 0.8237, 1.5663, -0.6718, 1.1167, 1.2689, -0.7439, 1.3995, 1.5141, -0.6082, 1.2539, 1.124, -0.9978, 1.0499, 1.2689, -0.7439, 1.3995, 1.5663, -0.6718, 1.1167, 1.2715, 0.1425, 1.7004, 1.6307, -0.0932, 1.3908, 1.1748, -0.0814, 1.7311, 1.1748, -0.0814, 1.7311, 1.1624, -0.5844, 1.6321, 1.0161, -0.3973, 1.7034, 1.502, -0.4979, 1.4563, 1.3317, -0.6356, 1.518, 1.1624, -0.5844, 1.6321, 1.1748, -0.0814, 1.7311, 1.502, -0.4979, 1.4563, 1.1624, -0.5844, 1.6321, 1.502, -0.4979, 1.4563, 1.1748, -0.0814, 1.7311, 1.5954, -0.2805, 1.4511, 1.5954, -0.2805, 1.4511, 1.1748, -0.0814, 1.7311, 1.6307, -0.0932, 1.3908, 1.6307, -0.0932, 1.3908, 1.2715, 0.1425, 1.7004, 1.6136, 0.2882, 1.3723, 1.6136, 0.2882, 1.3723, 1.307, 0.4153, 1.6132, 1.3943, 0.5306, 1.4472, -0.534, 0.3122, -1.6595, -0.2181, 0.7012, -1.5976, -0.4893, 0.652, -1.605, -0.2181, 0.7012, -1.5976, -0.534, 0.3122, -1.6595, -0.0895, 0.5831, -1.6991, -0.0895, 0.5831, -1.6991, -0.534, 0.3122, -1.6595, -0.0864, 0.2978, -1.7808, -0.0974, 0.1771, -1.7741, -0.3113, -0.1613, -1.5779, -0.0692, 0.1191, -1.7434, -0.0692, 0.1191, -1.7434, -0.3113, -0.1613, -1.5779, -0.0258, 0.0213, -1.688, -0.0864, 0.2978, -1.7808, -0.534, 0.3122, -1.6595, -0.0974, 0.1771, -1.7741, -0.3113, -0.1613, -1.5779, -0.0974, 0.1771, -1.7741, -0.534, 0.3122, -1.6595, 0.0157, -0.0532, -1.6436, -0.3113, -0.1613, -1.5779, 0.1273, -0.231, -1.5631, 0.0784, 0.5885, -1.8004, -0.0864, 0.2978, -1.7808, 0.2234, 0.3394, -1.8428, 0.2234, 0.3394, -1.8428, -0.0864, 0.2978, -1.7808, 0.0629, 0.1755, -1.8335, 1.7035, -0.1804, -0.405, 1.3496, 0.6378, -0.4421, 1.3553, 0.3188, -1.0845, 1.3553, 0.3188, -1.0845, 1.2972, 0.6831, -0.5577, 1.1721, 0.7244, -1.0147, 1.3496, 0.6378, -0.4421, 1.2972, 0.6831, -0.5577, 1.3553, 0.3188, -1.0845, 1.3496, 0.6378, -0.4421, 1.5036, 0.5972, -0.0994, 1.3469, 0.6517, -0.3691, 1.571, 0.5779, 0.2372, 1.8018, -0.1166, 1.0465, 1.5632, 0.6125, 0.4668, 1.5632, 0.6125, 0.4668, 1.6466, 0.5513, 1.0625, 1.559, 0.6543, 0.9634, 1.5632, 0.6125, 0.4668, 1.7358, 0.1659, 1.068, 1.6466, 0.5513, 1.0625, 1.7358, 0.1659, 1.068, 1.7079, 0.2069, 1.098, 1.6466, 0.5513, 1.0625, 1.6466, 0.5513, 1.0625, 1.7079, 0.2069, 1.098, 1.6113, 0.4774, 1.1526, 1.6113, 0.4774, 1.1526, 1.7079, 0.2069, 1.098, 1.6616, 0.3586, 1.2649, 1.6616, 0.3586, 1.2649, 1.6944, 0.1451, 1.1403, 1.6136, 0.2882, 1.3723, 1.6136, 0.2882, 1.3723, 1.6944, 0.1451, 1.1403, 1.6307, -0.0932, 1.3908, 1.6307, -0.0932, 1.3908, 1.6573, -0.2166, 1.2501, 1.5954, -0.2805, 1.4511, 1.5954, -0.2805, 1.4511, 1.5644, -0.4551, 1.31, 1.502, -0.4979, 1.4563, 1.6573, -0.2166, 1.2501, 1.5644, -0.4551, 1.31, 1.5954, -0.2805, 1.4511, 1.6573, -0.2166, 1.2501, 1.6307, -0.0932, 1.3908, 1.6936, -0.0517, 1.195, 1.6936, -0.0517, 1.195, 1.6307, -0.0932, 1.3908, 1.6944, 0.1451, 1.1403, 1.5036, 0.5972, -0.0994, 1.7035, -0.1804, -0.405, 1.571, 0.5779, 0.2372, 1.6616, 0.3586, 1.2649, 1.7079, 0.2069, 1.098, 1.6944, 0.1451, 1.1403, 1.5632, 0.6125, 0.4668, 1.8018, -0.1166, 1.0465, 1.7358, 0.1659, 1.068, 1.8018, -0.1166, 1.0465, 1.7652, -0.6177, 0.216, 1.7542, -0.4854, 0.9086, 1.7652, -0.6177, 0.216, 1.8018, -0.1166, 1.0465, 1.571, 0.5779, 0.2372, 1.3496, 0.6378, -0.4421, 1.7035, -0.1804, -0.405, 1.5036, 0.5972, -0.0994, 1.571, 0.5779, 0.2372, 1.8072, -0.4701, -0.0799, 1.7652, -0.6177, 0.216, 1.487, 0.6285, 1.1421, 1.0721, 0.6892, 1.1619, 1.559, 0.6543, 0.9634, 1.559, 0.6543, 0.9634, 1.0721, 0.6892, 1.1619, 1.5632, 0.6125, 0.4668, 1.5632, 0.6125, 0.4668, 0.6961, 0.7351, 0.3218, 1.571, 0.5779, 0.2372, 1.571, 0.5779, 0.2372, 0.6961, 0.7351, 0.3218, 1.5036, 0.5972, -0.0994, 1.5036, 0.5972, -0.0994, 0.6961, 0.7351, 0.3218, 1.3469, 0.6517, -0.3691, 1.6616, 0.3586, 1.2649, 1.6136, 0.2882, 1.3723, 1.6113, 0.4774, 1.1526, 1.6113, 0.4774, 1.1526, 1.6136, 0.2882, 1.3723, 1.487, 0.6285, 1.1421, 1.2972, 0.6831, -0.5577, 0.4904, 0.8361, -0.4902, 1.1721, 0.7244, -1.0147, 1.1721, 0.7244, -1.0147, 0.4904, 0.8361, -0.4902, 0.9762, 0.8279, -1.1273, 1.5632, 0.6125, 0.4668, 1.0721, 0.6892, 1.1619, 0.6961, 0.7351, 0.3218, 1.3469, 0.6517, -0.3691, 0.4904, 0.8361, -0.4902, 1.2972, 0.6831, -0.5577, 0.6961, 0.7351, 0.3218, 0.4904, 0.8361, -0.4902, 1.3469, 0.6517, -0.3691, 1.0721, 0.6892, 1.1619, 1.487, 0.6285, 1.1421, 1.3943, 0.5306, 1.4472, 1.3943, 0.5306, 1.4472, 1.487, 0.6285, 1.1421, 1.6136, 0.2882, 1.3723, 0.4904, 0.8361, -0.4902, 0.6961, 0.7351, 0.3218, 0.3127, 0.6878, 0.2041, 0.5883, 0.9628, -1.0063, 0.9762, 0.8279, -1.1273, 0.4904, 0.8361, -0.4902, 0.7935, 0.8229, -1.3081, 0.6719, 0.9108, -1.1199, 0.606, 0.847, -1.3151, 0.6719, 0.9108, -1.1199, 0.9762, 0.8279, -1.1273, 0.5883, 0.9628, -1.0063, 0.9762, 0.8279, -1.1273, 0.7935, 0.8229, -1.3081, 0.9625, 0.7976, -1.2398, 0.9625, 0.7976, -1.2398, 0.7935, 0.8229, -1.3081, 0.9175, 0.7849, -1.3125, -1.2328, -0.714, -0.1886, -1.0843, -0.5896, 0.1569, -0.8459, -0.6965, -0.1217, -1.1493, 0.3036, -1.3146, -0.8122, -0.4144, -1.2617, -0.534, 0.3122, -1.6595, -0.534, 0.3122, -1.6595, -0.8122, -0.4144, -1.2617, -0.3113, -0.1613, -1.5779, -0.8122, -0.4144, -1.2617, -1.387, 0.0341, -0.9932, -1.1401, -0.5073, -0.9935, -1.1493, 0.3036, -1.3146, -1.387, 0.0341, -0.9932, -0.8122, -0.4144, -1.2617, -1.1401, -0.5073, -0.9935, -1.4997, -0.1393, -0.7307, -1.4282, -0.6229, -0.5707, -1.4282, -0.6229, -0.5707, -1.4997, -0.1393, -0.7307, -1.5776, -0.5652, -0.4479, -1.6583, -0.5073, -0.3071, -1.6727, -0.3783, -0.0804, -1.6779, -0.4855, -0.1607, -1.5776, -0.5652, -0.4479, -1.6422, -0.27, -0.3156, -1.6583, -0.5073, -0.3071, -1.4997, -0.1393, -0.7307, -1.6422, -0.27, -0.3156, -1.5776, -0.5652, -0.4479, -1.4997, -0.1393, -0.7307, -1.1401, -0.5073, -0.9935, -1.387, 0.0341, -0.9932, 1.6461, -0.7592, 0.1617, 1.4359, -0.8794, 0.8237, 1.7652, -0.6177, 0.216, 1.7652, -0.6177, 0.216, 1.4359, -0.8794, 0.8237, 1.7542, -0.4854, 0.9086, 0.6096, -0.219, -1.5025, 0.2717, -0.1032, -1.6837, 0.1273, -0.231, -1.5631, 0.6719, 0.9108, -1.1199, 0.4631, 0.9672, -1.1988, 0.606, 0.847, -1.3151, 0.606, 0.847, -1.3151, 0.4631, 0.9672, -1.1988, 0.3565, 0.8862, -1.3307, 1.6466, 0.5513, 1.0625, 1.487, 0.6285, 1.1421, 1.559, 0.6543, 0.9634, 1.1624, -0.5844, 1.6321, 1.0299, -0.8113, 1.3675, 1.0161, -0.3973, 1.7034, 1.0161, -0.3973, 1.7034, 1.0299, -0.8113, 1.3675, 0.6927, -0.351, 1.6834, 0.6927, -0.351, 1.6834, 0.5902, -0.5067, 1.4887, 0.5577, -0.3719, 1.5982, 0.2321, -0.5546, 1.2968, -0.8459, -0.6965, -0.1217, -0.7713, -0.4525, 0.8629, -0.7713, -0.4525, 0.8629, -0.8459, -0.6965, -0.1217, -1.0843, -0.5896, 0.1569, 0.6927, -0.351, 1.6834, 1.0299, -0.8113, 1.3675, 0.5902, -0.5067, 1.4887, 0.5902, -0.5067, 1.4887, 1.0169, -0.9992, 1.153, 0.2321, -0.5546, 1.2968, -0.8459, -0.6965, -0.1217, -1.3934, -0.7148, -0.3785, -1.2328, -0.714, -0.1886, 0.2321, -0.5546, 1.2968, 1.259, -0.746, -0.7881, -0.8459, -0.6965, -0.1217, 1.2368, -0.9984, 0.9293, 1.259, -0.746, -0.7881, 0.2321, -0.5546, 1.2968, 1.3317, -0.6356, 1.518, 1.1519, -0.8005, 1.3807, 1.1624, -0.5844, 1.6321, 1.1519, -0.8005, 1.3807, 1.3317, -0.6356, 1.518, 1.2689, -0.7439, 1.3995, 1.0169, -0.9992, 1.153, 0.5902, -0.5067, 1.4887, 1.0338, -0.9119, 1.2882, 1.0338, -0.9119, 1.2882, 0.5902, -0.5067, 1.4887, 1.0299, -0.8113, 1.3675, 1.0299, -0.8113, 1.3675, 1.1624, -0.5844, 1.6321, 1.1519, -0.8005, 1.3807, -0.8459, -0.6965, -0.1217, -1.4282, -0.6229, -0.5707, -1.3934, -0.7148, -0.3785, -1.4282, -0.6229, -0.5707, -0.8459, -0.6965, -0.1217, -1.1401, -0.5073, -0.9935, -1.1401, -0.5073, -0.9935, -0.8459, -0.6965, -0.1217, -0.8122, -0.4144, -1.2617, -0.8122, -0.4144, -1.2617, 0.0438, -0.3535, -1.5059, -0.3113, -0.1613, -1.5779, -0.3113, -0.1613, -1.5779, 0.0438, -0.3535, -1.5059, 0.1273, -0.231, -1.5631, 1.2368, -0.9984, 0.9293, 0.2321, -0.5546, 1.2968, 1.124, -0.9978, 1.0499, 1.124, -0.9978, 1.0499, 0.2321, -0.5546, 1.2968, 1.0169, -0.9992, 1.153, -0.8459, -0.6965, -0.1217, 0.0438, -0.3535, -1.5059, -0.8122, -0.4144, -1.2617, 0.0958, -0.4313, -1.5075, 0.0438, -0.3535, -1.5059, -0.8459, -0.6965, -0.1217, 0.0958, -0.4313, -1.5075, 0.6074, -0.5308, -1.4001, 0.2334, -0.4206, -1.5131, 0.0958, -0.4313, -1.5075, 0.7765, -0.6276, -1.2561, 0.6074, -0.5308, -1.4001, -0.8459, -0.6965, -0.1217, 0.7765, -0.6276, -1.2561, 0.0958, -0.4313, -1.5075, 1.6461, -0.7592, 0.1617, 1.2368, -0.9984, 0.9293, 1.4359, -0.8794, 0.8237, 1.5814, -0.7117, -0.4108, 1.6461, -0.7592, 0.1617, 1.6645, -0.7082, -0.1973, 1.259, -0.746, -0.7881, 1.6461, -0.7592, 0.1617, 1.436, -0.7221, -0.624, 1.436, -0.7221, -0.624, 1.6461, -0.7592, 0.1617, 1.5814, -0.7117, -0.4108, 0.9699, -0.5671, -1.2091, 0.8809, -0.6144, -1.19, 1.0502, -0.6021, -1.1682, 1.0502, -0.6021, -1.1682, 0.8809, -0.6144, -1.19, 1.1109, -0.6863, -1.0196, 1.1109, -0.6863, -1.0196, 0.8809, -0.6144, -1.19, 1.259, -0.746, -0.7881, 0.7765, -0.6276, -1.2561, -0.8459, -0.6965, -0.1217, 0.8809, -0.6144, -1.19, 1.259, -0.746, -0.7881, 1.2368, -0.9984, 0.9293, 1.6461, -0.7592, 0.1617) + +[node name="large_rock" instance=ExtResource("1_etns1")] + +[node name="LargeRock" parent="." index="0"] +surface_material_override/0 = ExtResource("2_fes1d") + +[node name="StaticBody3D" type="StaticBody3D" parent="LargeRock" index="0"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LargeRock/StaticBody3D" index="0"] +shape = SubResource("ConcavePolygonShape3D_6ssqc") diff --git a/addons/proton_scatter/demos/assets/materials/grass.gdshader b/addons/proton_scatter/demos/assets/materials/grass.gdshader new file mode 100644 index 0000000..9850b66 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/grass.gdshader @@ -0,0 +1,62 @@ +shader_type spatial; + +render_mode depth_draw_opaque, cull_disabled; + +// Texture settings +uniform sampler2D texture_albedo : hint_default_white, repeat_disable; +uniform sampler2D texture_gradient : hint_default_white, repeat_disable; +uniform sampler2D texture_noise : hint_default_white; +uniform float alpha_scissor_threshold : hint_range(0.0, 1.0); +uniform vec4 transmission : source_color; +uniform vec4 secondary_color : source_color; +uniform float secondary_attenuation = 0.2; +uniform float grass_height = 1.0; + +// Wind settings +uniform vec2 wind_direction = vec2(1, -0.5); +uniform float wind_speed = 1.0; +uniform float wind_strength = 2.0; +uniform float noise_scale = 20.0; + +instance uniform float camera_bend_strength : hint_range(0.0, 3.0) = 0.2; + +varying float color; +varying float height; + +void vertex() { + height = VERTEX.y; + float influence = smoothstep(0, 1, height / 2.0); + vec4 world_pos = MODEL_MATRIX * vec4(VERTEX, 1.0); + vec2 uv = world_pos.xz / (noise_scale + 1e-2); + vec2 panning_uv = uv + fract(TIME * wind_direction * wind_speed); + float wind = texture(texture_noise, panning_uv).r * 2.0 - 0.4; + color = texture(texture_noise, uv).r; + + vec2 wind_offset = -wind_direction * wind_strength * influence * wind; + world_pos.xz += wind_offset; + world_pos.y -= wind * influence * smoothstep(0.0, height, wind_strength); + + //Push the top vertex away from the camera to bend the grass clump + float ndotv = 1.0 - dot(vec3(0.0, 1.0, 0.0), normalize(INV_VIEW_MATRIX[1].xyz)); + world_pos.xz += INV_VIEW_MATRIX[1].xz * camera_bend_strength * height * ndotv; + + vec4 local_pos = inverse(MODEL_MATRIX) * world_pos; + local_pos.x += wind_strength * influence * cos(TIME * 1.0) / 8.0; + local_pos.z += wind_strength * influence * sin(TIME * 1.5) / 8.0; + + VERTEX = local_pos.xyz; + //NORMAL = vec3(0.0, 1.0, 0.0); +} + +void fragment() { + vec4 tex = texture(texture_albedo, UV); + if (tex.a < alpha_scissor_threshold) { + discard; + } + + BACKLIGHT = transmission.rgb; + vec4 gradient = texture(texture_gradient, vec2(height / grass_height, 0.0)); + float secondary_weight = smoothstep(0.0, 1.0, color - secondary_attenuation); + ALBEDO = tex.rbg * gradient.rgb; + //ALBEDO = mix(ALBEDO, secondary_color.rgb, secondary_weight); +} diff --git a/addons/proton_scatter/demos/assets/materials/grass.gdshader.uid b/addons/proton_scatter/demos/assets/materials/grass.gdshader.uid new file mode 100644 index 0000000..5dd7f23 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/grass.gdshader.uid @@ -0,0 +1 @@ +uid://cktbgarifkbc8 diff --git a/addons/proton_scatter/demos/assets/materials/leaves.gdshader b/addons/proton_scatter/demos/assets/materials/leaves.gdshader new file mode 100644 index 0000000..98b7df6 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/leaves.gdshader @@ -0,0 +1,51 @@ +shader_type spatial; + +render_mode depth_draw_opaque, cull_disabled; + +// Texture settings +uniform sampler2D texture_albedo : hint_default_white, repeat_disable; +uniform sampler2D texture_gradient : hint_default_white; +uniform sampler2D texture_noise : hint_default_white; +uniform float alpha_scissor_threshold : hint_range(0.0, 1.0); +uniform vec4 transmission : source_color; +uniform float total_height = 1.0; + +// Wind settings +uniform vec2 wind_direction = vec2(1, -0.5); +uniform float wind_speed = 1.0; +uniform float wind_strength = 2.0; +uniform float noise_scale = 20.0; + +varying float color; +varying float height; + +void vertex() { + height = VERTEX.y; + + vec4 world_pos = MODEL_MATRIX * vec4(VERTEX, 1.0); + vec2 uv = (world_pos.xz + VERTEX.yy) / (noise_scale + 1e-2) ; + vec2 panning_uv = uv + fract(TIME * wind_direction * wind_speed); + float wind = texture(texture_noise, panning_uv).r * 2.0 - 0.4; + color = texture(texture_noise, uv).r; + + float wind_influence = smoothstep(0, 1, 1.0 - UV.y); + vec2 wind_offset = -wind_direction * wind_strength * wind_influence * wind; + world_pos.xz += wind_offset; + world_pos.y -= wind * wind_influence * wind_strength * 0.45; + + vec4 local_pos = inverse(MODEL_MATRIX) * world_pos; + + VERTEX = local_pos.xyz; + //NORMAL = vec3(0.0, 1.0, 0.0); +} + +void fragment() { + vec4 tex = texture(texture_albedo, UV); + if (tex.a < alpha_scissor_threshold) { + discard; + } + + BACKLIGHT = transmission.rgb; + vec4 gradient = texture(texture_gradient, vec2(height / total_height, 0.0)); + ALBEDO = tex.rbg * gradient.rgb; +} diff --git a/addons/proton_scatter/demos/assets/materials/leaves.gdshader.uid b/addons/proton_scatter/demos/assets/materials/leaves.gdshader.uid new file mode 100644 index 0000000..556ccaa --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/leaves.gdshader.uid @@ -0,0 +1 @@ +uid://bv00dvm0n7u46 diff --git a/addons/proton_scatter/demos/assets/materials/m_bush.tres b/addons/proton_scatter/demos/assets/materials/m_bush.tres new file mode 100644 index 0000000..1aa74a1 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_bush.tres @@ -0,0 +1,37 @@ +[gd_resource type="ShaderMaterial" load_steps=7 format=3 uid="uid://bn3fr3m3glrnp"] + +[ext_resource type="Shader" uid="uid://cktbgarifkbc8" path="res://addons/proton_scatter/demos/assets/materials/grass.gdshader" id="1_peshr"] +[ext_resource type="Texture2D" uid="uid://b2a6ylo2enm4g" path="res://addons/proton_scatter/demos/assets/textures/t_bush.png" id="2_mbhvd"] + +[sub_resource type="Gradient" id="Gradient_122hb"] +offsets = PackedFloat32Array(0, 0.5, 1) +colors = PackedColorArray(0.179688, 0.0759602, 0.0183228, 1, 0.386532, 0.390625, 0.0230687, 1, 1, 0.693237, 0.0687054, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_i0bw2"] +gradient = SubResource("Gradient_122hb") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_eeqpx"] +seed = 1 +frequency = 0.002 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_7l0n1"] +in_3d_space = true +seamless = true +seamless_blend_skirt = 0.65 +noise = SubResource("FastNoiseLite_eeqpx") + +[resource] +render_priority = 0 +shader = ExtResource("1_peshr") +shader_parameter/texture_albedo = ExtResource("2_mbhvd") +shader_parameter/texture_gradient = SubResource("GradientTexture1D_i0bw2") +shader_parameter/texture_noise = SubResource("NoiseTexture2D_7l0n1") +shader_parameter/alpha_scissor_threshold = 0.25 +shader_parameter/transmission = Color(0.619608, 0.541176, 0.101961, 1) +shader_parameter/secondary_color = Color(0, 0, 0, 1) +shader_parameter/secondary_attenuation = 0.2 +shader_parameter/grass_height = 0.829 +shader_parameter/wind_direction = Vector2(1, -0.5) +shader_parameter/wind_speed = 0.5 +shader_parameter/wind_strength = 0.15 +shader_parameter/noise_scale = 6.0 diff --git a/addons/proton_scatter/demos/assets/materials/m_fence.tres b/addons/proton_scatter/demos/assets/materials/m_fence.tres new file mode 100644 index 0000000..d2cedf3 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_fence.tres @@ -0,0 +1,6 @@ +[gd_resource type="SpatialMaterial" format=2] + +[resource] +resource_name = "wood" +vertex_color_use_as_albedo = true +albedo_color = Color( 0.568627, 0.466667, 0.372549, 1 ) diff --git a/addons/proton_scatter/demos/assets/materials/m_grass.tres b/addons/proton_scatter/demos/assets/materials/m_grass.tres new file mode 100644 index 0000000..cc63863 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_grass.tres @@ -0,0 +1,37 @@ +[gd_resource type="ShaderMaterial" load_steps=7 format=3 uid="uid://c4mot1fo3siox"] + +[ext_resource type="Shader" uid="uid://cktbgarifkbc8" path="res://addons/proton_scatter/demos/assets/materials/grass.gdshader" id="1_fntgl"] +[ext_resource type="Texture2D" uid="uid://d23p13yi7asw0" path="res://addons/proton_scatter/demos/assets/textures/t_grass_2.png" id="2_1odx0"] + +[sub_resource type="Gradient" id="Gradient_122hb"] +offsets = PackedFloat32Array(0, 0.473451, 1) +colors = PackedColorArray(0.179688, 0.0855483, 0.00322032, 1, 0.251693, 0.390625, 0.0117187, 1, 1, 0.964706, 0.129412, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_i0bw2"] +gradient = SubResource("Gradient_122hb") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_eeqpx"] +seed = 1 +frequency = 0.002 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_7l0n1"] +in_3d_space = true +seamless = true +seamless_blend_skirt = 0.65 +noise = SubResource("FastNoiseLite_eeqpx") + +[resource] +render_priority = 0 +shader = ExtResource("1_fntgl") +shader_parameter/texture_albedo = ExtResource("2_1odx0") +shader_parameter/texture_gradient = SubResource("GradientTexture1D_i0bw2") +shader_parameter/texture_noise = SubResource("NoiseTexture2D_7l0n1") +shader_parameter/alpha_scissor_threshold = 0.3 +shader_parameter/transmission = Color(0.737255, 0.72549, 0, 1) +shader_parameter/secondary_color = Color(0, 0, 0, 1) +shader_parameter/secondary_attenuation = 0.2 +shader_parameter/grass_height = 0.6 +shader_parameter/wind_direction = Vector2(1, -0.5) +shader_parameter/wind_speed = 0.5 +shader_parameter/wind_strength = 0.15 +shader_parameter/noise_scale = 6.0 diff --git a/addons/proton_scatter/demos/assets/materials/m_leaves.tres b/addons/proton_scatter/demos/assets/materials/m_leaves.tres new file mode 100644 index 0000000..a73f1c1 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_leaves.tres @@ -0,0 +1,38 @@ +[gd_resource type="ShaderMaterial" load_steps=7 format=3 uid="uid://djo80ucamk643"] + +[ext_resource type="Shader" path="res://addons/proton_scatter/demos/assets/materials/grass.gdshader" id="1_8py1k"] +[ext_resource type="Texture2D" uid="uid://cgenco43aneod" path="res://addons/proton_scatter/demos/assets/textures/t_leaves_1.png" id="2_l2uea"] + +[sub_resource type="Gradient" id="Gradient_yy7fg"] +offsets = PackedFloat32Array(0, 0.726872, 0.934272) +colors = PackedColorArray(0.333333, 0.486275, 0.556863, 1, 0.496467, 0.55, 0.1485, 1, 0.898039, 0.670588, 0.0196078, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_rwvaq"] +gradient = SubResource("Gradient_yy7fg") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_wpihy"] +seed = 1 +frequency = 0.002 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture_tgrrr"] +in_3d_space = true +seamless = true +seamless_blend_skirt = 0.65 +noise = SubResource("FastNoiseLite_wpihy") + +[resource] +render_priority = 0 +shader = ExtResource("1_8py1k") +shader_parameter/alpha_scissor_threshold = 0.5 +shader_parameter/camera_bend_strength = 0.0 +shader_parameter/grass_height = 1.0 +shader_parameter/noise_scale = 12.0 +shader_parameter/secondary_attenuation = 0.2 +shader_parameter/secondary_color = Color(0, 0.305882, 0.211765, 1) +shader_parameter/texture_albedo = ExtResource("2_l2uea") +shader_parameter/texture_gradient = SubResource("GradientTexture1D_rwvaq") +shader_parameter/texture_noise = SubResource("NoiseTexture_tgrrr") +shader_parameter/transmission = Color(1, 0.975296, 0.943663, 1) +shader_parameter/wind_direction = Vector2(1, -0.5) +shader_parameter/wind_speed = 0.5 +shader_parameter/wind_strength = 0.05 diff --git a/addons/proton_scatter/demos/assets/materials/m_mushroom.tres b/addons/proton_scatter/demos/assets/materials/m_mushroom.tres new file mode 100644 index 0000000..080c39c --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_mushroom.tres @@ -0,0 +1,6 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://ds2hjlo70hglg"] + +[ext_resource type="Texture2D" uid="uid://bjdgw8o5tr1a3" path="res://addons/proton_scatter/demos/assets/textures/mushroom.png" id="1_y0tuv"] + +[resource] +albedo_texture = ExtResource("1_y0tuv") diff --git a/addons/proton_scatter/demos/assets/materials/m_pine_leaves.tres b/addons/proton_scatter/demos/assets/materials/m_pine_leaves.tres new file mode 100644 index 0000000..366415d --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_pine_leaves.tres @@ -0,0 +1,35 @@ +[gd_resource type="ShaderMaterial" load_steps=7 format=3 uid="uid://d28lq2qtgdyie"] + +[ext_resource type="Shader" uid="uid://bv00dvm0n7u46" path="res://addons/proton_scatter/demos/assets/materials/leaves.gdshader" id="1_hlncd"] +[ext_resource type="Texture2D" uid="uid://ctpb1w0cr8tqc" path="res://addons/proton_scatter/demos/assets/textures/t_pine_branch.png" id="2_yef44"] + +[sub_resource type="Gradient" id="Gradient_pookg"] +offsets = PackedFloat32Array(0.38342, 0.694301, 1) +colors = PackedColorArray(0.059375, 0.078125, 0.07, 1, 0.628287, 0.73, 0.1752, 1, 0.897921, 1, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_n86jv"] +gradient = SubResource("Gradient_pookg") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_t7o5y"] +seed = 1 +frequency = 0.002 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_03p8g"] +in_3d_space = true +seamless = true +seamless_blend_skirt = 0.65 +noise = SubResource("FastNoiseLite_t7o5y") + +[resource] +render_priority = 0 +shader = ExtResource("1_hlncd") +shader_parameter/texture_albedo = ExtResource("2_yef44") +shader_parameter/texture_gradient = SubResource("GradientTexture1D_n86jv") +shader_parameter/texture_noise = SubResource("NoiseTexture2D_03p8g") +shader_parameter/alpha_scissor_threshold = 0.3 +shader_parameter/transmission = Color(0.745098, 0.741176, 0, 1) +shader_parameter/total_height = 4.046 +shader_parameter/wind_direction = Vector2(1, -0.5) +shader_parameter/wind_speed = 0.2 +shader_parameter/wind_strength = 0.05 +shader_parameter/noise_scale = 12.0 diff --git a/addons/proton_scatter/demos/assets/materials/m_rock.tres b/addons/proton_scatter/demos/assets/materials/m_rock.tres new file mode 100644 index 0000000..6275bd2 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_rock.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://i0jgjmbbl2m5"] + +[ext_resource type="Texture2D" uid="uid://drdh36j6mu3ah" path="res://addons/proton_scatter/demos/assets/textures/t_rock_dirty.png" id="1_hx37f"] + +[resource] +albedo_color = Color(0.439216, 0.407843, 0.388235, 1) +albedo_texture = ExtResource("1_hx37f") +metallic_specular = 0.3 +uv1_triplanar = true +uv1_world_triplanar = true diff --git a/addons/proton_scatter/demos/assets/materials/m_trunk.tres b/addons/proton_scatter/demos/assets/materials/m_trunk.tres new file mode 100644 index 0000000..d9ddbde --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_trunk.tres @@ -0,0 +1,7 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://d01d0h08lqqn6"] + +[ext_resource type="Texture2D" uid="uid://c7pop5xgpxtiv" path="res://addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png" id="1_g4son"] + +[resource] +albedo_color = Color(0.470588, 0.376471, 0.309804, 1) +albedo_texture = ExtResource("1_g4son") diff --git a/addons/proton_scatter/demos/assets/materials/m_water.gdshader b/addons/proton_scatter/demos/assets/materials/m_water.gdshader new file mode 100644 index 0000000..9feaae6 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_water.gdshader @@ -0,0 +1,90 @@ +// Source: https://godotshaders.com/shader/toon-water-shader/ + +shader_type spatial; + +const float SMOOTHSTEP_AA = 0.01; +uniform sampler2D surfaceNoise; +uniform sampler2D distortNoise; +uniform sampler2D DEPTH_TEXTURE : hint_depth_texture, filter_linear_mipmap; + +uniform float beer_factor = 0.8; + +uniform float foam_distance = 0.01; +uniform float foam_max_distance = 0.4; +uniform float foam_min_distance = 0.04; +uniform vec4 foam_color: source_color = vec4(1.0); + +uniform vec2 surface_noise_tiling = vec2(1.0, 4.0); +uniform vec3 surface_noise_scroll = vec3(0.03, 0.03, 0.0); +uniform float surface_noise_cutoff: hint_range(0, 1) = 0.777; +uniform float surface_distortion_amount: hint_range(0, 1) = 0.27; + +uniform vec4 _DepthGradientShallow: source_color = vec4(0.325, 0.807, 0.971, 0.725); +uniform vec4 _DepthGradientDeep: source_color = vec4(0.086, 0.407, 1, 0.749); +uniform float _DepthMaxDistance: hint_range(0, 1) = 1.0; +uniform float _DepthFactor = 1.0; + +uniform float roughness = 0.25; +uniform float specular = 0.75; + +varying vec2 noiseUV; +varying vec2 distortUV; +varying vec3 viewNormal; + + +vec4 alphaBlend(vec4 top, vec4 bottom) +{ + vec3 color = (top.rgb * top.a) + (bottom.rgb * (1.0 - top.a)); + float alpha = top.a + bottom.a * (1.0 - top.a); + + return vec4(color, alpha); +} + +void vertex() { + viewNormal = (MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz; + noiseUV = UV * surface_noise_tiling; + distortUV = UV; +} + +void fragment(){ + // https://www.youtube.com/watch?v=Jq3he9Lbj7M + float depthVal = texture(DEPTH_TEXTURE, SCREEN_UV).r; + float depth = PROJECTION_MATRIX[3][2] / (depthVal + PROJECTION_MATRIX[2][2]); + depth = depth + VERTEX.z; + depth = exp(-depth * beer_factor); + depth = 1.0 - depth; + + // Still unsure how to get properly the NORMAL from the camera + // This was generated by ChatGPT xD + vec4 view_pos = INV_PROJECTION_MATRIX * vec4(SCREEN_UV * 2.0 - 1.0, depthVal, 1.0); + view_pos /= view_pos.w; + vec3 existingNormal = normalize(cross( dFdx(view_pos.xyz), dFdy(view_pos.xyz))); + + float normalDot = clamp(dot(existingNormal.xyz, viewNormal), 0.0, 1.0); + float foamDistance = mix(foam_max_distance, foam_min_distance, normalDot); + + float foamDepth = clamp(depth / foamDistance, 0.0, 1.0); + float surfaceNoiseCutoff = foamDepth * surface_noise_cutoff; + + vec4 distortNoiseSample = texture(distortNoise, distortUV); + vec2 distortAmount = (distortNoiseSample.xy * 2.0 -1.0) * surface_distortion_amount; + + vec2 noise_uv = vec2( + (noiseUV.x + TIME * surface_noise_scroll.x) + distortAmount.x , + (noiseUV.y + TIME * surface_noise_scroll.y + distortAmount.y) + ); + float surfaceNoiseSample = texture(surfaceNoise, noise_uv).r; + float surfaceNoiseAmount = smoothstep(surfaceNoiseCutoff - SMOOTHSTEP_AA, surfaceNoiseCutoff + SMOOTHSTEP_AA, surfaceNoiseSample); + + float waterDepth = clamp(depth / _DepthMaxDistance, 0.0, 1.0) * _DepthFactor; + vec4 waterColor = mix(_DepthGradientShallow, _DepthGradientDeep, waterDepth); + + vec4 surfaceNoiseColor = foam_color; + surfaceNoiseColor.a *= surfaceNoiseAmount; + vec4 color = alphaBlend(surfaceNoiseColor, waterColor); + + ALBEDO = color.rgb; + ALPHA = color.a; + ROUGHNESS = roughness; + SPECULAR = specular; +} \ No newline at end of file diff --git a/addons/proton_scatter/demos/assets/materials/m_water.gdshader.uid b/addons/proton_scatter/demos/assets/materials/m_water.gdshader.uid new file mode 100644 index 0000000..9f1901e --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_water.gdshader.uid @@ -0,0 +1 @@ +uid://d0qg1ivc7h7j8 diff --git a/addons/proton_scatter/demos/assets/materials/m_water.tres b/addons/proton_scatter/demos/assets/materials/m_water.tres new file mode 100644 index 0000000..9dcd264 --- /dev/null +++ b/addons/proton_scatter/demos/assets/materials/m_water.tres @@ -0,0 +1,40 @@ +[gd_resource type="ShaderMaterial" load_steps=6 format=3 uid="uid://c7mw5tryqfggw"] + +[ext_resource type="Shader" path="res://addons/proton_scatter/demos/assets/materials/m_water.gdshader" id="1_j8rl3"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_7bjdc"] +noise_type = 2 +fractal_type = 3 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_wxuht"] +seamless = true +noise = SubResource("FastNoiseLite_7bjdc") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_dx86n"] +noise_type = 2 +domain_warp_enabled = true + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_1j0ob"] +seamless = true +noise = SubResource("FastNoiseLite_dx86n") + +[resource] +render_priority = 0 +shader = ExtResource("1_j8rl3") +shader_parameter/beer_factor = 4.0 +shader_parameter/foam_distance = 0.01 +shader_parameter/foam_max_distance = 0.345 +shader_parameter/foam_min_distance = 0.05 +shader_parameter/foam_color = Color(1, 1, 1, 0.784314) +shader_parameter/surface_noise_tiling = Vector2(1, 4) +shader_parameter/surface_noise_scroll = Vector3(0.03, 0.03, 0) +shader_parameter/surface_noise_cutoff = 0.875 +shader_parameter/surface_distortion_amount = 0.65 +shader_parameter/_DepthGradientShallow = Color(0.435294, 0.647059, 0.972549, 0.72549) +shader_parameter/_DepthGradientDeep = Color(0.0823529, 0.392157, 0.701961, 0.862745) +shader_parameter/_DepthMaxDistance = 1.0 +shader_parameter/_DepthFactor = 1.0 +shader_parameter/roughness = 0.001 +shader_parameter/specular = 0.5 +shader_parameter/surfaceNoise = SubResource("NoiseTexture2D_1j0ob") +shader_parameter/distortNoise = SubResource("NoiseTexture2D_wxuht") diff --git a/addons/proton_scatter/demos/assets/models/brick.glb b/addons/proton_scatter/demos/assets/models/brick.glb new file mode 100644 index 0000000..0748793 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/brick.glb differ diff --git a/addons/proton_scatter/demos/assets/models/brick.glb.import b/addons/proton_scatter/demos/assets/models/brick.glb.import new file mode 100644 index 0000000..18fa1e0 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/brick.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1d1fag0m04yc" +path="res://.godot/imported/brick.glb-d79404ecf88b29143e6e07e77bacb44c.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/brick.glb" +dest_files=["res://.godot/imported/brick.glb-d79404ecf88b29143e6e07e77bacb44c.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/bush.glb b/addons/proton_scatter/demos/assets/models/bush.glb new file mode 100644 index 0000000..e25bf36 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/bush.glb differ diff --git a/addons/proton_scatter/demos/assets/models/bush.glb.import b/addons/proton_scatter/demos/assets/models/bush.glb.import new file mode 100644 index 0000000..f0ada31 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/bush.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dbb4culid55v5" +path="res://.godot/imported/bush.glb-28e0128066fe8d913839a6b96204b1c6.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/bush.glb" +dest_files=["res://.godot/imported/bush.glb-28e0128066fe8d913839a6b96204b1c6.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/dead_branch.glb b/addons/proton_scatter/demos/assets/models/dead_branch.glb new file mode 100644 index 0000000..de35d32 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/dead_branch.glb differ diff --git a/addons/proton_scatter/demos/assets/models/dead_branch.glb.import b/addons/proton_scatter/demos/assets/models/dead_branch.glb.import new file mode 100644 index 0000000..2418375 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/dead_branch.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cmqlv88xp71tw" +path="res://.godot/imported/dead_branch.glb-e4e41ce877f1ef0b2d20a7b89af5de7b.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/dead_branch.glb" +dest_files=["res://.godot/imported/dead_branch.glb-e4e41ce877f1ef0b2d20a7b89af5de7b.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/fence_planks.glb b/addons/proton_scatter/demos/assets/models/fence_planks.glb new file mode 100644 index 0000000..2ac79fd Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/fence_planks.glb differ diff --git a/addons/proton_scatter/demos/assets/models/fence_planks.glb.import b/addons/proton_scatter/demos/assets/models/fence_planks.glb.import new file mode 100644 index 0000000..fc722c1 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/fence_planks.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://6gxiul1pw13t" +path="res://.godot/imported/fence_planks.glb-4cee642c3e514323763ee9631fb323e9.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/fence_planks.glb" +dest_files=["res://.godot/imported/fence_planks.glb-4cee642c3e514323763ee9631fb323e9.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/gobot.glb b/addons/proton_scatter/demos/assets/models/gobot.glb new file mode 100644 index 0000000..f8a83fe Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/gobot.glb differ diff --git a/addons/proton_scatter/demos/assets/models/gobot.glb.import b/addons/proton_scatter/demos/assets/models/gobot.glb.import new file mode 100644 index 0000000..09c10d6 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/gobot.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d3f4d3m7n8tpr" +path="res://.godot/imported/gobot.glb-36505aa16090f2bc2f34fbe5362f44e8.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/gobot.glb" +dest_files=["res://.godot/imported/gobot.glb-36505aa16090f2bc2f34fbe5362f44e8.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/grass.glb b/addons/proton_scatter/demos/assets/models/grass.glb new file mode 100644 index 0000000..f3a2f57 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/grass.glb differ diff --git a/addons/proton_scatter/demos/assets/models/grass.glb.import b/addons/proton_scatter/demos/assets/models/grass.glb.import new file mode 100644 index 0000000..1e81fd9 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/grass.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://018flajgtx7t" +path="res://.godot/imported/grass.glb-0ef73576363e4c601b9f45b1787e1487.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/grass.glb" +dest_files=["res://.godot/imported/grass.glb-0ef73576363e4c601b9f45b1787e1487.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/grass_2.glb b/addons/proton_scatter/demos/assets/models/grass_2.glb new file mode 100644 index 0000000..8c20845 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/grass_2.glb differ diff --git a/addons/proton_scatter/demos/assets/models/grass_2.glb.import b/addons/proton_scatter/demos/assets/models/grass_2.glb.import new file mode 100644 index 0000000..e6ece17 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/grass_2.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dcnm2ijk7hj4j" +path="res://.godot/imported/grass_2.glb-2dc56a32acf64077863c701e8b94ea02.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/grass_2.glb" +dest_files=["res://.godot/imported/grass_2.glb-2dc56a32acf64077863c701e8b94ea02.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/large_rock.glb b/addons/proton_scatter/demos/assets/models/large_rock.glb new file mode 100644 index 0000000..e88cd6c Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/large_rock.glb differ diff --git a/addons/proton_scatter/demos/assets/models/large_rock.glb.import b/addons/proton_scatter/demos/assets/models/large_rock.glb.import new file mode 100644 index 0000000..0e2e885 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/large_rock.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bxqkgplyoipsx" +path="res://.godot/imported/large_rock.glb-f7a7a73f49167cee4ed84e7342d1f507.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/large_rock.glb" +dest_files=["res://.godot/imported/large_rock.glb-f7a7a73f49167cee4ed84e7342d1f507.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/mushrooms.glb b/addons/proton_scatter/demos/assets/models/mushrooms.glb new file mode 100644 index 0000000..6fc402a Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/mushrooms.glb differ diff --git a/addons/proton_scatter/demos/assets/models/mushrooms.glb.import b/addons/proton_scatter/demos/assets/models/mushrooms.glb.import new file mode 100644 index 0000000..81b1b16 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/mushrooms.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c38uugpgw7hjm" +path="res://.godot/imported/mushrooms.glb-64c83b02a53711f9983c978d53ab0f12.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/mushrooms.glb" +dest_files=["res://.godot/imported/mushrooms.glb-64c83b02a53711f9983c978d53ab0f12.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/pine_tree.glb b/addons/proton_scatter/demos/assets/models/pine_tree.glb new file mode 100644 index 0000000..2081573 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/pine_tree.glb differ diff --git a/addons/proton_scatter/demos/assets/models/pine_tree.glb.import b/addons/proton_scatter/demos/assets/models/pine_tree.glb.import new file mode 100644 index 0000000..b95b15c --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/pine_tree.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bhums0j31gm5n" +path="res://.godot/imported/pine_tree.glb-662cc3d34707ccadde24f89b98fadf88.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/pine_tree.glb" +dest_files=["res://.godot/imported/pine_tree.glb-662cc3d34707ccadde24f89b98fadf88.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/small_rock.glb b/addons/proton_scatter/demos/assets/models/small_rock.glb new file mode 100644 index 0000000..f30897f Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/small_rock.glb differ diff --git a/addons/proton_scatter/demos/assets/models/small_rock.glb.import b/addons/proton_scatter/demos/assets/models/small_rock.glb.import new file mode 100644 index 0000000..31eb278 --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/small_rock.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b81l25tbebki4" +path="res://.godot/imported/small_rock.glb-9b9690e480edfa6e23f0243045338de9.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/small_rock.glb" +dest_files=["res://.godot/imported/small_rock.glb-9b9690e480edfa6e23f0243045338de9.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={ +"materials": { +"@MATERIAL:0": { +"use_external/path": "uid://i0jgjmbbl2m5" +} +} +} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/models/tree.glb b/addons/proton_scatter/demos/assets/models/tree.glb new file mode 100644 index 0000000..92e9012 Binary files /dev/null and b/addons/proton_scatter/demos/assets/models/tree.glb differ diff --git a/addons/proton_scatter/demos/assets/models/tree.glb.import b/addons/proton_scatter/demos/assets/models/tree.glb.import new file mode 100644 index 0000000..779835e --- /dev/null +++ b/addons/proton_scatter/demos/assets/models/tree.glb.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c3mfolo7c5uvh" +path="res://.godot/imported/tree.glb-86fae6fb2428df7d74097b1a7c75b288.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/models/tree.glb" +dest_files=["res://.godot/imported/tree.glb-86fae6fb2428df7d74097b1a7c75b288.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=0 +gltf/embedded_image_handling=1 diff --git a/addons/proton_scatter/demos/assets/mushroom.tscn b/addons/proton_scatter/demos/assets/mushroom.tscn new file mode 100644 index 0000000..43d1923 --- /dev/null +++ b/addons/proton_scatter/demos/assets/mushroom.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://bodkixm8bubes"] + +[ext_resource type="PackedScene" uid="uid://c38uugpgw7hjm" path="res://addons/proton_scatter/demos/assets/models/mushrooms.glb" id="1_spmys"] +[ext_resource type="Material" uid="uid://ds2hjlo70hglg" path="res://addons/proton_scatter/demos/assets/materials/m_mushroom.tres" id="2_y6jw1"] + +[node name="mushrooms" instance=ExtResource("1_spmys")] + +[node name="Sphere001" parent="." index="0"] +surface_material_override/0 = ExtResource("2_y6jw1") diff --git a/addons/proton_scatter/demos/assets/pine_tree.tscn b/addons/proton_scatter/demos/assets/pine_tree.tscn new file mode 100644 index 0000000..9f1b08c --- /dev/null +++ b/addons/proton_scatter/demos/assets/pine_tree.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=6 format=3 uid="uid://caqxfqurbp3ku"] + +[ext_resource type="PackedScene" uid="uid://bhums0j31gm5n" path="res://addons/proton_scatter/demos/assets/models/pine_tree.glb" id="1_hw1e5"] +[ext_resource type="Material" uid="uid://d01d0h08lqqn6" path="res://addons/proton_scatter/demos/assets/materials/m_trunk.tres" id="2_cgtpc"] +[ext_resource type="Material" uid="uid://d28lq2qtgdyie" path="res://addons/proton_scatter/demos/assets/materials/m_pine_leaves.tres" id="2_xnytt"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_2xqpo"] +radius = 0.0750397 +height = 1.3553 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_uhp33"] +radius = 0.101768 +height = 0.489166 + +[node name="pine_tree" instance=ExtResource("1_hw1e5")] + +[node name="Trunk" parent="." index="0"] +surface_material_override/0 = ExtResource("2_cgtpc") + +[node name="Leaves" parent="." index="1"] +surface_material_override/0 = ExtResource("2_xnytt") + +[node name="StaticBody3D" type="StaticBody3D" parent="." index="2"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D" index="0"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.661681, 0) +shape = SubResource("CapsuleShape3D_2xqpo") + +[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D" index="1"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.015189, 0) +shape = SubResource("CapsuleShape3D_uhp33") diff --git a/addons/proton_scatter/demos/assets/small_rock.tscn b/addons/proton_scatter/demos/assets/small_rock.tscn new file mode 100644 index 0000000..2025b28 --- /dev/null +++ b/addons/proton_scatter/demos/assets/small_rock.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=3 uid="uid://bltmr2xgs8nq1"] + +[ext_resource type="PackedScene" uid="uid://b81l25tbebki4" path="res://addons/proton_scatter/demos/assets/models/small_rock.glb" id="1_e2qk6"] +[ext_resource type="Material" uid="uid://i0jgjmbbl2m5" path="res://addons/proton_scatter/demos/assets/materials/m_rock.tres" id="2_clsfy"] + +[node name="small_rock" instance=ExtResource("1_e2qk6")] + +[node name="SmallRock" parent="." index="0"] +surface_material_override/0 = ExtResource("2_clsfy") diff --git a/addons/proton_scatter/demos/assets/source.blend b/addons/proton_scatter/demos/assets/source.blend new file mode 100644 index 0000000..f973cf9 Binary files /dev/null and b/addons/proton_scatter/demos/assets/source.blend differ diff --git a/addons/proton_scatter/demos/assets/source.blend.import b/addons/proton_scatter/demos/assets/source.blend.import new file mode 100644 index 0000000..a2255d3 --- /dev/null +++ b/addons/proton_scatter/demos/assets/source.blend.import @@ -0,0 +1,53 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c45jyo5mdo5pj" +path="res://.godot/imported/source.blend-6553bbdea542ba64489fdff7990920e8.scn" + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/source.blend" +dest_files=["res://.godot/imported/source.blend-6553bbdea542ba64489fdff7990920e8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +blender/nodes/visible=0 +blender/nodes/active_collection_only=false +blender/nodes/punctual_lights=true +blender/nodes/cameras=true +blender/nodes/custom_properties=true +blender/nodes/modifiers=1 +blender/meshes/colors=false +blender/meshes/uvs=true +blender/meshes/normals=true +blender/meshes/export_geometry_nodes_instances=false +blender/meshes/tangents=true +blender/meshes/skins=2 +blender/meshes/export_bones_deforming_mesh_only=false +blender/materials/unpack_enabled=true +blender/materials/export_materials=1 +blender/animation/limit_playback=true +blender/animation/always_sample=true +blender/animation/group_tracks=true diff --git a/addons/proton_scatter/demos/assets/textures/grid.png b/addons/proton_scatter/demos/assets/textures/grid.png new file mode 100644 index 0000000..c5bbc74 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/grid.png differ diff --git a/addons/proton_scatter/demos/assets/textures/grid.png.import b/addons/proton_scatter/demos/assets/textures/grid.png.import new file mode 100644 index 0000000..2200587 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/grid.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6xc5b38d25gf" +path.s3tc="res://.godot/imported/grid.png-491581bd748087c94a4b25c27dcb904c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/grid.png" +dest_files=["res://.godot/imported/grid.png-491581bd748087c94a4b25c27dcb904c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/mushroom.png b/addons/proton_scatter/demos/assets/textures/mushroom.png new file mode 100644 index 0000000..f1f960d Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/mushroom.png differ diff --git a/addons/proton_scatter/demos/assets/textures/mushroom.png.import b/addons/proton_scatter/demos/assets/textures/mushroom.png.import new file mode 100644 index 0000000..b4bfe61 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/mushroom.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjdgw8o5tr1a3" +path.s3tc="res://.godot/imported/mushroom.png-36c0c492b0f6a79e2aa68780d9a86c03.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/mushroom.png" +dest_files=["res://.godot/imported/mushroom.png-36c0c492b0f6a79e2aa68780d9a86c03.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/sky_2.png b/addons/proton_scatter/demos/assets/textures/sky_2.png new file mode 100644 index 0000000..921ae63 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/sky_2.png differ diff --git a/addons/proton_scatter/demos/assets/textures/sky_2.png.import b/addons/proton_scatter/demos/assets/textures/sky_2.png.import new file mode 100644 index 0000000..7cbdae6 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/sky_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgc5rl13dopuj" +path.s3tc="res://.godot/imported/sky_2.png-3246d9ba45b69131effdf515c69428b4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/sky_2.png" +dest_files=["res://.godot/imported/sky_2.png-3246d9ba45b69131effdf515c69428b4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_bush.png b/addons/proton_scatter/demos/assets/textures/t_bush.png new file mode 100644 index 0000000..3afb9f9 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_bush.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_bush.png.import b/addons/proton_scatter/demos/assets/textures/t_bush.png.import new file mode 100644 index 0000000..0a4d833 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_bush.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2a6ylo2enm4g" +path.s3tc="res://.godot/imported/t_bush.png-644d0e155c07db6d89949c275e110f2a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_bush.png" +dest_files=["res://.godot/imported/t_bush.png-644d0e155c07db6d89949c275e110f2a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_grass.png b/addons/proton_scatter/demos/assets/textures/t_grass.png new file mode 100644 index 0000000..2f712d4 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_grass.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_grass.png.import b/addons/proton_scatter/demos/assets/textures/t_grass.png.import new file mode 100644 index 0000000..6662f4a --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_grass.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c08mm3p2ehvr6" +path="res://.godot/imported/t_grass.png-2144df75763a0a189eba3035fc0b94aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_grass.png" +dest_files=["res://.godot/imported/t_grass.png-2144df75763a0a189eba3035fc0b94aa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_grass_2.png b/addons/proton_scatter/demos/assets/textures/t_grass_2.png new file mode 100644 index 0000000..346a5c1 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_grass_2.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_grass_2.png.import b/addons/proton_scatter/demos/assets/textures/t_grass_2.png.import new file mode 100644 index 0000000..4339769 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_grass_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d23p13yi7asw0" +path.s3tc="res://.godot/imported/t_grass_2.png-e3f17c2ee365553e0f39f2b5865e73de.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_grass_2.png" +dest_files=["res://.godot/imported/t_grass_2.png-e3f17c2ee365553e0f39f2b5865e73de.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_leaves_1.png b/addons/proton_scatter/demos/assets/textures/t_leaves_1.png new file mode 100644 index 0000000..1913781 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_leaves_1.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_leaves_1.png.import b/addons/proton_scatter/demos/assets/textures/t_leaves_1.png.import new file mode 100644 index 0000000..3e0fab2 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_leaves_1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drmmcy11y7mho" +path.s3tc="res://.godot/imported/t_leaves_1.png-1d55b008d9a51575d696e027028d7b90.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_leaves_1.png" +dest_files=["res://.godot/imported/t_leaves_1.png-1d55b008d9a51575d696e027028d7b90.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_pine_branch.png b/addons/proton_scatter/demos/assets/textures/t_pine_branch.png new file mode 100644 index 0000000..26ea314 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_pine_branch.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_pine_branch.png.import b/addons/proton_scatter/demos/assets/textures/t_pine_branch.png.import new file mode 100644 index 0000000..029375a --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_pine_branch.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctpb1w0cr8tqc" +path.s3tc="res://.godot/imported/t_pine_branch.png-912fabf99bebd2eee6af2f445a54650e.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_pine_branch.png" +dest_files=["res://.godot/imported/t_pine_branch.png-912fabf99bebd2eee6af2f445a54650e.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_rock.jpg b/addons/proton_scatter/demos/assets/textures/t_rock.jpg new file mode 100644 index 0000000..d709604 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_rock.jpg differ diff --git a/addons/proton_scatter/demos/assets/textures/t_rock.jpg.import b/addons/proton_scatter/demos/assets/textures/t_rock.jpg.import new file mode 100644 index 0000000..65ee93e --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_rock.jpg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqa2jfs1jy0hq" +path.s3tc="res://.godot/imported/t_rock.jpg-ae52c049ee9fab72f1ddf136050fd9ee.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_rock.jpg" +dest_files=["res://.godot/imported/t_rock.jpg-ae52c049ee9fab72f1ddf136050fd9ee.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png b/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png new file mode 100644 index 0000000..69ef74c Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png.import b/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png.import new file mode 100644 index 0000000..4615be1 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_rock_dirty.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drdh36j6mu3ah" +path.s3tc="res://.godot/imported/t_rock_dirty.png-da395e5af8ffe9e04730e7e21eb6a86a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_rock_dirty.png" +dest_files=["res://.godot/imported/t_rock_dirty.png-da395e5af8ffe9e04730e7e21eb6a86a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_sand.png b/addons/proton_scatter/demos/assets/textures/t_sand.png new file mode 100644 index 0000000..244c60b Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_sand.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_sand.png.import b/addons/proton_scatter/demos/assets/textures/t_sand.png.import new file mode 100644 index 0000000..3d8502e --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_sand.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sudhfhsu333v" +path="res://.godot/imported/t_sand.png-1294bc4057daa02a434527a7e90f8d41.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_sand.png" +dest_files=["res://.godot/imported/t_sand.png-1294bc4057daa02a434527a7e90f8d41.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_tree_bark.png b/addons/proton_scatter/demos/assets/textures/t_tree_bark.png new file mode 100644 index 0000000..73529aa Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_tree_bark.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_tree_bark.png.import b/addons/proton_scatter/demos/assets/textures/t_tree_bark.png.import new file mode 100644 index 0000000..626be76 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_tree_bark.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uax7x76f73fx" +path="res://.godot/imported/t_tree_bark.png-7732e2f9079e9ae58b8ccd57e5fc6c8a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_tree_bark.png" +dest_files=["res://.godot/imported/t_tree_bark.png-7732e2f9079e9ae58b8ccd57e5fc6c8a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png b/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png new file mode 100644 index 0000000..80823c2 Binary files /dev/null and b/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png differ diff --git a/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png.import b/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png.import new file mode 100644 index 0000000..024eaa8 --- /dev/null +++ b/addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7pop5xgpxtiv" +path.s3tc="res://.godot/imported/t_tree_bark_rough.png-e025145ebb3b5e0dd14e26284dc6cf59.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/demos/assets/textures/t_tree_bark_rough.png" +dest_files=["res://.godot/imported/t_tree_bark_rough.png-e025145ebb3b5e0dd14e26284dc6cf59.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/demos/loading.gd b/addons/proton_scatter/demos/loading.gd new file mode 100644 index 0000000..355cd80 --- /dev/null +++ b/addons/proton_scatter/demos/loading.gd @@ -0,0 +1,23 @@ +@tool +extends Control + +# Hides the loading screen when the scatter nodes are ready. +# +# Every Scatter nodes emit a signal called "build_completed" when they are done +# generating their multimeshes. + +var _scatter_completed := false + + +func _ready() -> void: + # Show the loading screen, unless scatter is already done. + visible = not _scatter_completed + + +# In this example, the Grass is usually the last one to complete, so its +# 'build_completed' signal is connected to this method. +# You could also listen to multiple Scatter nodes and accumulate all the signals +# to be extra safe. How you handle this is up to you. +func _on_scatter_build_completed() -> void: + visible = false + _scatter_completed = true diff --git a/addons/proton_scatter/demos/loading.gd.uid b/addons/proton_scatter/demos/loading.gd.uid new file mode 100644 index 0000000..3b2d2ea --- /dev/null +++ b/addons/proton_scatter/demos/loading.gd.uid @@ -0,0 +1 @@ +uid://xt3aelgr1tq8 diff --git a/addons/proton_scatter/demos/showcase.tscn b/addons/proton_scatter/demos/showcase.tscn new file mode 100644 index 0000000..c134ba1 --- /dev/null +++ b/addons/proton_scatter/demos/showcase.tscn @@ -0,0 +1,768 @@ +[gd_scene load_steps=79 format=3 uid="uid://dga4klregd82"] + +[ext_resource type="Texture2D" uid="uid://bgc5rl13dopuj" path="res://addons/proton_scatter/demos/assets/textures/sky_2.png" id="1_bp1wy"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter.gd" id="1_odnwj"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/modifier_stack.gd" id="2_wdwa6"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_item.gd" id="3_tn31i"] +[ext_resource type="Material" uid="uid://c7mw5tryqfggw" path="res://addons/proton_scatter/demos/assets/materials/m_water.tres" id="3_yrj3o"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_shape.gd" id="4_5klvy"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_grid.gd" id="4_cnevb"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/randomize_transforms.gd" id="5_h0430"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/path_shape.gd" id="8_vjeqj"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/sphere_shape.gd" id="9_mhcwm"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/box_shape.gd" id="11_lv5tc"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/relax.gd" id="12_04tbd"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/project_on_geometry.gd" id="13_s5uny"] +[ext_resource type="PackedScene" uid="uid://bmglbfn5jaubp" path="res://addons/proton_scatter/demos/assets/gobot.tscn" id="15_mnk3f"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_random.gd" id="15_terd0"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/randomize_rotation.gd" id="16_qmwrn"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/array.gd" id="17_2af2s"] +[ext_resource type="Script" path="res://addons/proton_scatter/demos/loading.gd" id="18_0clps"] + +[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_bxgb5"] +panorama = ExtResource("1_bp1wy") + +[sub_resource type="Sky" id="Sky_ju840"] +sky_material = SubResource("PanoramaSkyMaterial_bxgb5") + +[sub_resource type="Environment" id="Environment_1kod5"] +background_mode = 2 +background_energy_multiplier = 1.25 +sky = SubResource("Sky_ju840") +sky_rotation = Vector3(0, 1.13446, 0) +ambient_light_color = Color(0.352941, 0.215686, 0.529412, 1) +ambient_light_sky_contribution = 0.2 +ambient_light_energy = 0.5 +tonemap_mode = 3 +tonemap_white = 1.2 +glow_enabled = true +fog_enabled = true +fog_light_color = Color(0.243137, 0.411765, 0.607843, 1) +fog_light_energy = 1.8 +fog_density = 0.02 +fog_sky_affect = 0.05 +fog_height = 4.0 +fog_height_density = 0.02 +volumetric_fog_temporal_reprojection_enabled = false +adjustment_enabled = true +adjustment_contrast = 1.15 +adjustment_saturation = 1.1 + +[sub_resource type="PlaneMesh" id="PlaneMesh_84bvf"] +size = Vector2(300, 300) + +[sub_resource type="Resource" id="Resource_slkpd"] +script = ExtResource("4_cnevb") +spacing = Vector3(1.5, 2, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_hc5ta"] +script = ExtResource("5_h0430") +position = Vector3(0.173, 0.222, 0.918) +rotation = Vector3(10, 360, 10) +scale = Vector3(1.201, 0.399, 1.183) +enabled = true +override_global_seed = true +custom_seed = 10 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_4npfm"] +script = ExtResource("16_qmwrn") +rotation = Vector3(360, 0, 360) +snap_angle = Vector3(180, 0, 180) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_nl1d8"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_slkpd"), SubResource("Resource_hc5ta"), SubResource("Resource_4npfm")]) + +[sub_resource type="Curve3D" id="Curve3D_ew6qf"] +_data = { +"points": PackedVector3Array(3.80872, 0, 0.938568, -3.80872, 0, -0.938568, -5.23002, 0, 0.969148, -4.01273, -4.76837e-07, 0.319402, 4.01273, 4.76837e-07, -0.319402, -4.0201, 0, -3.87154, 0.483762, 0, -2.35326, -0.483762, 0, 2.35326, 2.27396, 0, -0.779812), +"tilts": PackedFloat32Array(0, 0, 0) +} +point_count = 3 + +[sub_resource type="Resource" id="Resource_ftiyl"] +script = ExtResource("8_vjeqj") +closed = true +thickness = 0.0 +curve = SubResource("Curve3D_ew6qf") + +[sub_resource type="Resource" id="Resource_egokv"] +script = ExtResource("4_cnevb") +spacing = Vector3(4, 4, 4) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_sfry4"] +script = ExtResource("5_h0430") +position = Vector3(10, 4, 10) +rotation = Vector3(10, 180, 10) +scale = Vector3(5, 5, 5) +enabled = true +override_global_seed = true +custom_seed = 25 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_lq5i4"] +script = ExtResource("16_qmwrn") +rotation = Vector3(360, 0, 360) +snap_angle = Vector3(180, 0, 180) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_56f0d"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_egokv"), SubResource("Resource_sfry4"), SubResource("Resource_lq5i4")]) + +[sub_resource type="Resource" id="Resource_1jvqx"] +script = ExtResource("11_lv5tc") +size = Vector3(29.1644, 1, 11.2962) + +[sub_resource type="Resource" id="Resource_k2idu"] +script = ExtResource("15_terd0") +amount = 14 +enabled = true +override_global_seed = true +custom_seed = 30 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_5juyu"] +script = ExtResource("12_04tbd") +iterations = 5 +offset_step = 0.1 +consecutive_step_multiplier = 0.5 +use_computeshader = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_8rpv2"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 1.0 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_le8k7"] +script = ExtResource("5_h0430") +position = Vector3(0, 0, 0) +rotation = Vector3(0, 0, 0) +scale = Vector3(3, 3, 3) +enabled = true +override_global_seed = true +custom_seed = 30 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_vl457"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_k2idu"), SubResource("Resource_5juyu"), SubResource("Resource_8rpv2"), SubResource("Resource_le8k7")]) + +[sub_resource type="Curve3D" id="Curve3D_p31po"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -5.18137, -4.76837e-07, 0.742086, 0, 0, 0, 0, 0, 0, -6.91097, -2.38419e-07, -2.62414, 0, 0, 0, 0, 0, 0, 4.23263, 0, -2.10494, 0, 0, 0, 0, 0, 0, 4.13477, 0, -0.306146, 0, 0, 0, 0, 0, 0, -1.36184, 0, 1.16488), +"tilts": PackedFloat32Array(0, 0, 0, 0, 0) +} +point_count = 5 + +[sub_resource type="Resource" id="Resource_jto6x"] +script = ExtResource("8_vjeqj") +closed = true +thickness = 0.0 +curve = SubResource("Curve3D_p31po") + +[sub_resource type="Resource" id="Resource_5p0cc"] +script = ExtResource("15_terd0") +amount = 500 +enabled = true +override_global_seed = true +custom_seed = 7 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_25te8"] +script = ExtResource("5_h0430") +position = Vector3(0, 0, 0) +rotation = Vector3(360, 360, 360) +scale = Vector3(1.5, 1.5, 1.5) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_v0wvh"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 1.0 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ac5wm"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_5p0cc"), SubResource("Resource_25te8"), SubResource("Resource_v0wvh")]) + +[sub_resource type="Resource" id="Resource_0weea"] +script = ExtResource("11_lv5tc") +size = Vector3(11.3737, 0.642154, 5.57444) + +[sub_resource type="Resource" id="Resource_eq8kb"] +script = ExtResource("15_terd0") +amount = 10000 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_m4caw"] +script = ExtResource("5_h0430") +position = Vector3(0.2, 0, 0.2) +rotation = Vector3(20, 360, 20) +scale = Vector3(6, 5, 6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_i8m6m"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 1.0 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 20.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ywyik"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_eq8kb"), SubResource("Resource_m4caw"), SubResource("Resource_i8m6m")]) + +[sub_resource type="Resource" id="Resource_iou5c"] +script = ExtResource("9_mhcwm") +radius = 3.03782 + +[sub_resource type="Resource" id="Resource_llvm5"] +script = ExtResource("9_mhcwm") +radius = 2.15656 + +[sub_resource type="Resource" id="Resource_maxps"] +script = ExtResource("4_cnevb") +spacing = Vector3(0.2, 0.3, 0.2) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_5ics8"] +script = ExtResource("16_qmwrn") +rotation = Vector3(0, 360, 0) +snap_angle = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_ilaru"] +script = ExtResource("5_h0430") +position = Vector3(0, 0.107, 0) +rotation = Vector3(0, 360, 0) +scale = Vector3(0.75, 0.75, 0.75) +enabled = true +override_global_seed = true +custom_seed = 20 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_elisw"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, 0, 1) +ray_length = 1.0 +ray_offset = 0.5 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_01as6"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_maxps"), SubResource("Resource_5ics8"), SubResource("Resource_ilaru"), SubResource("Resource_elisw")]) + +[sub_resource type="Resource" id="Resource_272xj"] +script = ExtResource("11_lv5tc") +size = Vector3(1.64858, 0.539851, 0.847638) + +[sub_resource type="Resource" id="Resource_p1ngd"] +script = ExtResource("11_lv5tc") +size = Vector3(1.07363, 0.537276, 1.1214) + +[sub_resource type="Resource" id="Resource_is18q"] +script = ExtResource("11_lv5tc") +size = Vector3(2.15312, 0.683458, 0.916096) + +[sub_resource type="Resource" id="Resource_f0xq2"] +script = ExtResource("15_terd0") +amount = 150 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_txtls"] +script = ExtResource("5_h0430") +position = Vector3(0.058, 0, 0.086) +rotation = Vector3(360, 360, 360) +scale = Vector3(4, 4, 4) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_i0o45"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 1.0 +remove_points_on_miss = true +align_with_collision_normal = true +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_tmf4u"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_f0xq2"), SubResource("Resource_txtls"), SubResource("Resource_i0o45")]) + +[sub_resource type="Curve3D" id="Curve3D_lorvn"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -3.37811, 0, 0.414886, 0, 0, 0, 0, 0, 0, -6.85248, 0, 0.176656, 0, 0, 0, 0, 0, 0, -6.65984, 0, -2.15071, 0, 0, 0, 0, 0, 0, 0.0761006, 0, -2.44185, 0, 0, 0, 0, 0, 0, 0.0166965, 0, -0.474161), +"tilts": PackedFloat32Array(0, 0, 0, 0, 0) +} +point_count = 5 + +[sub_resource type="Resource" id="Resource_ojpr0"] +script = ExtResource("8_vjeqj") +closed = true +thickness = 0.0 +curve = SubResource("Curve3D_lorvn") + +[sub_resource type="Resource" id="Resource_s5vim"] +script = ExtResource("15_terd0") +amount = 13 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_71r1e"] +script = ExtResource("12_04tbd") +iterations = 5 +offset_step = 0.02 +consecutive_step_multiplier = 0.35 +use_computeshader = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_7g71n"] +script = ExtResource("5_h0430") +position = Vector3(1, 1, 1) +rotation = Vector3(0, 360, 0) +scale = Vector3(0.2, 0.2, 0.2) +enabled = true +override_global_seed = true +custom_seed = 9 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_xgx45"] +script = ExtResource("13_s5uny") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 1.0 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_itou7"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_s5vim"), SubResource("Resource_71r1e"), SubResource("Resource_7g71n"), SubResource("Resource_xgx45")]) + +[sub_resource type="Resource" id="Resource_bpfxh"] +script = ExtResource("9_mhcwm") +radius = 1.57673 + +[sub_resource type="Resource" id="Resource_rspgw"] +script = ExtResource("9_mhcwm") +radius = 1.57673 + +[sub_resource type="Resource" id="Resource_rkfbt"] +script = ExtResource("4_cnevb") +spacing = Vector3(0.78, 2, 0.78) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_58g4b"] +script = ExtResource("17_2af2s") +amount = 1 +min_amount = -1 +local_offset = true +offset = Vector3(0.39, 0, 0) +local_rotation = false +rotation = Vector3(0, 0, 0) +individual_rotation_pivots = true +rotation_pivot = Vector3(0, 0, 0) +local_scale = true +scale = Vector3(1, 1, 1) +randomize_indices = false +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_187ca"] +script = ExtResource("17_2af2s") +amount = 1 +min_amount = -1 +local_offset = true +offset = Vector3(0.195, 0, 0.39) +local_rotation = false +rotation = Vector3(0, 0, 0) +individual_rotation_pivots = true +rotation_pivot = Vector3(0, 0, 0) +local_scale = true +scale = Vector3(1, 1, 1) +randomize_indices = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_3s5c4"] +script = ExtResource("5_h0430") +position = Vector3(0, 0.02, 0) +rotation = Vector3(0, 0, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_jft8j"] +script = ExtResource("2_wdwa6") +stack = Array[Resource("res://addons/proton_scatter/src/modifiers/base_modifier.gd")]([SubResource("Resource_rkfbt"), SubResource("Resource_58g4b"), SubResource("Resource_187ca"), SubResource("Resource_3s5c4")]) + +[sub_resource type="Resource" id="Resource_3agf6"] +script = ExtResource("11_lv5tc") +size = Vector3(3.74466, 1, 3.51889) + +[node name="ProtonScatterShowcase" type="Node3D"] +process_mode = 4 + +[node name="Lighting" type="Node3D" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Lighting"] +transform = Transform3D(0.422618, -0.383022, 0.821394, 0, 0.906308, 0.422618, -0.906308, -0.178606, 0.383022, 0, 2.29496, 0) +light_color = Color(1, 0.941176, 0.921569, 1) +light_energy = 2.0 +light_indirect_energy = 0.5 +shadow_enabled = true +shadow_opacity = 0.85 +shadow_blur = 0.2 +directional_shadow_max_distance = 20.0 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="Lighting"] +environment = SubResource("Environment_1kod5") + +[node name="Camera3D" type="Camera3D" parent="Lighting"] +transform = Transform3D(1, 0, 0, 0, 0.98872, 0.149777, 0, -0.149777, 0.98872, -3.319, 2.435, 4.146) + +[node name="gobot" parent="." instance=ExtResource("15_mnk3f")] +transform = Transform3D(0.265388, -0.0494263, 0.420864, 0.0428064, 0.497174, 0.0313953, -0.421589, 0.0193675, 0.26812, -5.95323, 0.542806, 0.830116) + +[node name="Water" type="MeshInstance3D" parent="."] +material_override = ExtResource("3_yrj3o") +cast_shadow = 0 +mesh = SubResource("PlaneMesh_84bvf") +metadata/_edit_lock_ = true +metadata/_edit_group_ = true + +[node name="MainGround" type="Node3D" parent="."] +process_mode = 3 +script = ExtResource("1_odnwj") +render_mode = 1 +modifier_stack = SubResource("Resource_nl1d8") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="MainGround"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.4 +path = "res://addons/proton_scatter/demos/assets/large_rock.tscn" + +[node name="PathShape" type="Node3D" parent="MainGround"] +script = ExtResource("4_5klvy") +shape = SubResource("Resource_ftiyl") + +[node name="BackgroundMountain" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 68.323, 0, -80.067) +script = ExtResource("1_odnwj") +modifier_stack = SubResource("Resource_56f0d") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="BackgroundMountain"] +script = ExtResource("3_tn31i") +path = "res://addons/proton_scatter/demos/assets/large_rock.tscn" + +[node name="BoxShape" type="Node3D" parent="BackgroundMountain"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.41334, -0.086071, -0.341324) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_1jvqx") + +[node name="Trees" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.64893, 0, -0.774464) +script = ExtResource("1_odnwj") +render_mode = 1 +scatter_parent = NodePath("../MainGround") +modifier_stack = SubResource("Resource_vl457") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="Trees"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.4 +path = "res://addons/proton_scatter/demos/assets/pine_tree.tscn" + +[node name="PathShape" type="Node3D" parent="Trees"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0376822, 0, -0.0782702) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_jto6x") + +[node name="SmallRocks" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.58903, 0.624608, -1.05701) +script = ExtResource("1_odnwj") +scatter_parent = NodePath("../MainGround") +modifier_stack = SubResource("Resource_ac5wm") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="SmallRocks"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.2 +path = "res://addons/proton_scatter/demos/assets/small_rock.tscn" + +[node name="BoxShape" type="Node3D" parent="SmallRocks"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.279, -0.69077, 0.16165) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_0weea") + +[node name="Grass" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.53694, 0.590527, -0.866904) +script = ExtResource("1_odnwj") +scatter_parent = NodePath("../MainGround") +modifier_stack = SubResource("Resource_ywyik") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="Grass"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.15 +path = "res://addons/proton_scatter/demos/assets/grass_2.tscn" + +[node name="SphereShape" type="Node3D" parent="Grass"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.66162, 1.19209e-07, -0.977096) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_iou5c") + +[node name="SphereShape2" type="Node3D" parent="Grass"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.21329, 0.0320051, -0.71306) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_llvm5") + +[node name="Mushrooms" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.48012, 0.850601, -0.986201) +script = ExtResource("1_odnwj") +scatter_parent = NodePath("../Trees") +dbg_disable_thread = true +modifier_stack = SubResource("Resource_01as6") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="Mushrooms"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.2 +path = "res://addons/proton_scatter/demos/assets/mushroom.tscn" + +[node name="ScatterShape" type="Node3D" parent="Mushrooms"] +transform = Transform3D(0.992366, 0, 0.123324, -0.00806148, 0.997861, 0.0648693, -0.12306, -0.0653683, 0.990244, -0.545904, 0.200069, -0.0382232) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_272xj") + +[node name="ScatterShape2" type="Node3D" parent="Mushrooms"] +transform = Transform3D(0.702501, 0, 0.711683, 0, 1, 0, -0.711683, 0, 0.702501, -2.18823, 0.0800232, 0.866356) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_p1ngd") + +[node name="ScatterShape3" type="Node3D" parent="Mushrooms"] +transform = Transform3D(0.82657, 0, 0.562834, 0, 1, 0, -0.562834, 0, 0.82657, -2.31684, 0.0552569, -1.67132) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_is18q") + +[node name="DeadBranches" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.572101, 0) +script = ExtResource("1_odnwj") +scatter_parent = NodePath("../MainGround") +modifier_stack = SubResource("Resource_tmf4u") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="DeadBranches"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.6 +path = "res://addons/proton_scatter/demos/assets/dead_branch.tscn" + +[node name="ScatterShape" type="Node3D" parent="DeadBranches"] +script = ExtResource("4_5klvy") +shape = SubResource("Resource_ojpr0") + +[node name="Bushes" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.222831, 0.534039, -1.07373) +script = ExtResource("1_odnwj") +modifier_stack = SubResource("Resource_itou7") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="Bushes"] +script = ExtResource("3_tn31i") +source_scale_multiplier = 0.7 +path = "res://addons/proton_scatter/demos/assets/bush.tscn" + +[node name="ScatterShape" type="Node3D" parent="Bushes"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.300213, 4.76837e-07, -0.398241) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_bpfxh") + +[node name="ScatterShape2" type="Node3D" parent="Bushes"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.9127, 4.76837e-07, -1.13497) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_rspgw") + +[node name="Platform" type="Node3D" parent="."] +process_mode = 3 +transform = Transform3D(0.330514, 0, 0.943801, 0, 1, 0, -0.943801, 0, 0.330514, -12.248, 0, -5.402) +script = ExtResource("1_odnwj") +dbg_disable_thread = true +modifier_stack = SubResource("Resource_jft8j") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) + +[node name="ScatterItem" type="Node3D" parent="Platform"] +script = ExtResource("3_tn31i") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Platform"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.248102, 0, 0.914603) +script = ExtResource("4_5klvy") +shape = SubResource("Resource_3agf6") + +[node name="LoadingScreen" type="PanelContainer" parent="."] +visible = false +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("18_0clps") + +[node name="Label" type="Label" parent="LoadingScreen"] +layout_mode = 2 +size_flags_horizontal = 4 +text = "Loading" + +[connection signal="build_completed" from="Grass" to="LoadingScreen" method="_on_scatter_build_completed"] diff --git a/addons/proton_scatter/icons/add.svg b/addons/proton_scatter/icons/add.svg new file mode 100644 index 0000000..a241829 --- /dev/null +++ b/addons/proton_scatter/icons/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/add.svg.import b/addons/proton_scatter/icons/add.svg.import new file mode 100644 index 0000000..3ebedbd --- /dev/null +++ b/addons/proton_scatter/icons/add.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cun73k8jdmr4e" +path="res://.godot/imported/add.svg-c8c46053442728f2bca87eb859e046e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/add.svg" +dest_files=["res://.godot/imported/add.svg-c8c46053442728f2bca87eb859e046e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/arrow_down.svg b/addons/proton_scatter/icons/arrow_down.svg new file mode 100644 index 0000000..fac4a77 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_down.svg @@ -0,0 +1,44 @@ + + + + + + diff --git a/addons/proton_scatter/icons/arrow_down.svg.import b/addons/proton_scatter/icons/arrow_down.svg.import new file mode 100644 index 0000000..8f2c10e --- /dev/null +++ b/addons/proton_scatter/icons/arrow_down.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://t8c6kjbvst0s" +path="res://.godot/imported/arrow_down.svg-94d8c386a02d5ab5968e7f312ec47343.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/arrow_down.svg" +dest_files=["res://.godot/imported/arrow_down.svg-94d8c386a02d5ab5968e7f312ec47343.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/arrow_exp.svg b/addons/proton_scatter/icons/arrow_exp.svg new file mode 100644 index 0000000..41a4cf0 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_exp.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/arrow_exp.svg.import b/addons/proton_scatter/icons/arrow_exp.svg.import new file mode 100644 index 0000000..a785c51 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_exp.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmya2s68yulpy" +path="res://.godot/imported/arrow_exp.svg-fd5b1563541a12b14d65e57fc0f36590.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/arrow_exp.svg" +dest_files=["res://.godot/imported/arrow_exp.svg-fd5b1563541a12b14d65e57fc0f36590.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/arrow_linear.svg b/addons/proton_scatter/icons/arrow_linear.svg new file mode 100644 index 0000000..caacb92 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_linear.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/arrow_linear.svg.import b/addons/proton_scatter/icons/arrow_linear.svg.import new file mode 100644 index 0000000..01fcb2c --- /dev/null +++ b/addons/proton_scatter/icons/arrow_linear.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm7lc1p200gub" +path="res://.godot/imported/arrow_linear.svg-70f906a141e572f767722ba1a068dc9c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/arrow_linear.svg" +dest_files=["res://.godot/imported/arrow_linear.svg-70f906a141e572f767722ba1a068dc9c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/arrow_log.svg b/addons/proton_scatter/icons/arrow_log.svg new file mode 100644 index 0000000..4de912c --- /dev/null +++ b/addons/proton_scatter/icons/arrow_log.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/arrow_log.svg.import b/addons/proton_scatter/icons/arrow_log.svg.import new file mode 100644 index 0000000..8437eab --- /dev/null +++ b/addons/proton_scatter/icons/arrow_log.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bddikp3dyx8cb" +path="res://.godot/imported/arrow_log.svg-96f79bb83be8195a3bfdf4d6bc1ab504.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/arrow_log.svg" +dest_files=["res://.godot/imported/arrow_log.svg-96f79bb83be8195a3bfdf4d6bc1ab504.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/arrow_right.svg b/addons/proton_scatter/icons/arrow_right.svg new file mode 100644 index 0000000..3316c55 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_right.svg @@ -0,0 +1,44 @@ + + + + + + diff --git a/addons/proton_scatter/icons/arrow_right.svg.import b/addons/proton_scatter/icons/arrow_right.svg.import new file mode 100644 index 0000000..42e4386 --- /dev/null +++ b/addons/proton_scatter/icons/arrow_right.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cu2t8yylseggu" +path="res://.godot/imported/arrow_right.svg-6771a48f7c1fe79d13059447d2bf9f07.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/arrow_right.svg" +dest_files=["res://.godot/imported/arrow_right.svg-6771a48f7c1fe79d13059447d2bf9f07.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/cache.svg b/addons/proton_scatter/icons/cache.svg new file mode 100644 index 0000000..e45ad80 --- /dev/null +++ b/addons/proton_scatter/icons/cache.svg @@ -0,0 +1,69 @@ + + diff --git a/addons/proton_scatter/icons/cache.svg.import b/addons/proton_scatter/icons/cache.svg.import new file mode 100644 index 0000000..ee9cdde --- /dev/null +++ b/addons/proton_scatter/icons/cache.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4op5ha8qjlma" +path="res://.godot/imported/cache.svg-cb20e369c40cb12fb2d5b9a87ba41311.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/cache.svg" +dest_files=["res://.godot/imported/cache.svg-cb20e369c40cb12fb2d5b9a87ba41311.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/checker.png b/addons/proton_scatter/icons/checker.png new file mode 100644 index 0000000..9abdc75 Binary files /dev/null and b/addons/proton_scatter/icons/checker.png differ diff --git a/addons/proton_scatter/icons/checker.png.import b/addons/proton_scatter/icons/checker.png.import new file mode 100644 index 0000000..2f66eed --- /dev/null +++ b/addons/proton_scatter/icons/checker.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bftnx7jk6thqp" +path="res://.godot/imported/checker.png-9f555d2536e1ecfbf8f3b94004e5deef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/checker.png" +dest_files=["res://.godot/imported/checker.png-9f555d2536e1ecfbf8f3b94004e5deef.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/icons/clear.svg b/addons/proton_scatter/icons/clear.svg new file mode 100644 index 0000000..43c0031 --- /dev/null +++ b/addons/proton_scatter/icons/clear.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/clear.svg.import b/addons/proton_scatter/icons/clear.svg.import new file mode 100644 index 0000000..00ea6b1 --- /dev/null +++ b/addons/proton_scatter/icons/clear.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bosx22dy64f11" +path="res://.godot/imported/clear.svg-46e0566a8856183197fd37d5ccb84c9b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/clear.svg" +dest_files=["res://.godot/imported/clear.svg-46e0566a8856183197fd37d5ccb84c9b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/close.svg b/addons/proton_scatter/icons/close.svg new file mode 100644 index 0000000..4147c7b --- /dev/null +++ b/addons/proton_scatter/icons/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/close.svg.import b/addons/proton_scatter/icons/close.svg.import new file mode 100644 index 0000000..f6519df --- /dev/null +++ b/addons/proton_scatter/icons/close.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dahwdjl2er75o" +path="res://.godot/imported/close.svg-19437f97d2c1854efc880c19f78fe32e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/close.svg" +dest_files=["res://.godot/imported/close.svg-19437f97d2c1854efc880c19f78fe32e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/curve_close.svg b/addons/proton_scatter/icons/curve_close.svg new file mode 100644 index 0000000..032f1c6 --- /dev/null +++ b/addons/proton_scatter/icons/curve_close.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/curve_close.svg.import b/addons/proton_scatter/icons/curve_close.svg.import new file mode 100644 index 0000000..0c57f01 --- /dev/null +++ b/addons/proton_scatter/icons/curve_close.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7dw1ytimyv2h" +path="res://.godot/imported/curve_close.svg-c3f2c4c26453437a3980b5393ad526e4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/curve_close.svg" +dest_files=["res://.godot/imported/curve_close.svg-c3f2c4c26453437a3980b5393ad526e4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/curve_create.svg b/addons/proton_scatter/icons/curve_create.svg new file mode 100644 index 0000000..1181111 --- /dev/null +++ b/addons/proton_scatter/icons/curve_create.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/curve_create.svg.import b/addons/proton_scatter/icons/curve_create.svg.import new file mode 100644 index 0000000..8c4b74d --- /dev/null +++ b/addons/proton_scatter/icons/curve_create.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmykha5ja17vj" +path="res://.godot/imported/curve_create.svg-6aa0ae777579eb233f93eae8cfc9ae81.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/curve_create.svg" +dest_files=["res://.godot/imported/curve_create.svg-6aa0ae777579eb233f93eae8cfc9ae81.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/curve_delete.svg b/addons/proton_scatter/icons/curve_delete.svg new file mode 100644 index 0000000..901a08e --- /dev/null +++ b/addons/proton_scatter/icons/curve_delete.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/curve_delete.svg.import b/addons/proton_scatter/icons/curve_delete.svg.import new file mode 100644 index 0000000..41cfb39 --- /dev/null +++ b/addons/proton_scatter/icons/curve_delete.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cligdljx1ad5e" +path="res://.godot/imported/curve_delete.svg-8346b842c26eae7708985a1205d56c1f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/curve_delete.svg" +dest_files=["res://.godot/imported/curve_delete.svg-8346b842c26eae7708985a1205d56c1f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/curve_select.svg b/addons/proton_scatter/icons/curve_select.svg new file mode 100644 index 0000000..8f09ca6 --- /dev/null +++ b/addons/proton_scatter/icons/curve_select.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/curve_select.svg.import b/addons/proton_scatter/icons/curve_select.svg.import new file mode 100644 index 0000000..43ac48b --- /dev/null +++ b/addons/proton_scatter/icons/curve_select.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1t5x34pc4vs5" +path="res://.godot/imported/curve_select.svg-9a34ca2f976ba8714813d2d2842c56d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/curve_select.svg" +dest_files=["res://.godot/imported/curve_select.svg-9a34ca2f976ba8714813d2d2842c56d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/dice.svg b/addons/proton_scatter/icons/dice.svg new file mode 100644 index 0000000..214a745 --- /dev/null +++ b/addons/proton_scatter/icons/dice.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/dice.svg.import b/addons/proton_scatter/icons/dice.svg.import new file mode 100644 index 0000000..6480ce8 --- /dev/null +++ b/addons/proton_scatter/icons/dice.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmmefjvrdhf78" +path="res://.godot/imported/dice.svg-a3afbfd7a5e5fcaee218362e12214844.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/dice.svg" +dest_files=["res://.godot/imported/dice.svg-a3afbfd7a5e5fcaee218362e12214844.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/disabled.svg.import b/addons/proton_scatter/icons/disabled.svg.import new file mode 100644 index 0000000..8097f19 --- /dev/null +++ b/addons/proton_scatter/icons/disabled.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs1fqiny4gnuh" +path="res://.godot/imported/disabled.svg-243ccf1f821ecaaa0c9f25c00a10ad6e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/disabled.svg" +dest_files=["res://.godot/imported/disabled.svg-243ccf1f821ecaaa0c9f25c00a10ad6e.ctex"] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 diff --git a/addons/proton_scatter/icons/doc.svg b/addons/proton_scatter/icons/doc.svg new file mode 100644 index 0000000..89c8735 --- /dev/null +++ b/addons/proton_scatter/icons/doc.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/doc.svg.import b/addons/proton_scatter/icons/doc.svg.import new file mode 100644 index 0000000..5926e6c --- /dev/null +++ b/addons/proton_scatter/icons/doc.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do8d3urxirjoa" +path="res://.godot/imported/doc.svg-c884c073ce3af0f82fb9ddd41a433df9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/doc.svg" +dest_files=["res://.godot/imported/doc.svg-c884c073ce3af0f82fb9ddd41a433df9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/documentation.svg b/addons/proton_scatter/icons/documentation.svg new file mode 100644 index 0000000..113612b --- /dev/null +++ b/addons/proton_scatter/icons/documentation.svg @@ -0,0 +1,44 @@ + + + + + + diff --git a/addons/proton_scatter/icons/documentation.svg.import b/addons/proton_scatter/icons/documentation.svg.import new file mode 100644 index 0000000..57ee984 --- /dev/null +++ b/addons/proton_scatter/icons/documentation.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://06vw5f8awtr6" +path="res://.godot/imported/documentation.svg-b993be041793a6dc87d64c5610aff12d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/documentation.svg" +dest_files=["res://.godot/imported/documentation.svg-b993be041793a6dc87d64c5610aff12d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/down.svg.import b/addons/proton_scatter/icons/down.svg.import new file mode 100644 index 0000000..5303f0e --- /dev/null +++ b/addons/proton_scatter/icons/down.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pnkkrn8h6eun" +path="res://.godot/imported/down.svg-4ff1b431a92a8a32e3f77e063ceb84e2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/down.svg" +dest_files=["res://.godot/imported/down.svg-4ff1b431a92a8a32e3f77e063ceb84e2.ctex"] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 diff --git a/addons/proton_scatter/icons/drag_area.svg b/addons/proton_scatter/icons/drag_area.svg new file mode 100644 index 0000000..43efb22 --- /dev/null +++ b/addons/proton_scatter/icons/drag_area.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/addons/proton_scatter/icons/drag_area.svg.import b/addons/proton_scatter/icons/drag_area.svg.import new file mode 100644 index 0000000..8d451c1 --- /dev/null +++ b/addons/proton_scatter/icons/drag_area.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ba6cx70dyeuhg" +path="res://.godot/imported/drag_area.svg-b54df88063d806fbe992617a87621f6f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/drag_area.svg" +dest_files=["res://.godot/imported/drag_area.svg-b54df88063d806fbe992617a87621f6f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/duplicate.svg b/addons/proton_scatter/icons/duplicate.svg new file mode 100644 index 0000000..d258f5a --- /dev/null +++ b/addons/proton_scatter/icons/duplicate.svg @@ -0,0 +1,44 @@ + + diff --git a/addons/proton_scatter/icons/duplicate.svg.import b/addons/proton_scatter/icons/duplicate.svg.import new file mode 100644 index 0000000..255cbd1 --- /dev/null +++ b/addons/proton_scatter/icons/duplicate.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d2ajwyebaobjt" +path="res://.godot/imported/duplicate.svg-01a6fe9bb8397972ec3661dd5bf196ff.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/duplicate.svg" +dest_files=["res://.godot/imported/duplicate.svg-01a6fe9bb8397972ec3661dd5bf196ff.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/enabled.svg.import b/addons/proton_scatter/icons/enabled.svg.import new file mode 100644 index 0000000..a4ac5a5 --- /dev/null +++ b/addons/proton_scatter/icons/enabled.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pqr6rieoatt2" +path="res://.godot/imported/enabled.svg-3ee60e316a7df006c36d7328b1ff7080.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/enabled.svg" +dest_files=["res://.godot/imported/enabled.svg-3ee60e316a7df006c36d7328b1ff7080.ctex"] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 diff --git a/addons/proton_scatter/icons/exclude_path.svg b/addons/proton_scatter/icons/exclude_path.svg new file mode 100644 index 0000000..05866e3 --- /dev/null +++ b/addons/proton_scatter/icons/exclude_path.svg @@ -0,0 +1,77 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/proton_scatter/icons/exclude_path.svg.import b/addons/proton_scatter/icons/exclude_path.svg.import new file mode 100644 index 0000000..45e9def --- /dev/null +++ b/addons/proton_scatter/icons/exclude_path.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs4q8qewsd62t" +path="res://.godot/imported/exclude_path.svg-37e9f158a2b3b23dcb473984cd7d4d35.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/exclude_path.svg" +dest_files=["res://.godot/imported/exclude_path.svg-37e9f158a2b3b23dcb473984cd7d4d35.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/global.svg b/addons/proton_scatter/icons/global.svg new file mode 100644 index 0000000..d23299e --- /dev/null +++ b/addons/proton_scatter/icons/global.svg @@ -0,0 +1,48 @@ + + + + + + + diff --git a/addons/proton_scatter/icons/global.svg.import b/addons/proton_scatter/icons/global.svg.import new file mode 100644 index 0000000..76524a5 --- /dev/null +++ b/addons/proton_scatter/icons/global.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://71efqwg3d70v" +path="res://.godot/imported/global.svg-e31c6e1d6185e37600fc56d0988ca1ec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/global.svg" +dest_files=["res://.godot/imported/global.svg-e31c6e1d6185e37600fc56d0988ca1ec.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/group.svg b/addons/proton_scatter/icons/group.svg new file mode 100644 index 0000000..5ec0350 --- /dev/null +++ b/addons/proton_scatter/icons/group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/group.svg.import b/addons/proton_scatter/icons/group.svg.import new file mode 100644 index 0000000..8bbfcb3 --- /dev/null +++ b/addons/proton_scatter/icons/group.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ve232bobw4m8" +path="res://.godot/imported/group.svg-f9589c135a827f809b97184ab4d53826.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/group.svg" +dest_files=["res://.godot/imported/group.svg-f9589c135a827f809b97184ab4d53826.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/individual_instances.svg b/addons/proton_scatter/icons/individual_instances.svg new file mode 100644 index 0000000..2d9f63b --- /dev/null +++ b/addons/proton_scatter/icons/individual_instances.svg @@ -0,0 +1,80 @@ + + + + + categories + + + + categories + + + + + + + + diff --git a/addons/proton_scatter/icons/individual_instances.svg.import b/addons/proton_scatter/icons/individual_instances.svg.import new file mode 100644 index 0000000..aebf4f5 --- /dev/null +++ b/addons/proton_scatter/icons/individual_instances.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vxd0iun0wq8i" +path="res://.godot/imported/individual_instances.svg-6f2d7e070dd53c64d21912e2f021ebd5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/individual_instances.svg" +dest_files=["res://.godot/imported/individual_instances.svg-6f2d7e070dd53c64d21912e2f021ebd5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/item.svg b/addons/proton_scatter/icons/item.svg new file mode 100644 index 0000000..8bc141c --- /dev/null +++ b/addons/proton_scatter/icons/item.svg @@ -0,0 +1,76 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/addons/proton_scatter/icons/item.svg.import b/addons/proton_scatter/icons/item.svg.import new file mode 100644 index 0000000..69f320f --- /dev/null +++ b/addons/proton_scatter/icons/item.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xcj2f4ik1law" +path="res://.godot/imported/item.svg-6af5bcafcf0e1297ab1d55a0f7c9cd35.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/item.svg" +dest_files=["res://.godot/imported/item.svg-6af5bcafcf0e1297ab1d55a0f7c9cd35.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/link.svg b/addons/proton_scatter/icons/link.svg new file mode 100644 index 0000000..909c3af --- /dev/null +++ b/addons/proton_scatter/icons/link.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/addons/proton_scatter/icons/link.svg.import b/addons/proton_scatter/icons/link.svg.import new file mode 100644 index 0000000..706e0a6 --- /dev/null +++ b/addons/proton_scatter/icons/link.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gbrmse47gdxb" +path="res://.godot/imported/link.svg-15b5849f7b24eb1c738ea9cc78c1b9b4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/link.svg" +dest_files=["res://.godot/imported/link.svg-15b5849f7b24eb1c738ea9cc78c1b9b4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/load.svg b/addons/proton_scatter/icons/load.svg new file mode 100644 index 0000000..7ee6ae2 --- /dev/null +++ b/addons/proton_scatter/icons/load.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/load.svg.import b/addons/proton_scatter/icons/load.svg.import new file mode 100644 index 0000000..0516f33 --- /dev/null +++ b/addons/proton_scatter/icons/load.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddjrq1h4mkn6a" +path="res://.godot/imported/load.svg-0da8e4247aad5735085e117978c315ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/load.svg" +dest_files=["res://.godot/imported/load.svg-0da8e4247aad5735085e117978c315ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/m_loading.tres b/addons/proton_scatter/icons/loading/m_loading.tres new file mode 100644 index 0000000..19ce324 --- /dev/null +++ b/addons/proton_scatter/icons/loading/m_loading.tres @@ -0,0 +1,20 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://do5bc6dg6mp4u"] + +[ext_resource type="Texture2D" uid="uid://dev74yqbbxjc6" path="res://addons/proton_scatter/icons/loading/t_loading.tres" id="1_7rsk1"] + +[resource] +render_priority = 120 +transparency = 1 +blend_mode = 1 +depth_draw_mode = 2 +no_depth_test = true +disable_ambient_light = true +albedo_color = Color(1, 0.498039, 0, 1) +albedo_texture = ExtResource("1_7rsk1") +emission_enabled = true +emission = Color(1, 0.411765, 0, 1) +emission_energy_multiplier = 3.5 +disable_receive_shadows = true +billboard_mode = 1 +fixed_size = true +point_size = 24.8 diff --git a/addons/proton_scatter/icons/loading/progress1.svg b/addons/proton_scatter/icons/loading/progress1.svg new file mode 100644 index 0000000..07505dd --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress1.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress1.svg.import b/addons/proton_scatter/icons/loading/progress1.svg.import new file mode 100644 index 0000000..65d20b9 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress1.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxaffg1bqa2jk" +path.s3tc="res://.godot/imported/progress1.svg-be0037fbccf447743f8ef8f47a7c0ee2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress1.svg" +dest_files=["res://.godot/imported/progress1.svg-be0037fbccf447743f8ef8f47a7c0ee2.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress2.svg b/addons/proton_scatter/icons/loading/progress2.svg new file mode 100644 index 0000000..0a48f7d --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress2.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress2.svg.import b/addons/proton_scatter/icons/loading/progress2.svg.import new file mode 100644 index 0000000..dc812fa --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress2.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dt36cq4i6vxbp" +path.s3tc="res://.godot/imported/progress2.svg-fe953d9d0296f6129c15dc4d732f5036.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress2.svg" +dest_files=["res://.godot/imported/progress2.svg-fe953d9d0296f6129c15dc4d732f5036.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress3.svg b/addons/proton_scatter/icons/loading/progress3.svg new file mode 100644 index 0000000..a7f0f9c --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress3.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress3.svg.import b/addons/proton_scatter/icons/loading/progress3.svg.import new file mode 100644 index 0000000..11c82b6 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress3.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0xe1mmwhexf3" +path.s3tc="res://.godot/imported/progress3.svg-9b96e4f9ec9592ba4e14d1fca5e2edaf.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress3.svg" +dest_files=["res://.godot/imported/progress3.svg-9b96e4f9ec9592ba4e14d1fca5e2edaf.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress4.svg b/addons/proton_scatter/icons/loading/progress4.svg new file mode 100644 index 0000000..1719209 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress4.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress4.svg.import b/addons/proton_scatter/icons/loading/progress4.svg.import new file mode 100644 index 0000000..14889f5 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress4.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b55ls3njsgrix" +path.s3tc="res://.godot/imported/progress4.svg-e2235c67c95e8b1b5d94112afa435dbe.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress4.svg" +dest_files=["res://.godot/imported/progress4.svg-e2235c67c95e8b1b5d94112afa435dbe.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress5.svg b/addons/proton_scatter/icons/loading/progress5.svg new file mode 100644 index 0000000..7289b7b --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress5.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress5.svg.import b/addons/proton_scatter/icons/loading/progress5.svg.import new file mode 100644 index 0000000..fb549e6 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress5.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fq4k4ug1df24" +path.s3tc="res://.godot/imported/progress5.svg-3fde5493af5eae7b285bd2c5003ffa8b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress5.svg" +dest_files=["res://.godot/imported/progress5.svg-3fde5493af5eae7b285bd2c5003ffa8b.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress6.svg b/addons/proton_scatter/icons/loading/progress6.svg new file mode 100644 index 0000000..3deba6d --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress6.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress6.svg.import b/addons/proton_scatter/icons/loading/progress6.svg.import new file mode 100644 index 0000000..f5b2fb2 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress6.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2kqooswn03uj" +path.s3tc="res://.godot/imported/progress6.svg-3aa5747c4f878020609e583ec4f95b8d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress6.svg" +dest_files=["res://.godot/imported/progress6.svg-3aa5747c4f878020609e583ec4f95b8d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress7.svg b/addons/proton_scatter/icons/loading/progress7.svg new file mode 100644 index 0000000..546155d --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress7.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress7.svg.import b/addons/proton_scatter/icons/loading/progress7.svg.import new file mode 100644 index 0000000..bc970ae --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress7.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8wacu74d4d6s" +path.s3tc="res://.godot/imported/progress7.svg-c2021ffd30acd67c6a669d6fc56fe8bf.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress7.svg" +dest_files=["res://.godot/imported/progress7.svg-c2021ffd30acd67c6a669d6fc56fe8bf.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/progress8.svg b/addons/proton_scatter/icons/loading/progress8.svg new file mode 100644 index 0000000..b56ffcb --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress8.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/loading/progress8.svg.import b/addons/proton_scatter/icons/loading/progress8.svg.import new file mode 100644 index 0000000..bfde135 --- /dev/null +++ b/addons/proton_scatter/icons/loading/progress8.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://boeljf8xa2s5d" +path.s3tc="res://.godot/imported/progress8.svg-f4c6912cb79e58fffa4e23976af93b45.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/icons/loading/progress8.svg" +dest_files=["res://.godot/imported/progress8.svg-f4c6912cb79e58fffa4e23976af93b45.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/loading/t_loading.tres b/addons/proton_scatter/icons/loading/t_loading.tres new file mode 100644 index 0000000..d825571 --- /dev/null +++ b/addons/proton_scatter/icons/loading/t_loading.tres @@ -0,0 +1,29 @@ +[gd_resource type="AnimatedTexture" load_steps=9 format=3 uid="uid://dev74yqbbxjc6"] + +[ext_resource type="Texture2D" uid="uid://bxaffg1bqa2jk" path="res://addons/proton_scatter/icons/loading/progress1.svg" id="1_n051c"] +[ext_resource type="Texture2D" uid="uid://dt36cq4i6vxbp" path="res://addons/proton_scatter/icons/loading/progress2.svg" id="2_huiva"] +[ext_resource type="Texture2D" uid="uid://c0xe1mmwhexf3" path="res://addons/proton_scatter/icons/loading/progress3.svg" id="3_5gmad"] +[ext_resource type="Texture2D" uid="uid://b55ls3njsgrix" path="res://addons/proton_scatter/icons/loading/progress4.svg" id="4_ypilv"] +[ext_resource type="Texture2D" uid="uid://fq4k4ug1df24" path="res://addons/proton_scatter/icons/loading/progress5.svg" id="5_o3w57"] +[ext_resource type="Texture2D" uid="uid://c2kqooswn03uj" path="res://addons/proton_scatter/icons/loading/progress6.svg" id="6_475ws"] +[ext_resource type="Texture2D" uid="uid://8wacu74d4d6s" path="res://addons/proton_scatter/icons/loading/progress7.svg" id="7_kuufk"] +[ext_resource type="Texture2D" uid="uid://boeljf8xa2s5d" path="res://addons/proton_scatter/icons/loading/progress8.svg" id="8_spub1"] + +[resource] +frames = 8 +speed_scale = 8.0 +frame_0/texture = ExtResource("1_n051c") +frame_1/texture = ExtResource("2_huiva") +frame_1/duration = 1.0 +frame_2/texture = ExtResource("3_5gmad") +frame_2/duration = 1.0 +frame_3/texture = ExtResource("4_ypilv") +frame_3/duration = 1.0 +frame_4/texture = ExtResource("5_o3w57") +frame_4/duration = 1.0 +frame_5/texture = ExtResource("6_475ws") +frame_5/duration = 1.0 +frame_6/texture = ExtResource("7_kuufk") +frame_6/duration = 1.0 +frame_7/texture = ExtResource("8_spub1") +frame_7/duration = 1.0 diff --git a/addons/proton_scatter/icons/local.svg b/addons/proton_scatter/icons/local.svg new file mode 100644 index 0000000..2d5e554 --- /dev/null +++ b/addons/proton_scatter/icons/local.svg @@ -0,0 +1,52 @@ + + + + + + + + + diff --git a/addons/proton_scatter/icons/local.svg.import b/addons/proton_scatter/icons/local.svg.import new file mode 100644 index 0000000..a278ae7 --- /dev/null +++ b/addons/proton_scatter/icons/local.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dt0ctlr32stnn" +path="res://.godot/imported/local.svg-fd1cdf9da074228b5ba1b4f8ff96c57f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/local.svg" +dest_files=["res://.godot/imported/local.svg-fd1cdf9da074228b5ba1b4f8ff96c57f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/menu.svg b/addons/proton_scatter/icons/menu.svg new file mode 100644 index 0000000..20c5300 --- /dev/null +++ b/addons/proton_scatter/icons/menu.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/proton_scatter/icons/menu.svg.import b/addons/proton_scatter/icons/menu.svg.import new file mode 100644 index 0000000..8eb432f --- /dev/null +++ b/addons/proton_scatter/icons/menu.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://n66mufjib4ds" +path="res://.godot/imported/menu.svg-f26f5349a7002ba943a58d37d6a062f2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/menu.svg" +dest_files=["res://.godot/imported/menu.svg-f26f5349a7002ba943a58d37d6a062f2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/point.svg b/addons/proton_scatter/icons/point.svg new file mode 100644 index 0000000..1447124 --- /dev/null +++ b/addons/proton_scatter/icons/point.svg @@ -0,0 +1,65 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/proton_scatter/icons/point.svg.import b/addons/proton_scatter/icons/point.svg.import new file mode 100644 index 0000000..b7acc71 --- /dev/null +++ b/addons/proton_scatter/icons/point.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4v52mh8eu14l" +path="res://.godot/imported/point.svg-5132d8b7a9cb8505d146d1f26f8e5bd1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/point.svg" +dest_files=["res://.godot/imported/point.svg-5132d8b7a9cb8505d146d1f26f8e5bd1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/rebuild.svg b/addons/proton_scatter/icons/rebuild.svg new file mode 100644 index 0000000..d69e6a7 --- /dev/null +++ b/addons/proton_scatter/icons/rebuild.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/rebuild.svg.import b/addons/proton_scatter/icons/rebuild.svg.import new file mode 100644 index 0000000..4b248d5 --- /dev/null +++ b/addons/proton_scatter/icons/rebuild.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yqlpvcmb7mfi" +path="res://.godot/imported/rebuild.svg-fbde9fa19dc213c85b24bc3d3a1fb89d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/rebuild.svg" +dest_files=["res://.godot/imported/rebuild.svg-fbde9fa19dc213c85b24bc3d3a1fb89d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/remove.svg b/addons/proton_scatter/icons/remove.svg new file mode 100644 index 0000000..eb8e244 --- /dev/null +++ b/addons/proton_scatter/icons/remove.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/remove.svg.import b/addons/proton_scatter/icons/remove.svg.import new file mode 100644 index 0000000..78d4295 --- /dev/null +++ b/addons/proton_scatter/icons/remove.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://btb6rqhhi27mx" +path="res://.godot/imported/remove.svg-8b603896066014738ad4a8d4a482bb8e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/remove.svg" +dest_files=["res://.godot/imported/remove.svg-8b603896066014738ad4a8d4a482bb8e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/restrict_volume.svg b/addons/proton_scatter/icons/restrict_volume.svg new file mode 100644 index 0000000..af4ffbf --- /dev/null +++ b/addons/proton_scatter/icons/restrict_volume.svg @@ -0,0 +1,54 @@ + + + + + height-arrow + + + + + height-arrow + + + + diff --git a/addons/proton_scatter/icons/restrict_volume.svg.import b/addons/proton_scatter/icons/restrict_volume.svg.import new file mode 100644 index 0000000..5571b9b --- /dev/null +++ b/addons/proton_scatter/icons/restrict_volume.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmvfdl1wnrw4" +path="res://.godot/imported/restrict_volume.svg-9476f4ee23ebb4f320f21a45306967ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/restrict_volume.svg" +dest_files=["res://.godot/imported/restrict_volume.svg-9476f4ee23ebb4f320f21a45306967ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/restrict_volume_lock.svg b/addons/proton_scatter/icons/restrict_volume_lock.svg new file mode 100644 index 0000000..88bdfb7 --- /dev/null +++ b/addons/proton_scatter/icons/restrict_volume_lock.svg @@ -0,0 +1,59 @@ + + + + + height-arrow + + + + + height-arrow + + + + + diff --git a/addons/proton_scatter/icons/restrict_volume_lock.svg.import b/addons/proton_scatter/icons/restrict_volume_lock.svg.import new file mode 100644 index 0000000..ee9070f --- /dev/null +++ b/addons/proton_scatter/icons/restrict_volume_lock.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p2v2cqm7k60o" +path="res://.godot/imported/restrict_volume_lock.svg-a29ed4343f793eec0d6ceda09d847281.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/restrict_volume_lock.svg" +dest_files=["res://.godot/imported/restrict_volume_lock.svg-a29ed4343f793eec0d6ceda09d847281.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/right.svg.import b/addons/proton_scatter/icons/right.svg.import new file mode 100644 index 0000000..9a40282 --- /dev/null +++ b/addons/proton_scatter/icons/right.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5x3svtghg355" +path="res://.godot/imported/right.svg-223d435f72cc2f37c84f07b38111fb2a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/right.svg" +dest_files=["res://.godot/imported/right.svg-223d435f72cc2f37c84f07b38111fb2a.ctex"] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 diff --git a/addons/proton_scatter/icons/save.svg b/addons/proton_scatter/icons/save.svg new file mode 100644 index 0000000..be5d3ef --- /dev/null +++ b/addons/proton_scatter/icons/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/save.svg.import b/addons/proton_scatter/icons/save.svg.import new file mode 100644 index 0000000..e109c71 --- /dev/null +++ b/addons/proton_scatter/icons/save.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2omj2e03x72e" +path="res://.godot/imported/save.svg-cdd3febbdfafdd18b4e7e1eca8b243ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/save.svg" +dest_files=["res://.godot/imported/save.svg-cdd3febbdfafdd18b4e7e1eca8b243ee.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/scatter.svg b/addons/proton_scatter/icons/scatter.svg new file mode 100644 index 0000000..9092f4a --- /dev/null +++ b/addons/proton_scatter/icons/scatter.svg @@ -0,0 +1,88 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/addons/proton_scatter/icons/scatter.svg.import b/addons/proton_scatter/icons/scatter.svg.import new file mode 100644 index 0000000..0eab6a5 --- /dev/null +++ b/addons/proton_scatter/icons/scatter.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chwotbfago2uu" +path="res://.godot/imported/scatter.svg-bfff578dc360b745c3834db069a4a315.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/scatter.svg" +dest_files=["res://.godot/imported/scatter.svg-bfff578dc360b745c3834db069a4a315.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/select_all.svg b/addons/proton_scatter/icons/select_all.svg new file mode 100644 index 0000000..4440149 --- /dev/null +++ b/addons/proton_scatter/icons/select_all.svg @@ -0,0 +1,39 @@ + + diff --git a/addons/proton_scatter/icons/select_all.svg.import b/addons/proton_scatter/icons/select_all.svg.import new file mode 100644 index 0000000..c9d40da --- /dev/null +++ b/addons/proton_scatter/icons/select_all.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uytbptu3a34s" +path="res://.godot/imported/select_all.svg-791a69a69cd2b6a9baadee0215a94edb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/select_all.svg" +dest_files=["res://.godot/imported/select_all.svg-791a69a69cd2b6a9baadee0215a94edb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/shape.svg b/addons/proton_scatter/icons/shape.svg new file mode 100644 index 0000000..1335f5a --- /dev/null +++ b/addons/proton_scatter/icons/shape.svg @@ -0,0 +1,41 @@ + + diff --git a/addons/proton_scatter/icons/shape.svg.import b/addons/proton_scatter/icons/shape.svg.import new file mode 100644 index 0000000..26fdac0 --- /dev/null +++ b/addons/proton_scatter/icons/shape.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b51u02uqdpkrj" +path="res://.godot/imported/shape.svg-d62cbd79ae44bc9e71e9bf0357acae87.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/shape.svg" +dest_files=["res://.godot/imported/shape.svg-d62cbd79ae44bc9e71e9bf0357acae87.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/square_handle.svg b/addons/proton_scatter/icons/square_handle.svg new file mode 100644 index 0000000..4df41e2 --- /dev/null +++ b/addons/proton_scatter/icons/square_handle.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/proton_scatter/icons/square_handle.svg.import b/addons/proton_scatter/icons/square_handle.svg.import new file mode 100644 index 0000000..d6a6473 --- /dev/null +++ b/addons/proton_scatter/icons/square_handle.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5ip0ugocre1l" +path="res://.godot/imported/square_handle.svg-3a66112fe1576c8f64a3c4d4e7121ea4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/square_handle.svg" +dest_files=["res://.godot/imported/square_handle.svg-3a66112fe1576c8f64a3c4d4e7121ea4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/bool.svg b/addons/proton_scatter/icons/types/bool.svg new file mode 100644 index 0000000..674cbc9 --- /dev/null +++ b/addons/proton_scatter/icons/types/bool.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/bool.svg.import b/addons/proton_scatter/icons/types/bool.svg.import new file mode 100644 index 0000000..2ee3f3d --- /dev/null +++ b/addons/proton_scatter/icons/types/bool.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnrguyqhdq7qh" +path="res://.godot/imported/bool.svg-52b1fa0447a042bcdc16ea428ddd807d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/bool.svg" +dest_files=["res://.godot/imported/bool.svg-52b1fa0447a042bcdc16ea428ddd807d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/curve.svg b/addons/proton_scatter/icons/types/curve.svg new file mode 100644 index 0000000..8b330b7 --- /dev/null +++ b/addons/proton_scatter/icons/types/curve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/types/curve.svg.import b/addons/proton_scatter/icons/types/curve.svg.import new file mode 100644 index 0000000..ad1b6f3 --- /dev/null +++ b/addons/proton_scatter/icons/types/curve.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjv6vm1tf8rex" +path="res://.godot/imported/curve.svg-aac852ce2008b2aa544030f27fdb3fb7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/curve.svg" +dest_files=["res://.godot/imported/curve.svg-aac852ce2008b2aa544030f27fdb3fb7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/float.svg b/addons/proton_scatter/icons/types/float.svg new file mode 100644 index 0000000..b941332 --- /dev/null +++ b/addons/proton_scatter/icons/types/float.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/float.svg.import b/addons/proton_scatter/icons/types/float.svg.import new file mode 100644 index 0000000..28ae2ec --- /dev/null +++ b/addons/proton_scatter/icons/types/float.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cpt5bs4irj0kc" +path="res://.godot/imported/float.svg-04e5d7ce1dc5bf58d92d7b3e90c1bdb9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/float.svg" +dest_files=["res://.godot/imported/float.svg-04e5d7ce1dc5bf58d92d7b3e90c1bdb9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/int.svg b/addons/proton_scatter/icons/types/int.svg new file mode 100644 index 0000000..b943822 --- /dev/null +++ b/addons/proton_scatter/icons/types/int.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/int.svg.import b/addons/proton_scatter/icons/types/int.svg.import new file mode 100644 index 0000000..b6b5adf --- /dev/null +++ b/addons/proton_scatter/icons/types/int.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b76u8wvdxv7xk" +path="res://.godot/imported/int.svg-6257f86dd757be1a7e16525e9e4334a4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/int.svg" +dest_files=["res://.godot/imported/int.svg-6257f86dd757be1a7e16525e9e4334a4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/string.svg b/addons/proton_scatter/icons/types/string.svg new file mode 100644 index 0000000..abcb92d --- /dev/null +++ b/addons/proton_scatter/icons/types/string.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/string.svg.import b/addons/proton_scatter/icons/types/string.svg.import new file mode 100644 index 0000000..80cfb2d --- /dev/null +++ b/addons/proton_scatter/icons/types/string.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://duc0v0ndpdima" +path="res://.godot/imported/string.svg-47c2a4465e2fc23004707a7f638ee11f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/string.svg" +dest_files=["res://.godot/imported/string.svg-47c2a4465e2fc23004707a7f638ee11f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/texture.svg b/addons/proton_scatter/icons/types/texture.svg new file mode 100644 index 0000000..bb7831e --- /dev/null +++ b/addons/proton_scatter/icons/types/texture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/proton_scatter/icons/types/texture.svg.import b/addons/proton_scatter/icons/types/texture.svg.import new file mode 100644 index 0000000..d0ff5ed --- /dev/null +++ b/addons/proton_scatter/icons/types/texture.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn2bmd4exvdfh" +path="res://.godot/imported/texture.svg-b3e461acf41426098532cfe288615e66.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/texture.svg" +dest_files=["res://.godot/imported/texture.svg-b3e461acf41426098532cfe288615e66.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/vector2.svg b/addons/proton_scatter/icons/types/vector2.svg new file mode 100644 index 0000000..2bab922 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector2.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/vector2.svg.import b/addons/proton_scatter/icons/types/vector2.svg.import new file mode 100644 index 0000000..73c1189 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector2.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjei816k8tqwm" +path="res://.godot/imported/vector2.svg-4fbd1b82783fdf0be277b45f49bbe354.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/vector2.svg" +dest_files=["res://.godot/imported/vector2.svg-4fbd1b82783fdf0be277b45f49bbe354.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/vector2i.svg b/addons/proton_scatter/icons/types/vector2i.svg new file mode 100644 index 0000000..f292354 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector2i.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/vector2i.svg.import b/addons/proton_scatter/icons/types/vector2i.svg.import new file mode 100644 index 0000000..40a119a --- /dev/null +++ b/addons/proton_scatter/icons/types/vector2i.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5ue6la1myxjv" +path="res://.godot/imported/vector2i.svg-77972f3560d45185f38f11485fade0c2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/vector2i.svg" +dest_files=["res://.godot/imported/vector2i.svg-77972f3560d45185f38f11485fade0c2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/vector3.svg b/addons/proton_scatter/icons/types/vector3.svg new file mode 100644 index 0000000..85cac57 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector3.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/vector3.svg.import b/addons/proton_scatter/icons/types/vector3.svg.import new file mode 100644 index 0000000..def0233 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector3.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rdfs8dixiw02" +path="res://.godot/imported/vector3.svg-e5e507d504b3fec450fe9420cf2ed166.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/vector3.svg" +dest_files=["res://.godot/imported/vector3.svg-e5e507d504b3fec450fe9420cf2ed166.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/types/vector3i.svg b/addons/proton_scatter/icons/types/vector3i.svg new file mode 100644 index 0000000..26e9c1b --- /dev/null +++ b/addons/proton_scatter/icons/types/vector3i.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/types/vector3i.svg.import b/addons/proton_scatter/icons/types/vector3i.svg.import new file mode 100644 index 0000000..54ec928 --- /dev/null +++ b/addons/proton_scatter/icons/types/vector3i.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccprltc2l2a7x" +path="res://.godot/imported/vector3i.svg-b66d3d08e0e2fa48c2f0d287a8b08f1a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/types/vector3i.svg" +dest_files=["res://.godot/imported/vector3i.svg-b66d3d08e0e2fa48c2f0d287a8b08f1a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/icons/up.svg.import b/addons/proton_scatter/icons/up.svg.import new file mode 100644 index 0000000..b8c738f --- /dev/null +++ b/addons/proton_scatter/icons/up.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdp3ycc2b7kyg" +path="res://.godot/imported/up.svg-93c9110a5b9e596fc5bc35363093df32.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/up.svg" +dest_files=["res://.godot/imported/up.svg-93c9110a5b9e596fc5bc35363093df32.ctex"] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 diff --git a/addons/proton_scatter/icons/warning.svg b/addons/proton_scatter/icons/warning.svg new file mode 100644 index 0000000..f40d539 --- /dev/null +++ b/addons/proton_scatter/icons/warning.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/icons/warning.svg.import b/addons/proton_scatter/icons/warning.svg.import new file mode 100644 index 0000000..43b8511 --- /dev/null +++ b/addons/proton_scatter/icons/warning.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj0y6peid681t" +path="res://.godot/imported/warning.svg-edf1b604537b5af6863f92713f96edb5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/icons/warning.svg" +dest_files=["res://.godot/imported/warning.svg-edf1b604537b5af6863f92713f96edb5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/masks/bars.png b/addons/proton_scatter/masks/bars.png new file mode 100644 index 0000000..99ce23b Binary files /dev/null and b/addons/proton_scatter/masks/bars.png differ diff --git a/addons/proton_scatter/masks/bars.png.import b/addons/proton_scatter/masks/bars.png.import new file mode 100644 index 0000000..8b71a98 --- /dev/null +++ b/addons/proton_scatter/masks/bars.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfj7p0fwxa1nc" +path="res://.godot/imported/bars.png-61d34dbd5bccdfb29fbe178f6a4791cb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/masks/bars.png" +dest_files=["res://.godot/imported/bars.png-61d34dbd5bccdfb29fbe178f6a4791cb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/masks/blinds.png b/addons/proton_scatter/masks/blinds.png new file mode 100644 index 0000000..a15a038 Binary files /dev/null and b/addons/proton_scatter/masks/blinds.png differ diff --git a/addons/proton_scatter/masks/blinds.png.import b/addons/proton_scatter/masks/blinds.png.import new file mode 100644 index 0000000..35d0197 --- /dev/null +++ b/addons/proton_scatter/masks/blinds.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bg6881qstlapu" +path="res://.godot/imported/blinds.png-3f857c707ea5be395a4531d6d60eac1e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/masks/blinds.png" +dest_files=["res://.godot/imported/blinds.png-3f857c707ea5be395a4531d6d60eac1e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/masks/checker.png b/addons/proton_scatter/masks/checker.png new file mode 100644 index 0000000..ca58baf Binary files /dev/null and b/addons/proton_scatter/masks/checker.png differ diff --git a/addons/proton_scatter/masks/checker.png.import b/addons/proton_scatter/masks/checker.png.import new file mode 100644 index 0000000..1a44dba --- /dev/null +++ b/addons/proton_scatter/masks/checker.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsr872vuejrqx" +path="res://.godot/imported/checker.png-ec978f1465e3b09756cb5cb959e11209.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/masks/checker.png" +dest_files=["res://.godot/imported/checker.png-ec978f1465e3b09756cb5cb959e11209.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/masks/wave.png b/addons/proton_scatter/masks/wave.png new file mode 100644 index 0000000..3e5f218 Binary files /dev/null and b/addons/proton_scatter/masks/wave.png differ diff --git a/addons/proton_scatter/masks/wave.png.import b/addons/proton_scatter/masks/wave.png.import new file mode 100644 index 0000000..a9142f8 --- /dev/null +++ b/addons/proton_scatter/masks/wave.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4q2bmujmanc6" +path="res://.godot/imported/wave.png-d387544eba14013e763fdb82094dc9c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/proton_scatter/masks/wave.png" +dest_files=["res://.godot/imported/wave.png-d387544eba14013e763fdb82094dc9c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/proton_scatter/plugin.cfg b/addons/proton_scatter/plugin.cfg new file mode 100644 index 0000000..29069d3 --- /dev/null +++ b/addons/proton_scatter/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="ProtonScatter" +description="Scatter props or entire scenes across any space in a non destructive way" +author="HungryProton" +version="4.0" +script="plugin.gd" diff --git a/addons/proton_scatter/plugin.gd b/addons/proton_scatter/plugin.gd new file mode 100644 index 0000000..0142416 --- /dev/null +++ b/addons/proton_scatter/plugin.gd @@ -0,0 +1,170 @@ +@tool +extends EditorPlugin + + +const ProtonScatter := preload("./src/scatter.gd") +const ProtonScatterShape := preload("./src/scatter_shape.gd") +const ModifierStackPlugin := preload("./src/stack/inspector_plugin/modifier_stack_plugin.gd") +const ScatterGizmoPlugin := preload("./src/scatter_gizmo_plugin.gd") +const ShapeGizmoPlugin := preload("./src/shapes/gizmos_plugin/shape_gizmo_plugin.gd") +const PathPanel := preload("./src/shapes/gizmos_plugin/components/path_panel.tscn") +const ScatterCachePlugin := preload("./src/cache/inspector_plugin/scatter_cache_plugin.gd") + +const GIZMO_SETTING := "addons/proton_scatter/always_show_gizmos" +const MAX_PHYSICS_QUERIES_SETTING := "addons/proton_scatter/max_physics_queries_per_frame" + +var _modifier_stack_plugin := ModifierStackPlugin.new() +var _scatter_gizmo_plugin := ScatterGizmoPlugin.new() +var _shape_gizmo_plugin := ShapeGizmoPlugin.new() +var _scatter_cache_plugin := ScatterCachePlugin.new() +var _path_panel +var _selected_scatter_group: Array[Node] = [] + + +func _get_plugin_name(): + return "ProtonScatter" + + +func _enter_tree(): + _ensure_setting_exists(GIZMO_SETTING, true) + _ensure_setting_exists(MAX_PHYSICS_QUERIES_SETTING, 500) + + add_inspector_plugin(_modifier_stack_plugin) + add_inspector_plugin(_scatter_cache_plugin) + + _path_panel = PathPanel.instantiate() + add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, _path_panel) + _path_panel.visible = false + + add_node_3d_gizmo_plugin(_scatter_gizmo_plugin) + _scatter_gizmo_plugin.set_editor_plugin(self) + + add_node_3d_gizmo_plugin(_shape_gizmo_plugin) + _shape_gizmo_plugin.set_undo_redo(get_undo_redo()) + _shape_gizmo_plugin.set_path_gizmo_panel(_path_panel) + _shape_gizmo_plugin.set_editor_plugin(self) + + add_custom_type( + "ProtonScatter", + "Node3D", + preload("./src/scatter.gd"), + preload("./icons/scatter.svg") + ) + add_custom_type( + "ScatterItem", + "Node3D", + preload("./src/scatter_item.gd"), + preload("./icons/item.svg") + ) + add_custom_type( + "ScatterShape", + "Node3D", + preload("./src/scatter_shape.gd"), + preload("./icons/shape.svg") + ) + add_custom_type( + "ScatterCache", + "Node3D", + preload("./src/cache/scatter_cache.gd"), + preload("./icons/cache.svg") + ) + + var editor_selection = get_editor_interface().get_selection() + editor_selection.selection_changed.connect(_on_selection_changed) + + scene_changed.connect(_on_scene_changed) + + +func _exit_tree(): + remove_custom_type("ProtonScatter") + remove_custom_type("ScatterItem") + remove_custom_type("ScatterShape") + remove_custom_type("ScatterCache") + remove_inspector_plugin(_modifier_stack_plugin) + remove_inspector_plugin(_scatter_cache_plugin) + remove_node_3d_gizmo_plugin(_shape_gizmo_plugin) + remove_node_3d_gizmo_plugin(_scatter_gizmo_plugin) + if _path_panel: + remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, _path_panel) + _path_panel.queue_free() + _path_panel = null + + +func _handles(node) -> bool: + return node is ProtonScatterShape + + +func _forward_3d_gui_input(viewport_camera: Camera3D, event: InputEvent) -> int: + return _shape_gizmo_plugin.forward_3d_gui_input(viewport_camera, event) + + +func get_custom_selection() -> Array[Node]: + return _selected_scatter_group + + +func _refresh_scatter_gizmos(nodes: Array[Node]) -> void: + for node in nodes: + if not is_instance_valid(node): + continue + + if node is ProtonScatterShape: + _refresh_scatter_gizmos([node.get_parent()]) + continue + + if node is ProtonScatter: + node.update_gizmos() + for c in node.get_children(): + if c is Node3D: + c.update_gizmos() + + +func _ensure_setting_exists(setting: String, default_value) -> void: + if not ProjectSettings.has_setting(setting): + ProjectSettings.set_setting(setting, default_value) + ProjectSettings.set_initial_value(setting, default_value) + + if ProjectSettings.has_method("set_as_basic"): # 4.0 backward compatibility + ProjectSettings.call("set_as_basic", setting, true) + + +func _on_selection_changed() -> void: + # Clean the gizmos on the previous node selection + _refresh_scatter_gizmos(_selected_scatter_group) + _selected_scatter_group.clear() + + # Get the currently selected nodes + var selected = get_editor_interface().get_selection().get_selected_nodes() + _path_panel.selection_changed(selected) + + if selected.is_empty(): + return + + # Update the selected local scatter group. + # If the user selects a shape, the scatter group will contain the ScatterShape, + # all the sibling shapes, and the parent scatter node, even if they are not + # selected. This is required to make their gizmos appear. + for node in selected: + var scatter_node + + if node is ProtonScatter: + scatter_node = node + + elif node is ProtonScatterShape and is_instance_valid(node): + scatter_node = node.get_parent() + + if not is_instance_valid(scatter_node): + continue + + _selected_scatter_group.push_back(scatter_node) + scatter_node.undo_redo = get_undo_redo() + scatter_node.editor_plugin = self + + for c in scatter_node.get_children(): + if c is ProtonScatterShape: + _selected_scatter_group.push_back(c) + + _refresh_scatter_gizmos(_selected_scatter_group) + + +func _on_scene_changed(_scene_root) -> void: + pass diff --git a/addons/proton_scatter/plugin.gd.uid b/addons/proton_scatter/plugin.gd.uid new file mode 100644 index 0000000..f13fae9 --- /dev/null +++ b/addons/proton_scatter/plugin.gd.uid @@ -0,0 +1 @@ +uid://yf8svdjlib0x diff --git a/addons/proton_scatter/presets/grass.tscn b/addons/proton_scatter/presets/grass.tscn new file mode 100644 index 0000000..1a25665 --- /dev/null +++ b/addons/proton_scatter/presets/grass.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=14 format=3 uid="uid://2e6nvcbuqhao"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter.gd" id="1_hwvsa"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/modifier_stack.gd" id="2_84xri"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_grid.gd" id="3_t5gts"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/randomize_transforms.gd" id="4_v7woi"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/project_on_geometry.gd" id="5_tgf12"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_item.gd" id="6_11eqr"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_shape.gd" id="7_vk3gk"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/sphere_shape.gd" id="9_w0igc"] + +[sub_resource type="Resource" id="Resource_mu1a8"] +script = ExtResource("3_t5gts") +spacing = Vector3(0.2, 1, 0.2) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_8361b"] +script = ExtResource("4_v7woi") +position = Vector3(0, 0, 0) +rotation = Vector3(20, 360, 20) +scale = Vector3(4, 2, 4) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_14cyx"] +script = ExtResource("5_tgf12") +ray_direction = Vector3(0, -1, 0) +ray_length = 10.0 +ray_offset = 10.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_mv17r"] +script = ExtResource("2_84xri") +stack = Array[Resource]([SubResource("Resource_mu1a8"), SubResource("Resource_8361b"), SubResource("Resource_14cyx")]) + +[sub_resource type="Resource" id="Resource_gaw40"] +script = ExtResource("9_w0igc") +radius = 5.0 + +[node name="ProtonScatter" type="Node3D"] +script = ExtResource("1_hwvsa") +modifier_stack = SubResource("Resource_mv17r") + +[node name="Grass" type="Node3D" parent="."] +script = ExtResource("6_11eqr") +path = "res://addons/proton_scatter/demos/assets/grass_2.tscn" + +[node name="ScatterShape" type="Node3D" parent="."] +script = ExtResource("7_vk3gk") +shape = SubResource("Resource_gaw40") diff --git a/addons/proton_scatter/presets/scatter_default.tscn b/addons/proton_scatter/presets/scatter_default.tscn new file mode 100644 index 0000000..75654b7 --- /dev/null +++ b/addons/proton_scatter/presets/scatter_default.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=16 format=3 uid="uid://yxn1ih6qrc01"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter.gd" id="1_e0kty"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/modifier_stack.gd" id="2_lt5xy"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_random.gd" id="3_0051t"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/randomize_transforms.gd" id="4_5a045"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/project_on_geometry.gd" id="5_gkw57"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/relax.gd" id="5_n2in0"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_item.gd" id="6_3iwkw"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_shape.gd" id="7_jofmq"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/sphere_shape.gd" id="8_gnbkw"] + +[sub_resource type="Resource" id="Resource_jbxru"] +script = ExtResource("3_0051t") +amount = 75 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_0oyil"] +script = ExtResource("4_5a045") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_ogw66"] +script = ExtResource("5_n2in0") +iterations = 3 +offset_step = 0.2 +consecutive_step_multiplier = 0.75 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_awufl"] +script = ExtResource("5_gkw57") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_xqhqc"] +script = ExtResource("2_lt5xy") +stack = Array[Resource]([SubResource("Resource_jbxru"), SubResource("Resource_0oyil"), SubResource("Resource_ogw66"), SubResource("Resource_awufl")]) + +[sub_resource type="Resource" id="Resource_g8bsm"] +script = ExtResource("8_gnbkw") +radius = 2.0 + +[node name="ProtonScatter" type="Node3D"] +script = ExtResource("1_e0kty") +modifier_stack = SubResource("Resource_xqhqc") + +[node name="ScatterItem" type="Node3D" parent="."] +script = ExtResource("6_3iwkw") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="."] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("7_jofmq") +shape = SubResource("Resource_g8bsm") diff --git a/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd new file mode 100644 index 0000000..e407717 --- /dev/null +++ b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd @@ -0,0 +1,45 @@ +@tool +extends PanelContainer + + +const ScatterCache := preload("res://addons/proton_scatter/src/cache/scatter_cache.gd") + + +@onready var _rebuild_button: Button = %RebuildButton +@onready var _restore_button: Button = %RestoreButton +@onready var _clear_button: Button = %ClearButton +@onready var _enable_for_all_button: Button = %EnableForAllButton + +var _cache: ScatterCache + + +func _ready() -> void: + _rebuild_button.pressed.connect(_on_rebuild_pressed) + _restore_button.pressed.connect(_on_restore_pressed) + _clear_button.pressed.connect(_on_clear_pressed) + _enable_for_all_button.pressed.connect(_on_enable_for_all_pressed) + custom_minimum_size.y = size.y * 1.25 + + +func set_object(cache: ScatterCache) -> void: + _cache = cache + + +func _on_rebuild_pressed() -> void: + if is_instance_valid(_cache): + _cache.update_cache() + + +func _on_restore_pressed() -> void: + if is_instance_valid(_cache): + _cache.restore_cache() + + +func _on_clear_pressed() -> void: + if is_instance_valid(_cache): + _cache.clear_cache() + + +func _on_enable_for_all_pressed() -> void: + if is_instance_valid(_cache): + _cache.enable_for_all_nodes() diff --git a/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd.uid b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd.uid new file mode 100644 index 0000000..2da8214 --- /dev/null +++ b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd.uid @@ -0,0 +1 @@ +uid://b6k8l8tpd4dk7 diff --git a/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.tscn b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.tscn new file mode 100644 index 0000000..e12ad7c --- /dev/null +++ b/addons/proton_scatter/src/cache/inspector_plugin/cache_panel.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=5 format=3 uid="uid://dilbceex72g24"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/cache/inspector_plugin/cache_panel.gd" id="1_h1g4a"] +[ext_resource type="Texture2D" uid="uid://yqlpvcmb7mfi" path="res://addons/proton_scatter/icons/rebuild.svg" id="2_0ml76"] +[ext_resource type="Texture2D" uid="uid://ddjrq1h4mkn6a" path="res://addons/proton_scatter/icons/load.svg" id="3_i6mdl"] +[ext_resource type="Texture2D" uid="uid://btb6rqhhi27mx" path="res://addons/proton_scatter/icons/remove.svg" id="4_bfbdy"] + +[node name="CachePanel" type="PanelContainer"] +custom_minimum_size = Vector2(0, 82.5) +offset_right = 161.0 +offset_bottom = 66.0 +size_flags_horizontal = 3 +script = ExtResource("1_h1g4a") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +alignment = 1 + +[node name="RebuildButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +text = "Update Cache" +icon = ExtResource("2_0ml76") + +[node name="RestoreButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +text = "Restore Transforms" +icon = ExtResource("3_i6mdl") + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ClearButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +text = "Clear Cache" +icon = ExtResource("4_bfbdy") + +[node name="EnableForAllButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Enable Cache For All" diff --git a/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd b/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd new file mode 100644 index 0000000..96431e4 --- /dev/null +++ b/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd @@ -0,0 +1,17 @@ +@tool +extends EditorInspectorPlugin + + +const CachePanel = preload("./cache_panel.tscn") +const ScatterCache = preload("../../cache/scatter_cache.gd") + + +func _can_handle(object): + return is_instance_of(object, ScatterCache) + + +func _parse_category(object, category: String): + if category == "ScatterCache" or category == "scatter_cache.gd": + var ui = CachePanel.instantiate() + ui.set_object(object) + add_custom_control(ui) diff --git a/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd.uid b/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd.uid new file mode 100644 index 0000000..9db8753 --- /dev/null +++ b/addons/proton_scatter/src/cache/inspector_plugin/scatter_cache_plugin.gd.uid @@ -0,0 +1 @@ +uid://bwvnrswedw8ti diff --git a/addons/proton_scatter/src/cache/scatter_cache.gd b/addons/proton_scatter/src/cache/scatter_cache.gd new file mode 100644 index 0000000..9dfbe8b --- /dev/null +++ b/addons/proton_scatter/src/cache/scatter_cache.gd @@ -0,0 +1,216 @@ +@tool +extends Node + +# ProtonScatterCacheNode +# +# Saves the transforms created by ProtonScatter nodes in an external resource +# and restore them when loading the scene. +# +# Use this node when you don't want to wait for scatter nodes to fully rebuild +# at start. +# You can also enable "Show output in tree" to get the same effect, but the +# cache makes it much more VCS friendly, and doesn't clutter your scene tree. + +const DEFAULT_CACHE_FOLDER := "res://addons/proton_scatter/cache/" + +const ProtonScatter := preload("res://addons/proton_scatter/src/scatter.gd") +const ProtonScatterTransformList := preload("../common/transform_list.gd") + + +signal cache_restored + + +@export_file("*.res", "*.tres") var cache_file := "": + set(val): + cache_file = val + update_configuration_warnings() +@export var auto_rebuild_cache_when_saving := true + +@export_group("Debug", "dbg_") +@export var dbg_disable_thread := false + +# The resource where transforms are actually stored +var _local_cache: ProtonScatterCacheResource +var _scene_root: Node +var _scatter_nodes: Dictionary #Key: ProtonScatter, Value: cached version +var _local_cache_changed := false + + +func _ready() -> void: + if not is_inside_tree(): + return + + _scene_root = _get_local_scene_root(self) + + # Check if cache_file is empty, indicating the default case + if cache_file.is_empty(): + if Engine.is_editor_hint(): + # Ensure the cache folder exists + _ensure_cache_folder_exists() + else: + printerr("ProtonScatter error: You load a ScatterCache node with an empty cache file attribute. Outside of the editor, the addon can't set a default value. Please open the scene in the editor and set a default value.") + return + + # Retrieve the scene name to create a unique recognizable name + var scene_path: String = _scene_root.get_scene_file_path() + var scene_name: String + + # If the scene path is not available, set a random name + if scene_path.is_empty(): + scene_name = str(randi()) + else: + # Use the base name of the scene file and append a hash to avoid collisions + scene_name = scene_path.get_file().get_basename() + scene_name += "_" + str(scene_path.hash()) + + # Set the cache path to the cache folder, incorporating the scene name + cache_file = DEFAULT_CACHE_FOLDER.get_basename().path_join(scene_name + "_scatter_cache.res") + return + + restore_cache.call_deferred() + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings = PackedStringArray() + if cache_file.is_empty(): + warnings.push_back("No path set for the cache file. Select where to store the cache in the inspector.") + + return warnings + + +func _notification(what): + if what == NOTIFICATION_EDITOR_PRE_SAVE and auto_rebuild_cache_when_saving: + update_cache() + + +func clear_cache() -> void: + _scatter_nodes.clear() + _local_cache = null + + +func update_cache() -> void: + if cache_file.is_empty(): + printerr("Cache file path is empty.") + return + + _purge_outdated_nodes() + _discover_scatter_nodes(_scene_root) + + if not _local_cache: + _local_cache = ProtonScatterCacheResource.new() + for s in _scatter_nodes: + # Ignore this node if its cache is already up to date + var cached_version: int = _scatter_nodes[s] + if s.build_version == cached_version: + continue + + # If transforms are not available, try to rebuild once. + if not s.transforms: + s.rebuild.call_deferred() + await s.build_completed + + if not s.transforms: + continue # Move on to the next if still no results. + + # Store the transforms in the cache. + _local_cache.store(_scene_root.get_path_to(s), s.transforms.list) + _scatter_nodes[s] = s.build_version + _local_cache_changed = true + + # Only save the cache on disk if there's something new to save + if not _local_cache_changed: + return + + # TODO: Save large files on a thread + var err = ResourceSaver.save(_local_cache, cache_file) + _local_cache_changed = false + + if err != OK: + printerr("ProtonScatter error: Failed to save the cache file. Code: ", err) + + +func restore_cache() -> void: + # Load the cache file if it exists + if not ResourceLoader.exists(cache_file): + printerr("Could not find cache file ", cache_file) + return + + # Cache files are large, load on a separate thread + ResourceLoader.load_threaded_request(cache_file) + while true: + match ResourceLoader.load_threaded_get_status(cache_file): + ResourceLoader.ThreadLoadStatus.THREAD_LOAD_INVALID_RESOURCE: + return + ResourceLoader.ThreadLoadStatus.THREAD_LOAD_IN_PROGRESS: + await get_tree().process_frame + ResourceLoader.ThreadLoadStatus.THREAD_LOAD_FAILED: + return + ResourceLoader.ThreadLoadStatus.THREAD_LOAD_LOADED: + break + + _local_cache = ResourceLoader.load_threaded_get(cache_file) + if not _local_cache: + printerr("Could not load cache: ", cache_file) + return + + _scatter_nodes.clear() + _discover_scatter_nodes(_scene_root) + + for s in _scatter_nodes: + if s.force_rebuild_on_load: + continue # Ignore the cache if the scatter node is about to rebuild anyway. + + # Send the cached transforms to the scatter node. + var transforms = ProtonScatterTransformList.new() + transforms.list = _local_cache.get_transforms(_scene_root.get_path_to(s)) + s._perform_sanity_check() + s._on_transforms_ready(transforms) + s.build_version = 0 + _scatter_nodes[s] = 0 + + cache_restored.emit() + + +func enable_for_all_nodes() -> void: + _purge_outdated_nodes() + _discover_scatter_nodes(_scene_root) + for s in _scatter_nodes: + s.force_rebuild_on_load = false + + +# If the node comes from an instantiated scene, returns the root of that +# instance. Returns the tree root node otherwise. +func _get_local_scene_root(node: Node) -> Node: + if not node.scene_file_path.is_empty(): + return node + + var parent: Node = node.get_parent() + if not parent: + return node + + return _get_local_scene_root(parent) + + +func _discover_scatter_nodes(node: Node) -> void: + if node is ProtonScatter and not _scatter_nodes.has(node): + _scatter_nodes[node] = node.build_version + + for c in node.get_children(): + _discover_scatter_nodes(c) + + +func _purge_outdated_nodes() -> void: + var nodes_to_remove: Array[ProtonScatter] = [] + for node in _scatter_nodes: + if not is_instance_valid(node): + nodes_to_remove.push_back(node) + _local_cache.erase(_scene_root.get_path_to(node)) + _local_cache_changed = true + + for node in nodes_to_remove: + _scatter_nodes.erase(node) + + +func _ensure_cache_folder_exists() -> void: + if not DirAccess.dir_exists_absolute(DEFAULT_CACHE_FOLDER): + DirAccess.make_dir_recursive_absolute(DEFAULT_CACHE_FOLDER) diff --git a/addons/proton_scatter/src/cache/scatter_cache.gd.uid b/addons/proton_scatter/src/cache/scatter_cache.gd.uid new file mode 100644 index 0000000..01a42d8 --- /dev/null +++ b/addons/proton_scatter/src/cache/scatter_cache.gd.uid @@ -0,0 +1 @@ +uid://bfr4urrxjg8sm diff --git a/addons/proton_scatter/src/common/bounds.gd b/addons/proton_scatter/src/common/bounds.gd new file mode 100644 index 0000000..a5486b4 --- /dev/null +++ b/addons/proton_scatter/src/common/bounds.gd @@ -0,0 +1,50 @@ +@tool +extends Resource + +# Used by the Domain class +# TODO: This could be replaced by a built-in AABB + +var size: Vector3 +var center: Vector3 +var min: Vector3 +var max: Vector3 + +var _points := 0 + + +func clear() -> void: + size = Vector3.ZERO + center = Vector3.ZERO + min = Vector3.ZERO + max = Vector3.ZERO + _points = 0 + + +func feed(point: Vector3) -> void: + if _points == 0: + min = point + max = point + + min = _minv(min, point) + max = _maxv(max, point) + _points += 1 + + +# Call this after you've called feed() with all the points in your data set +func compute_bounds() -> void: + if min == null or max == null: + return + + size = max - min + center = min + (size / 2.0) + + +# Returns a vector with the smallest values in each of the 2 input vectors +func _minv(v1: Vector3, v2: Vector3) -> Vector3: + return Vector3(min(v1.x, v2.x), min(v1.y, v2.y), min(v1.z, v2.z)) + + +# Returns a vector with the highest values in each of the 2 input vectors +func _maxv(v1: Vector3, v2: Vector3) -> Vector3: + return Vector3(max(v1.x, v2.x), max(v1.y, v2.y), max(v1.z, v2.z)) + diff --git a/addons/proton_scatter/src/common/bounds.gd.uid b/addons/proton_scatter/src/common/bounds.gd.uid new file mode 100644 index 0000000..73635c0 --- /dev/null +++ b/addons/proton_scatter/src/common/bounds.gd.uid @@ -0,0 +1 @@ +uid://d4aom4baw6thy diff --git a/addons/proton_scatter/src/common/cache_resource.gd b/addons/proton_scatter/src/common/cache_resource.gd new file mode 100644 index 0000000..e499fdc --- /dev/null +++ b/addons/proton_scatter/src/common/cache_resource.gd @@ -0,0 +1,27 @@ +@tool +class_name ProtonScatterCacheResource +extends Resource + + +@export var data = {} + + +func clear() -> void: + data.clear() + + +func store(node_path: String, transforms: Array[Transform3D]) -> void: + data[node_path] = transforms + + +func erase(node_path: String) -> void: + data.erase(node_path) + + +func get_transforms(node_path: String) -> Array[Transform3D]: + var res: Array[Transform3D] + + if node_path in data: + res.assign(data[node_path]) + + return res diff --git a/addons/proton_scatter/src/common/cache_resource.gd.uid b/addons/proton_scatter/src/common/cache_resource.gd.uid new file mode 100644 index 0000000..6e041e7 --- /dev/null +++ b/addons/proton_scatter/src/common/cache_resource.gd.uid @@ -0,0 +1 @@ +uid://ilhpsj60hu7n diff --git a/addons/proton_scatter/src/common/domain.gd b/addons/proton_scatter/src/common/domain.gd new file mode 100644 index 0000000..1183b9c --- /dev/null +++ b/addons/proton_scatter/src/common/domain.gd @@ -0,0 +1,312 @@ +@tool +extends RefCounted + +# A domain is the complete area where transforms can (and can't) be placed. +# A Scatter node has one single domain, a domain has one or more shape nodes. +# +# It's the combination of every shape defined under a Scatter node, grouped in +# a single class that exposes utility functions (check if a point is inside, or +# along the surface etc). +# +# An instance of this class is passed to the modifiers during a rebuild. + + +const ProtonScatter := preload("../scatter.gd") +const ProtonScatterShape := preload("../scatter_shape.gd") +const BaseShape := preload("../shapes/base_shape.gd") +const Bounds := preload("../common/bounds.gd") + + +class DomainShapeInfo: + var node: Node3D + var shape: BaseShape + + func is_point_inside(point: Vector3, local: bool) -> bool: + var t: Transform3D + if is_instance_valid(node): + t = node.get_transform() if local else node.get_global_transform() + return shape.is_point_inside(point, t) + else: + return false + + func get_corners_global() -> Array: + return shape.get_corners_global(node.get_global_transform()) + +# A polygon made of one outer boundary and one or multiple holes (inner polygons) +class ComplexPolygon: + var inner: Array[PackedVector2Array] = [] + var outer: PackedVector2Array + + func add(polygon: PackedVector2Array) -> void: + if polygon.is_empty(): return + if Geometry2D.is_polygon_clockwise(polygon): + inner.push_back(polygon) + else: + if not outer.is_empty(): + print_debug("ProtonScatter error: Replacing polygon's existing outer boundary. This should not happen, please report.") + outer = polygon + + func add_array(array: Array, reverse := false) -> void: + for p in array: + if reverse: + p.reverse() + add(p) + + func get_all() -> Array[PackedVector2Array]: + var res = inner.duplicate() + res.push_back(outer) + return res + + func _to_string() -> String: + var res = "o: " + var_to_str(outer.size()) + ", i: [" + for i in inner: + res += var_to_str(i.size()) + ", " + res += "]" + return res + + +var root: ProtonScatter +var positive_shapes: Array[DomainShapeInfo] +var negative_shapes: Array[DomainShapeInfo] +var bounds_global: Bounds = Bounds.new() +var bounds_local: Bounds = Bounds.new() +var edges: Array[Curve3D] = [] + + +func is_empty() -> bool: + return positive_shapes.is_empty() + + +# If a point is in an exclusion shape, returns false +# If a point is in an inclusion shape (but not in an exclusion one), returns true +# If a point is in neither, returns false +func is_point_inside(point: Vector3, local := true) -> bool: + for s in negative_shapes: + if s.is_point_inside(point, local): + return false + + for s in positive_shapes: + if s.is_point_inside(point, local): + return true + + return false + + +# If a point is inside an exclusion shape, returns true +# Returns false in every other case +func is_point_excluded(point: Vector3, local := true) -> bool: + for s in negative_shapes: + if s.is_point_inside(point, local): + return true + + return false + + +# Recursively find all ScatterShape nodes under the provided root. In case of +# nested Scatter nodes, shapes under these other Scatter nodes will be ignored +func discover_shapes(root_node: Node3D) -> void: + root = root_node + positive_shapes.clear() + negative_shapes.clear() + + if not is_instance_valid(root): + return + + for c in root.get_children(): + _discover_shapes_recursive(c) + compute_bounds() + compute_edges() + + +func compute_bounds() -> void: + bounds_global.clear() + bounds_local.clear() + + if not is_instance_valid(root): + return + + var gt: Transform3D = root.get_global_transform().affine_inverse() + + for info in positive_shapes: + for point in info.get_corners_global(): + bounds_global.feed(point) + bounds_local.feed(gt * point) + + bounds_global.compute_bounds() + bounds_local.compute_bounds() + + +func compute_edges() -> void: + edges.clear() + + if not is_instance_valid(root): + return + + var source_polygons: Array[ComplexPolygon] = [] + + ## Retrieve all polygons + for info in positive_shapes: + # Store all closed polygons in a specific array + var polygon := ComplexPolygon.new() + polygon.add_array(info.shape.get_closed_edges(info.node.transform)) + + # Polygons with holes must be merged together first + if not polygon.inner.is_empty(): + source_polygons.push_back(polygon) + else: + source_polygons.push_front(polygon) + + # Store open edges directly since they are already Curve3D and we + # don't apply boolean operations to them. + var open_edges = info.shape.get_open_edges(info.node.transform) + edges.append_array(open_edges) + + if source_polygons.is_empty(): + return + + ## Merge all closed polygons together + var merged_polygons: Array[ComplexPolygon] = [] + + while not source_polygons.is_empty(): + var merged := false + var p1: ComplexPolygon = source_polygons.pop_back() + var max_steps: int = source_polygons.size() + var i = 0 + + # Test p1 against every other polygon from source_polygon until a + # successful merge. If no merge happened, put it in the final array. + while i < max_steps and not merged: + i += 1 + + # Get the next polygon in the list + var p2: ComplexPolygon = source_polygons.pop_back() + + # If the outer boundary of any of the two polygons is completely + # enclosed in one of the other polygon's hole, we don't try to + # merge them and go the next iteration. + var full_overlap = false + for ip1 in p1.inner: + var res = Geometry2D.clip_polygons(p2.outer, ip1) + if res.is_empty(): + full_overlap = true + break + + for ip2 in p2.inner: + var res = Geometry2D.clip_polygons(p1.outer, ip2) + if res.is_empty(): + full_overlap = true + break + + if full_overlap: + source_polygons.push_front(p2) + continue + + # Try to merge the two polygons p1 and p2 + var res = Geometry2D.merge_polygons(p1.outer, p2.outer) + var outer_polygons := 0 + for p in res: + if not Geometry2D.is_polygon_clockwise(p): + outer_polygons += 1 + + # If the merge generated a new polygon, process the holes data from + # the two original polygons and store in the new_polygon + # P1 and P2 are then discarded and replaced by the new polygon. + if outer_polygons == 1: + var new_polygon = ComplexPolygon.new() + new_polygon.add_array(res) + + # Process the holes data from p1 and p2 + for ip1 in p1.inner: + for ip2 in p2.inner: + new_polygon.add_array(Geometry2D.intersect_polygons(ip1, ip2), true) + new_polygon.add_array(Geometry2D.clip_polygons(ip2, p1.outer), true) + + new_polygon.add_array(Geometry2D.clip_polygons(ip1, p2.outer), true) + + source_polygons.push_back(new_polygon) + merged = true + + # If the polygons don't overlap, return it to the pool to be tested + # against other polygons + else: + source_polygons.push_front(p2) + + # If p1 is not overlapping any other polygon, add it to the final list + if not merged: + merged_polygons.push_back(p1) + + ## For each polygons from the previous step, create a corresponding Curve3D + for cp in merged_polygons: + for polygon in cp.get_all(): + if polygon.size() < 2: # Ignore polygons too small to form a loop + continue + + var curve := Curve3D.new() + for point in polygon: + curve.add_point(Vector3(point.x, 0.0, point.y)) + + # Close the look if the last vertex is missing (Randomly happens) + var first_point := polygon[0] + var last_point := polygon[-1] + if first_point != last_point: + curve.add_point(Vector3(first_point.x, 0.0, first_point.y)) + + edges.push_back(curve) + + +func get_root() -> ProtonScatter: + return root + + +func get_global_transform() -> Transform3D: + return root.get_global_transform() + + +func get_local_transform() -> Transform3D: + return root.get_transform() + + +func get_edges() -> Array[Curve3D]: + if edges.is_empty(): + compute_edges() + return edges + + +func get_copy(): + var copy = get_script().new() + + copy.root = root + copy.bounds_global = bounds_global + copy.bounds_local = bounds_local + + for s in positive_shapes: + var s_copy = DomainShapeInfo.new() + s_copy.node = s.node + s_copy.shape = s.shape.get_copy() + copy.positive_shapes.push_back(s_copy) + + for s in negative_shapes: + var s_copy = DomainShapeInfo.new() + s_copy.node = s.node + s_copy.shape = s.shape.get_copy() + copy.negative_shapes.push_back(s_copy) + + return copy + + +func _discover_shapes_recursive(node: Node) -> void: + if node is ProtonScatter: # Ignore shapes under nested Scatter nodes + return + + if node is ProtonScatterShape and node.shape != null: + var info := DomainShapeInfo.new() + info.node = node + info.shape = node.shape + + if node.negative: + negative_shapes.push_back(info) + else: + positive_shapes.push_back(info) + + for c in node.get_children(): + _discover_shapes_recursive(c) diff --git a/addons/proton_scatter/src/common/domain.gd.uid b/addons/proton_scatter/src/common/domain.gd.uid new file mode 100644 index 0000000..40a24ca --- /dev/null +++ b/addons/proton_scatter/src/common/domain.gd.uid @@ -0,0 +1 @@ +uid://00stsf3ehlv0 diff --git a/addons/proton_scatter/src/common/event_helper.gd b/addons/proton_scatter/src/common/event_helper.gd new file mode 100644 index 0000000..912d18c --- /dev/null +++ b/addons/proton_scatter/src/common/event_helper.gd @@ -0,0 +1,72 @@ +extends RefCounted + +# Utility class that mimics the Input class behavior +# +# This only useful when using actions from the Input class isn't possible, +# like in _unhandled_input or forward_3d_gui_input for example, where you don't +# have a native way to detect if a key was just pressed or released. +# +# How to use: +# Call the feed() method first with the latest event you received, then call +# either of the is_key_* function +# +# If you don't call feed() on the same frame before calling any of these two, +# the behavior is undefined. + + +var _actions := {} + + +func feed(event: InputEvent) -> void: + var key + if event is InputEventMouseButton: + key = event.button_index + elif event is InputEventKey: + key = event.keycode + else: + _cleanup_states() + return + + if not key in _actions: + _actions[key] = { + pressed = event.pressed, + just_released = not event.pressed, + just_pressed = event.pressed, + } + return + + var pressed = _actions[key].pressed + + if pressed and not event.pressed: + _actions[key].just_released = true + _actions[key].just_pressed = false + + if not pressed and event.pressed: + _actions[key].just_pressed = true + _actions[key].just_released = false + + if pressed and event.pressed: + _actions[key].just_pressed = false + _actions[key].just_released = false + + _actions[key].pressed = event.pressed + + +func _cleanup_states() -> void: + for key in _actions: + _actions[key].just_released = false + _actions[key].just_pressed = false + + +func is_key_just_pressed(key) -> bool: + if key in _actions: + return _actions[key].just_pressed + + return false + + +func is_key_just_released(key) -> bool: + if key in _actions: + return _actions[key].just_released + + return false diff --git a/addons/proton_scatter/src/common/event_helper.gd.uid b/addons/proton_scatter/src/common/event_helper.gd.uid new file mode 100644 index 0000000..2733ebf --- /dev/null +++ b/addons/proton_scatter/src/common/event_helper.gd.uid @@ -0,0 +1 @@ +uid://cntjn8rn7fg5d diff --git a/addons/proton_scatter/src/common/physics_helper.gd b/addons/proton_scatter/src/common/physics_helper.gd new file mode 100644 index 0000000..91d9b09 --- /dev/null +++ b/addons/proton_scatter/src/common/physics_helper.gd @@ -0,0 +1,103 @@ +@tool +extends Node + +# Runs jobs during the physics step. +# Only supports raycast for now, but can easilly be adapted to handle +# the other types of queries. + +signal job_completed + + +const MAX_PHYSICS_QUERIES_SETTING := "addons/proton_scatter/max_physics_queries_per_frame" + + +var _is_ready := false +var _job_in_progress := false +var _max_queries_per_frame := 400 +var _main_thread_id: int +var _queries: Array +var _results: Array[Dictionary] +var _space_state: PhysicsDirectSpaceState3D + + +func _ready() -> void: + set_physics_process(false) + _main_thread_id = OS.get_thread_caller_id() + _is_ready = true + + +func _exit_tree(): + if _job_in_progress: + _job_in_progress = false + job_completed.emit() + + +func execute(queries: Array) -> Array[Dictionary]: + if not _is_ready: + printerr("ProtonScatter error: Calling execute on a PhysicsHelper before it's ready, this should not happen.") + return [] + + # Don't execute physics queries, if the node is not inside the tree. + # This avoids infinite loops, because the _physics_process will never be executed. + # This happens when the Scatter node is removed, while it perform a rebuild with a Thread. + if not is_inside_tree(): + printerr("ProtonScatter error: Calling execute on a PhysicsHelper while the node is not inside the tree.") + return [] + + # Clear previous job if any + _queries.clear() + + if _job_in_progress: + await _until(get_tree().physics_frame, func(): return _job_in_progress) + + _results.clear() + _queries = queries + _max_queries_per_frame = ProjectSettings.get_setting(MAX_PHYSICS_QUERIES_SETTING, 500) + _job_in_progress = true + set_physics_process.bind(true).call_deferred() + + await _until(job_completed, func(): return _job_in_progress, true) + + return _results.duplicate() + + +func _physics_process(_delta: float) -> void: + if _queries.is_empty(): + return + + if not _space_state: + _space_state = get_tree().get_root().get_world_3d().get_direct_space_state() + + var steps = min(_max_queries_per_frame, _queries.size()) + for i in steps: + var q = _queries.pop_back() + var hit := _space_state.intersect_ray(q) # TODO: Add support for other operations + _results.push_back(hit) + + if _queries.is_empty(): + set_physics_process(false) + _results.reverse() + _job_in_progress = false + job_completed.emit() + + +func _in_main_thread() -> bool: + return OS.get_thread_caller_id() == _main_thread_id + + +func _until(s: Signal, callable: Callable, physics := false) -> void: + if _in_main_thread(): + await s + return + + # Called from a sub thread + var delay: int = 0 + if physics: + delay = round(get_physics_process_delta_time() * 100.0) + else: + delay = round(get_process_delta_time() * 100.0) + + while callable.call(): + OS.delay_msec(delay) + if not is_inside_tree(): + return diff --git a/addons/proton_scatter/src/common/physics_helper.gd.uid b/addons/proton_scatter/src/common/physics_helper.gd.uid new file mode 100644 index 0000000..87a9413 --- /dev/null +++ b/addons/proton_scatter/src/common/physics_helper.gd.uid @@ -0,0 +1 @@ +uid://dx7ct4h5kja52 diff --git a/addons/proton_scatter/src/common/scatter_util.gd b/addons/proton_scatter/src/common/scatter_util.gd new file mode 100644 index 0000000..79fadd6 --- /dev/null +++ b/addons/proton_scatter/src/common/scatter_util.gd @@ -0,0 +1,490 @@ +extends Node + +# To prevent the other core scripts from becoming too large, some of their +# utility functions are written here (only the functions that don't disturb +# reading the core code, mostly data validation and other verbose checks). + + +const ProtonScatter := preload("../scatter.gd") +const ProtonScatterItem := preload("../scatter_item.gd") +const ModifierStack := preload("../stack/modifier_stack.gd") + +### SCATTER UTILITY FUNCTIONS ### + + +# Make sure the output node exists. This is the parent node to +# everything generated by the scatter mesh +static func ensure_output_root_exists(s: ProtonScatter) -> void: + # Check if the node exists in the tree + if not s.output_root: + s.output_root = s.get_node_or_null("ScatterOutput") + + # If the node is valid, end here + if is_instance_valid(s.output_root) and s.has_node(NodePath(s.output_root.name)): + enforce_output_root_owner(s) + return + + # Some conditions are not met, cleanup and recreate the root + if s.output_root: + if s.has_node(NodePath(s.output_root.name)): + s.remove_node(s.output_root.name) + s.output_root.queue_free() + s.output_root = null + + s.output_root = Marker3D.new() + s.output_root.name = "ScatterOutput" + s.add_child(s.output_root, true) + + enforce_output_root_owner(s) + + +static func enforce_output_root_owner(s: ProtonScatter) -> void: + if is_instance_valid(s.output_root) and s.is_inside_tree(): + if s.show_output_in_tree: + set_owner_recursive(s.output_root, s.get_tree().get_edited_scene_root()) + else: + set_owner_recursive(s.output_root, null) + + # TMP: Workaround to force the scene tree to update and take in account + # the owner changes. Otherwise it doesn't show until much later. + s.output_root.update_configuration_warnings() + + +# Item root is a Node3D placed as a child of the ScatterOutput node. +# Each ScatterItem has a corresponding output node, serving as a parent for +# the Multimeshes or duplicates generated by the Scatter node. +static func get_or_create_item_root(item: ProtonScatterItem) -> Node3D: + var s: ProtonScatter = item.get_parent() + ensure_output_root_exists(s) + var item_root: Node3D = s.output_root.get_node_or_null(NodePath(item.name)) + + if not item_root: + item_root = Node3D.new() + item_root.name = item.name + s.output_root.add_child(item_root, true) + + if Engine.is_editor_hint(): + item_root.owner = item.get_tree().get_edited_scene_root() + + return item_root + + +static func get_or_create_multimesh(item: ProtonScatterItem, count: int) -> MultiMeshInstance3D: + var item_root := get_or_create_item_root(item) + var mmi: MultiMeshInstance3D = item_root.get_node_or_null("MultiMeshInstance3D") + + if not mmi: + mmi = MultiMeshInstance3D.new() + mmi.set_name("MultiMeshInstance3D") + item_root.add_child(mmi, true) + + mmi.set_owner(item_root.owner) + if not mmi.multimesh: + mmi.multimesh = MultiMesh.new() + + var mesh_instance: MeshInstance3D = get_merged_meshes_from(item) + if not mesh_instance: + return + + mmi.position = Vector3.ZERO + mmi.material_override = get_final_material(item, mesh_instance) + mmi.set_cast_shadows_setting(item.override_cast_shadow) + + mmi.multimesh.instance_count = 0 # Set this to zero or you can't change the other values + mmi.multimesh.mesh = mesh_instance.mesh + mmi.multimesh.transform_format = MultiMesh.TRANSFORM_3D + + mmi.visibility_range_begin = item.visibility_range_begin + mmi.visibility_range_begin_margin = item.visibility_range_begin_margin + mmi.visibility_range_end = item.visibility_range_end + mmi.visibility_range_end_margin = item.visibility_range_end_margin + mmi.visibility_range_fade_mode = item.visibility_range_fade_mode + mmi.layers = item.visibility_layers + + mmi.multimesh.instance_count = count + + mesh_instance.queue_free() + + return mmi + + +static func get_or_create_multimesh_chunk(item: ProtonScatterItem, + mesh_instance: MeshInstance3D, + index: Vector3i, + count: int)\ + -> MultiMeshInstance3D: + var item_root := get_or_create_item_root(item) + var chunk_name = "MultiMeshInstance3D" + "_%s_%s_%s"%[index.x, index.y, index.z] + var mmi: MultiMeshInstance3D = item_root.get_node_or_null(chunk_name) + if not mesh_instance: + return + + if not mmi: + mmi = MultiMeshInstance3D.new() + mmi.set_name(chunk_name) + # if set_name is used after add_child it is crazy slow + # This doesn't make much sense but it is definitely the case. + # About a 100x slowdown was observed in this case + item_root.add_child.bind(mmi, true).call_deferred() + + if not mmi.multimesh: + mmi.multimesh = MultiMesh.new() + + mmi.position = Vector3.ZERO + mmi.material_override = get_final_material(item, mesh_instance) + mmi.set_cast_shadows_setting(item.override_cast_shadow) + + mmi.multimesh.instance_count = 0 # Set this to zero or you can't change the other values + mmi.multimesh.mesh = mesh_instance.mesh + mmi.multimesh.transform_format = MultiMesh.TRANSFORM_3D + + mmi.visibility_range_begin = item.visibility_range_begin + mmi.visibility_range_begin_margin = item.visibility_range_begin_margin + mmi.visibility_range_end = item.visibility_range_end + mmi.visibility_range_end_margin = item.visibility_range_end_margin + mmi.visibility_range_fade_mode = item.visibility_range_fade_mode + mmi.layers = item.visibility_layers + + mmi.multimesh.instance_count = count + + return mmi + + +static func get_or_create_particles(item: ProtonScatterItem) -> GPUParticles3D: + var item_root := get_or_create_item_root(item) + var particles: GPUParticles3D = item_root.get_node_or_null("GPUParticles3D") + + if not particles: + particles = GPUParticles3D.new() + particles.set_name("GPUParticles3D") + item_root.add_child(particles) + + particles.set_owner(item_root.owner) + + var mesh_instance: MeshInstance3D = get_merged_meshes_from(item) + if not mesh_instance: + return + + particles.material_override = get_final_material(item, mesh_instance) + particles.set_draw_pass_mesh(0, mesh_instance.mesh) + particles.position = Vector3.ZERO + particles.local_coords = true + particles.layers = item.visibility_layers + + # Use the user provided material if it exists. + var process_material: Material = item.override_process_material + + # Or load the default one if there's nothing. + if not process_material: + process_material = ShaderMaterial.new() + process_material.shader = preload("../particles/static.gdshader") + + if process_material is ShaderMaterial: + process_material.set_shader_parameter("global_transform", item_root.get_global_transform()) + + particles.set_process_material(process_material) + + # TMP: Workaround to get infinite life time. + # Should be fine, but extensive testing is required. + # I can't get particles to restart when using emit_particle() from a script, so it's either + # that, or encoding the transform array in a texture an read that data from the particle + # shader, which is significantly harder. + particles.lifetime = 1.79769e308 + + # Kill previous particles or new ones will not spawn. + particles.restart() + + return particles + + +# Called from child nodes who affect the rebuild process (like ScatterShape) +# Usually, it would be the Scatter node responsibility to listen to changes from +# the children nodes, but keeping track of the children is annoying (they can +# be moved around from a Scatter node to another, or put under a wrong node, or +# other edge cases). +# So instead, when a child change, it notifies the parent Scatter node through +# this method. +static func request_parent_to_rebuild(node: Node, deferred := true) -> void: + var parent = node.get_parent() + if not parent or not parent.is_inside_tree(): + return + + if parent and parent is ProtonScatter: + if not parent.is_ready: + return + + if deferred: + parent.rebuild.call_deferred(true) + else: + parent.rebuild(true) + + +### MESH UTILITY ### + +# Recursively search for all MeshInstances3D in the node's children and +# returns them all in an array. If node is a MeshInstance, it will also be +# added to the array +static func get_all_mesh_instances_from(node: Node) -> Array[MeshInstance3D]: + var res: Array[MeshInstance3D] = [] + + if node is MeshInstance3D: + res.push_back(node) + + for c in node.get_children(): + res.append_array(get_all_mesh_instances_from(c)) + + return res + + +static func get_final_material(item: ProtonScatterItem, mi: MeshInstance3D) -> Material: + if item.override_material: + return item.override_material + + if mi.material_override: + return mi.material_override + + if mi.get_surface_override_material(0): + return mi.get_surface_override_material(0) + + return null + + +# Merge all the MeshInstances from the local node tree into a single MeshInstance. +# /!\ This is a best effort algorithm and will not work in some specific cases. /!\ +# +# Mesh resources can have a maximum of 8 surfaces: +# + If less than 8 different surfaces are found across all the MeshInstances, +# this returns a single instance with all the surfaces. +# +# + If more than 8 surfaces are found, but some shares the same material, +# these surfaces will be merged together if there's less than 8 unique materials. +# +# + If there's more than 8 unique materials, everything will be merged into +# a single surface. Material and custom data will NOT be preserved on the new mesh. +# +static func get_merged_meshes_from(item: ProtonScatterItem) -> MeshInstance3D: + if not item: + return null + + var source: Node = item.get_item() + if not is_instance_valid(source): + return null + + source.transform = Transform3D() + + # Get all the mesh instances + var mesh_instances: Array[MeshInstance3D] = get_all_mesh_instances_from(source) + source.queue_free() + + if mesh_instances.is_empty(): + return null + + # If there's only one mesh instance we can reuse it directly if the materials allow it. + if mesh_instances.size() == 1: + # Duplicate the meshinstance, not the mesh resource + var mi: MeshInstance3D = mesh_instances[0].duplicate() + + # MI uses a material override, all surface materials will be ignored + if mi.material_override: + return mi + + var surface_overrides_count := 0 + for i in mi.get_surface_override_material_count(): + if mi.get_surface_override_material(i): + surface_overrides_count += 1 + + # If there's one material override or less, no duplicate mesh is required. + if surface_overrides_count <= 1: + return mi + + + # Helper lambdas + var get_material_for_surface = func (mi: MeshInstance3D, idx: int) -> Material: + if mi.get_material_override(): + return mi.get_material_override() + + if mi.get_surface_override_material(idx): + return mi.get_surface_override_material(idx) + + if mi.mesh is PrimitiveMesh: + return mi.mesh.get_material() + + return mi.mesh.surface_get_material(idx) + + # Count how many surfaces / materials there are in the source instances + var total_surfaces := 0 + var surfaces_map := {} + # Key: Material + # data: Array[Dictionary] + # "surface": surface index + # "mesh_instance": parent mesh instance + + for mi in mesh_instances: + if not mi.mesh: + continue # Should not happen + + # Update the total surface count + var surface_count = mi.mesh.get_surface_count() + total_surfaces += surface_count + + # Store surfaces in the material indexed dictionary + for surface_index in surface_count: + var material: Material = get_material_for_surface.call(mi, surface_index) + if not material in surfaces_map: + surfaces_map[material] = [] + + surfaces_map[material].push_back({ + "surface": surface_index, + "mesh_instance": mi, + }) + + # ------ + # Less than 8 surfaces, merge in a single MeshInstance + # ------ + if total_surfaces <= 8: + var mesh := ImporterMesh.new() + + for mi in mesh_instances: + var inverse_transform := mi.transform.affine_inverse() + + for surface_index in mi.mesh.get_surface_count(): + # Retrieve surface data + var primitive_type = Mesh.PRIMITIVE_TRIANGLES + var format = 0 + var arrays := mi.mesh.surface_get_arrays(surface_index) + if mi.mesh is ArrayMesh: + primitive_type = mi.mesh.surface_get_primitive_type(surface_index) + format = mi.mesh.surface_get_format(surface_index) # Preserve custom data format + + # Update vertex position based on MeshInstance transform + var vertex_count = arrays[ArrayMesh.ARRAY_VERTEX].size() + var vertex: Vector3 + for index in vertex_count: + vertex = arrays[ArrayMesh.ARRAY_VERTEX][index] * inverse_transform + arrays[ArrayMesh.ARRAY_VERTEX][index] = vertex + + # Get the material if any + var material: Material = get_material_for_surface.call(mi, surface_index) + + # Store updated surface data in the new mesh + mesh.add_surface(primitive_type, arrays, [], {}, material, "", format) + + if item.lod_generate: + mesh.generate_lods(item.lod_merge_angle, item.lod_split_angle, []) + + var instance := MeshInstance3D.new() + instance.mesh = mesh.get_mesh() + return instance + + # ------ + # Too many surfaces and materials, merge everything in a single one. + # ------ + var total_unique_materials := surfaces_map.size() + + if total_unique_materials > 8: + var surface_tool := SurfaceTool.new() + surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES) + + for mi in mesh_instances: + var mesh : Mesh = mi.mesh + for surface_i in mesh.get_surface_count(): + surface_tool.append_from(mesh, surface_i, mi.transform) + + var mesh := ImporterMesh.new() + mesh.add_surface(surface_tool.get_primitive_type(), surface_tool.commit_to_arrays()) + + if item.lod_generate: + mesh.generate_lods(item.lod_merge_angle, item.lod_split_angle, []) + + var instance = MeshInstance3D.new() + instance.mesh = mesh.get_mesh() + return instance + + # ------ + # Merge surfaces grouped by their materials + # ------ + var mesh := ImporterMesh.new() + + for material in surfaces_map.keys(): + var surface_tool := SurfaceTool.new() + surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES) + + var surfaces: Array = surfaces_map[material] + for data in surfaces: + var idx: int = data["surface"] + var mi: MeshInstance3D = data["mesh_instance"] + + surface_tool.append_from(mi.mesh, idx, mi.transform) + + mesh.add_surface( + surface_tool.get_primitive_type(), + surface_tool.commit_to_arrays(), + [], {}, + material) + + if item.lod_generate: + mesh.generate_lods(item.lod_merge_angle, item.lod_split_angle, []) + + var instance := MeshInstance3D.new() + instance.mesh = mesh.get_mesh() + return instance + + +static func get_all_static_bodies_from(node: Node) -> Array[StaticBody3D]: + var res: Array[StaticBody3D] = [] + + if node is StaticBody3D: + res.push_back(node) + + for c in node.get_children(): + res.append_array(get_all_static_bodies_from(c)) + + return res + + +# Grab every static bodies from the source item and merge them in a single +# one with multiple collision shapes. +static func get_collision_data(item: ProtonScatterItem) -> StaticBody3D: + var static_body := StaticBody3D.new() + var source: Node3D = item.get_item() + if not is_instance_valid(source): + return static_body + + source.transform = Transform3D() + + for body in get_all_static_bodies_from(source): + for child in body.get_children(): + if child is CollisionShape3D: + # Don't use reparent() here or the child transform gets reset. + body.remove_child(child) + child.owner = null + static_body.add_child(child) + + source.queue_free() + return static_body + + +static func set_owner_recursive(node: Node, new_owner) -> void: + node.set_owner(new_owner) + + if not node.get_scene_file_path().is_empty(): + return # Node is an instantiated scene, don't change its children owner. + + for c in node.get_children(): + set_owner_recursive(c, new_owner) + + +static func get_aabb_from_transforms(transforms : Array) -> AABB: + if transforms.size() < 1: + return AABB(Vector3.ZERO, Vector3.ZERO) + var aabb = AABB(transforms[0].origin, Vector3.ZERO) + for t in transforms: + aabb = aabb.expand(t.origin) + return aabb + + +static func set_visibility_layers(node: Node, layers: int) -> void: + if node is VisualInstance3D: + node.layers = layers + for child in node.get_children(): + set_visibility_layers(child, layers) diff --git a/addons/proton_scatter/src/common/scatter_util.gd.uid b/addons/proton_scatter/src/common/scatter_util.gd.uid new file mode 100644 index 0000000..abb7d23 --- /dev/null +++ b/addons/proton_scatter/src/common/scatter_util.gd.uid @@ -0,0 +1 @@ +uid://cv05y507bm7i6 diff --git a/addons/proton_scatter/src/common/transform_list.gd b/addons/proton_scatter/src/common/transform_list.gd new file mode 100644 index 0000000..c19deb0 --- /dev/null +++ b/addons/proton_scatter/src/common/transform_list.gd @@ -0,0 +1,66 @@ +@tool +extends RefCounted + + +var list: Array[Transform3D] = [] +var max_count := -1 + + +func add(count: int) -> void: + for i in count: + var t := Transform3D() + list.push_back(t) + + +func append(array: Array[Transform3D]) -> void: + list.append_array(array) + + +func remove(count: int) -> void: + count = int(max(count, 0)) # Prevent using a negative number + var new_size = max(list.size() - count, 0) + list.resize(new_size) + + +func resize(count: int) -> void: + if max_count >= 0: + count = int(min(count, max_count)) + + var current_count = list.size() + if count > current_count: + add(count - current_count) + else: + remove(current_count - count) + + +# TODO: Faster algorithm probably exists for this, research an alternatives +# if this ever becomes a performance bottleneck. +func shuffle(random_seed := 0) -> void: + var n = list.size() + if n < 2: + return + + var rng = RandomNumberGenerator.new() + rng.set_seed(random_seed) + + var i = n - 1 + var j + var tmp + while i >= 1: + j = rng.randi() % (i + 1) + tmp = list[j] + list[j] = list[i] + list[i] = tmp + i -= 1 + + +func clear() -> void: + list = [] + + +func is_empty() -> bool: + return list.is_empty() + + +func size() -> int: + return list.size() diff --git a/addons/proton_scatter/src/common/transform_list.gd.uid b/addons/proton_scatter/src/common/transform_list.gd.uid new file mode 100644 index 0000000..c3b719e --- /dev/null +++ b/addons/proton_scatter/src/common/transform_list.gd.uid @@ -0,0 +1 @@ +uid://dequmy1mjbwp5 diff --git a/addons/proton_scatter/src/common/util.gd b/addons/proton_scatter/src/common/util.gd new file mode 100644 index 0000000..50242b0 --- /dev/null +++ b/addons/proton_scatter/src/common/util.gd @@ -0,0 +1,29 @@ +@tool +extends RefCounted + + +static func get_position_and_normal_at(curve: Curve3D, offset: float) -> Array: + if not curve: + return [] + + var pos: Vector3 = curve.sample_baked(offset) + var normal := Vector3.ZERO + + var pos1 + if offset + curve.get_bake_interval() < curve.get_baked_length(): + pos1 = curve.sample_baked(offset + curve.get_bake_interval()) + normal = (pos1 - pos) + else: + pos1 = curve.sample_baked(offset - curve.get_bake_interval()) + normal = (pos - pos1) + + return [pos, normal] + + +static func remove_line_breaks(text: String) -> String: + # Remove tabs + text = text.replace("\t", "") + # Remove line breaks + text = text.replace("\n", " ") + # Remove occasional double space caused by the line above + return text.replace(" ", " ") diff --git a/addons/proton_scatter/src/common/util.gd.uid b/addons/proton_scatter/src/common/util.gd.uid new file mode 100644 index 0000000..b5f4c57 --- /dev/null +++ b/addons/proton_scatter/src/common/util.gd.uid @@ -0,0 +1 @@ +uid://wx1sy3ma58n7 diff --git a/addons/proton_scatter/src/documentation/documentation.gd b/addons/proton_scatter/src/documentation/documentation.gd new file mode 100644 index 0000000..46b7df1 --- /dev/null +++ b/addons/proton_scatter/src/documentation/documentation.gd @@ -0,0 +1,284 @@ +@tool +extends PopupPanel + + +# Formats and displays the DocumentationData provided by other parts of the addon +# TODO: Adjust title font size based on the editor font size / scaling + + +const DocumentationInfo = preload("./documentation_info.gd") +const SpecialPages = preload("./pages/special_pages.gd") + +var _pages := {} +var _items := {} +var _categories_roots := {} + +var _modifiers_root: TreeItem + +var _edited_text: String +var _accent_color := Color.CORNFLOWER_BLUE +var _editor_scale := 1.0 +var _header_size := 20 +var _sub_header_size := 16 + +var _populated := false + + +@onready var tree: Tree = $HSplitContainer/Tree +@onready var label: RichTextLabel = $HSplitContainer/RichTextLabel + + +func _ready() -> void: + tree.create_item() # Create tree root + tree.hide_root = true + tree.item_selected.connect(_on_item_selected) + + add_page(SpecialPages.get_scatter_documentation(), tree.create_item()) + add_page(SpecialPages.get_item_documentation(), tree.create_item()) + add_page(SpecialPages.get_shape_documentation(), tree.create_item()) + add_page(SpecialPages.get_cache_documentation(), tree.create_item()) + + _modifiers_root = tree.create_item() + add_page(SpecialPages.get_modifiers_documentation(), _modifiers_root) + + _populate() + + +# Fed from the StackPanel scene, before the ready function +func set_editor_plugin(editor_plugin: EditorPlugin) -> void: + if not editor_plugin: + return + + var editor_interface := editor_plugin.get_editor_interface() + var editor_settings := editor_interface.get_editor_settings() + + _accent_color = editor_settings.get("interface/theme/accent_color") + _editor_scale = editor_interface.get_editor_scale() + + +func show_page(page_name: String) -> void: + if not page_name in _items: + return + + var item: TreeItem = _items[page_name] + item.select(0) + popup_centered(Vector2i(900, 600)) + + +# Generate a formatted string from the DocumentationInfo input. +# This string will be stored and later displayed in the RichTextLabel so we +# we don't have to regenerate it everytime we look at another page. +func add_page(info: DocumentationInfo, item: TreeItem = null) -> void: + if not item: + var root: TreeItem = _get_or_create_tree_root(info.get_category()) + item = tree.create_item(root) + + item.set_text(0, info.get_title()) + + _begin_formatting() + + # Page title + _format_title(info.get_title()) + + # Paragraphs + for p in info.get_paragraphs(): + _format_paragraph(p) + + # Parameters + if not info.get_parameters().is_empty(): + _format_subtitle("Parameters") + + for p in info.get_parameters(): + _format_parameter(p) + + # Warnings + if not info.get_warnings().is_empty(): + _format_subtitle("Warnings") + + for w in info.get_warnings(): + _format_warning(w) + + _pages[item] = _get_formatted_text() + _items[info.get_title()] = item + + +func _populate(): + if _populated: # Already generated the documentation pages + return + + var path = _get_root_folder() + "/src/modifiers/" + var result := {} + _discover_modifiers_recursive(path, result) + + var names := result.keys() + names.sort() + + for n in names: + var info = result[n] + add_page(info) + + _populated = true + + +func _discover_modifiers_recursive(path, result) -> void: + var dir = DirAccess.open(path) + dir.list_dir_begin() + var path_root = dir.get_current_dir() + "/" + + while true: + var file = dir.get_next() + if file == "": + break + if file == "base_modifier.gd": + continue + if dir.current_is_dir(): + _discover_modifiers_recursive(path_root + file, result) + continue + if not file.ends_with(".gd") and not file.ends_with(".gdc"): + continue + + var full_path = path_root + file + var script = load(full_path) + if not script or not script.can_instantiate(): + print("Error: Failed to load script ", file) + continue + + var modifier = script.new() + + var info: DocumentationInfo = modifier.documentation + info.set_title(modifier.display_name) + info.set_category(modifier.category) + if modifier.use_edge_data: + info.add_warning( + "This modifier uses edge data (represented by the blue lines + on the Scatter node). These edges are usually locked to the + local XZ plane, (except for the Path shape when they are + NOT closed). If you can't see these lines, make sure to have at + least one Shape crossing the ProtonScatter local XZ plane.", + 1) + + if modifier.deprecated: + info.add_warning( + "This modifier has been deprecated. It won't receive any updates + and will be deleted in a future update.", + 2) + + result[modifier.display_name] = info + + dir.list_dir_end() + + +func _get_root_folder() -> String: + var script: Script = get_script() + var path: String = script.get_path().get_base_dir() + var folders = path.right(-6) # Remove the res:// + var tokens = folders.split('/') + return "res://" + tokens[0] + "/" + tokens[1] + + +func _get_or_create_tree_root(root_name: String) -> TreeItem: + if root_name in _categories_roots: + return _categories_roots[root_name] + + var root = tree.create_item(_modifiers_root) + root.set_text(0, root_name) + root.set_selectable(0, false) + _categories_roots[root_name] = root + return root + + +func _begin_formatting() -> void: + _edited_text = "" + + +func _get_formatted_text() -> String: + return _edited_text + + +func _format_title(text: String) -> void: + _edited_text += "[font_size=" + var_to_str(_header_size * _editor_scale) + "]" + _edited_text += "[color=" + _accent_color.to_html() + "]" + _edited_text += "[center][b]" + _edited_text += text + _edited_text += "[/b][/center]" + _edited_text += "[/color]" + _edited_text += "[/font_size]" + _format_line_break(2) + + +func _format_subtitle(text: String) -> void: + _edited_text += "[font_size=" + var_to_str(_header_size * _editor_scale) + "]" + _edited_text += "[color=" + _accent_color.to_html() + "]" + _edited_text += "[b]" + text + "[/b]" + _edited_text += "[/color]" + _edited_text += "[/font_size]" + _format_line_break(2) + + +func _format_line_break(count := 1) -> void: + for i in count: + _edited_text += "\n" + + +func _format_paragraph(text: String) -> void: + _edited_text += "[p]" + text + "[/p]" + _format_line_break(2) + + +func _format_parameter(p) -> void: + var root_folder = _get_root_folder() + + _edited_text += "[indent]" + + if not p.type.is_empty(): + var file_name = p.type.to_lower() + ".svg" + _edited_text += "[img]" + root_folder + "/icons/types/" + file_name + "[/img] " + + _edited_text += "[b]" + p.name + "[/b] " + + match p.cost: + 1: + _edited_text += "[img]" + root_folder + "/icons/arrow_log.svg[/img]" + 2: + _edited_text += "[img]" + root_folder + "/icons/arrow_linear.svg[/img]" + 3: + _edited_text += "[img]" + root_folder + "/icons/arrow_exp.svg[/img]" + + _format_line_break(2) + _edited_text += "[indent]" + p.description + "[/indent]" + _format_line_break(2) + + for warning in p.warnings: + if not warning.text.is_empty(): + _format_warning(warning) + + _edited_text += "[/indent]" + + +func _format_warning(w, indent := true) -> void: + if indent: + _edited_text += "[indent]" + + var color := "Darkgray" + match w.importance: + 1: + color = "yellow" + 2: + color = "red" + + _edited_text += "[color=" + color + "][i]" + w.text + "[/i][/color]\n" + + if indent: + _edited_text += "[/indent]" + + _format_line_break(1) + + +func _on_item_selected() -> void: + var selected: TreeItem = tree.get_selected() + + if _pages.has(selected): + var text: String = _pages[selected] + label.set_text(text) + else: + label.set_text("[center] Under construction [/center]") diff --git a/addons/proton_scatter/src/documentation/documentation.gd.uid b/addons/proton_scatter/src/documentation/documentation.gd.uid new file mode 100644 index 0000000..fbe75fd --- /dev/null +++ b/addons/proton_scatter/src/documentation/documentation.gd.uid @@ -0,0 +1 @@ +uid://bu423rc7uc12g diff --git a/addons/proton_scatter/src/documentation/documentation.tscn b/addons/proton_scatter/src/documentation/documentation.tscn new file mode 100644 index 0000000..0bcaa8f --- /dev/null +++ b/addons/proton_scatter/src/documentation/documentation.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://cfg8iqtuion8b"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/documentation/documentation.gd" id="1_5c4lw"] +[ext_resource type="PackedScene" uid="uid://cojoo2c73fpsb" path="res://addons/proton_scatter/src/documentation/panel.tscn" id="2_vpfxu"] + +[node name="Documentation" type="PopupPanel"] +title = "ProtonScatter documentation" +exclusive = true +unresizable = false +borderless = false +script = ExtResource("1_5c4lw") + +[node name="HSplitContainer" parent="." instance=ExtResource("2_vpfxu")] +offset_left = 4.0 +offset_top = 4.0 +offset_right = -1824.0 +offset_bottom = -984.0 + +[node name="Tree" parent="HSplitContainer" index="0"] +offset_right = 80.0 +offset_bottom = 92.0 +hide_root = true + +[node name="RichTextLabel" parent="HSplitContainer" index="1"] +offset_left = 92.0 +offset_right = 92.0 +offset_bottom = 92.0 + +[editable path="HSplitContainer"] diff --git a/addons/proton_scatter/src/documentation/documentation_info.gd b/addons/proton_scatter/src/documentation/documentation_info.gd new file mode 100644 index 0000000..b6eac91 --- /dev/null +++ b/addons/proton_scatter/src/documentation/documentation_info.gd @@ -0,0 +1,113 @@ +@tool +extends RefCounted + + +# Stores raw documentation data. + +# The data is provided by any class that needs an entry in the documentation +# panel. This was initially designed for all the modifiers, but might be expanded +# to other parts of the addon as well. + +# Formatting is handled by the main Documentation class. + +const Util := preload("../common/util.gd") + + +class Warning: + var text: String + var importance: int + +class Parameter: + var name: String + var cost: int + var type: String + var description: String + var warnings: Array[Warning] = [] + + func set_name(text: String) -> Parameter: + name = Util.remove_line_breaks(text) + return self + + func set_description(text: String) -> Parameter: + description = Util.remove_line_breaks(text) + return self + + func set_cost(val: int) -> Parameter: + cost = val + return self + + func set_type(val: String) -> Parameter: + type = Util.remove_line_breaks(val) + return self + + func add_warning(warning: String, warning_importance := -1) -> Parameter: + var w = Warning.new() + w.text = Util.remove_line_breaks(warning) + w.importance = warning_importance + warnings.push_back(w) + return self + + +var _category: String +var _page_title: String +var _paragraphs: Array[String] = [] +var _warnings: Array[Warning] = [] +var _parameters: Array[Parameter] = [] + + +func set_category(text: String) -> void: + _category = text + + +func set_title(text: String) -> void: + _page_title = text + + +func add_paragraph(text: String) -> void: + _paragraphs.push_back(Util.remove_line_breaks(text)) + + +# Warning importance: +# 0: Default (Grey) +# 1: Mid (Yellow) +# 2: Critical (Red) +func add_warning(text: String, importance: int = 0) -> void: + var w = Warning.new() + w.text = Util.remove_line_breaks(text) + w.importance = importance + + _warnings.push_back(w) + + +# Add documentation for a user exposed parameter. +# Cost: +# 0: None +# 1: Log +# 2: Linear +# 3: Exponential +func add_parameter(name := "") -> Parameter: + var p = Parameter.new() + p.name = name + p.cost = 0 + _parameters.push_back(p) + return p + + +func get_title() -> String: + return _page_title + + +func get_category() -> String: + return _category + + +func get_paragraphs() -> Array[String]: + return _paragraphs + + +func get_warnings() -> Array[Warning]: + return _warnings + + +func get_parameters() -> Array[Parameter]: + return _parameters diff --git a/addons/proton_scatter/src/documentation/documentation_info.gd.uid b/addons/proton_scatter/src/documentation/documentation_info.gd.uid new file mode 100644 index 0000000..108bd15 --- /dev/null +++ b/addons/proton_scatter/src/documentation/documentation_info.gd.uid @@ -0,0 +1 @@ +uid://bviiln2fhiiah diff --git a/addons/proton_scatter/src/documentation/pages/special_pages.gd b/addons/proton_scatter/src/documentation/pages/special_pages.gd new file mode 100644 index 0000000..1736632 --- /dev/null +++ b/addons/proton_scatter/src/documentation/pages/special_pages.gd @@ -0,0 +1,150 @@ +@tool +extends RefCounted + +const DocumentationInfo = preload("../documentation_info.gd") + + +static func get_scatter_documentation() -> DocumentationInfo: + var info := DocumentationInfo.new() + + info.set_title("ProtonScatter") + info.add_paragraph( + "ProtonScatter is a content positioning add-on. It is suited to place + a large amount of objects in a procedural way.") + info.add_paragraph( + "This add-on is [color=red][b]IN BETA[/b][/color] which means breaking + changes may happen. It is not recommended to use in production yet." + ) + info.add_paragraph( + "First, define [i]what[/i] you want to place using [b]ScatterItems[/b] + nodes.") + info.add_paragraph( + "Then, define [i]where[/i] to place them using [b]ScatterShapes[/b] + nodes.") + info.add_paragraph( + "Finaly, define [i]how[/i] the content should be placed using the + [b]Modifier stack[/b] that's on the [b]ProtonScatter[/b] node.") + info.add_paragraph( + "Each of these components have their dedicated documenation page, but + first, you should check out the example scenes in the demo folder.") + + var p := info.add_parameter("General / Global seed") + p.set_type("int") + p.set_description( + "The random seed to use on this node. Modifiers using random components + can access this value and use it accordingly. You can also specify + a custom seed for specific modifiers as well.") + + p = info.add_parameter("General / Show output in tree") + p.set_type("bool") + p.set_description( + "Show the generated items in the editor scene tree. By default this + option is disabled as it creates quite a bit of clutter when instancing + is disabled. It also increases the scene file size significantly.") + + p = info.add_parameter("Performance / Use instancing") + p.set_type("bool") + p.set_description( + "When enabled, ProtonScatter will use MultiMeshInstance3D nodes + instead of duplicating the source nodes. This allows the GPU to render + thousands of meshes in a single draw call.") + p.add_warning("Collisions and attached scripts are ignored when this + option is enabled.", 1) + + return info + + +static func get_item_documentation() -> DocumentationInfo: + var info := DocumentationInfo.new() + + info.set_title("ScatterItems") + + info.add_paragraph("TODO: Write this page") + + return info + + +static func get_shape_documentation() -> DocumentationInfo: + var info := DocumentationInfo.new() + + info.set_title("ScatterShapes") + + info.add_paragraph("TODO: Write this page") + + return info + + +static func get_cache_documentation() -> DocumentationInfo: + var info := DocumentationInfo.new() + + info.set_title("ScatterCache") + + info.add_paragraph( + "By default, Scatter nodes will recalculate their output on load, + which can be slow in really complex scenes. The cache allows you to + store these results in a file on your disk, and load these instead.") + info.add_paragraph( + "This can significantly speed up loading times, while also being VCS + friendly since the transforms are stored in their own files, rather + than your scenes files.") + info.add_paragraph("[b]How to use:[/b]") + info.add_paragraph( + "[p]+ Disable the [code]Force rebuild on load[code] on every Scatter item you want to cache.[/p] + [p]+ Add a ScatterCache node anywhere in your scene.[/p] + [p]+ Press the 'Rebuild' button to scan for other ProtonScatter nodes + and store their results in the cache.[/p]") + info.add_paragraph("[i]A single cache per scene is enough.[/i]") + + var p := info.add_parameter("Cache File") + p.set_cost(0) + p.set_description("Path to the cache file. By default they are store in the + add-on folder. Their name has a random component to avoid naming collisions + with scenes sharing the same file name. You are free to place this file + anywhere, using any name you would like.") + + return info + + +static func get_modifiers_documentation() -> DocumentationInfo: + var info := DocumentationInfo.new() + + info.set_title("Modifiers") + info.add_paragraph( + "A modifier takes in a Transform3D list, create, modify or delete + transforms, then pass it down to the next modifier. Remember that + [b] modifiers are processed from top to bottom [/b]. A modifier + down the stack will recieve a list processed by the modifiers above.") + info.add_paragraph( + "The initial transform list is empty, so it's necessary to start the + stack with a [b] Create [/b] modifier.") + info.add_paragraph( + "When clicking the [b] Expand button [/b] (the little arrow on the left) + you get access to this modifier's parameters. This is where you can + adjust its behavior according to your needs.") + info.add_paragraph( + "Three common options might be found on these modifiers. (They may + not appear if they are irrelevant). They are defined as follow:") + + var p := info.add_parameter("Use local seed") + p.set_type("bool") + p.set_description( + "The dice icon on the left allows you to force a specific seed for the + modifier. If this option is not used then the Global seed from the + ProtonScatter node will be used instead.") + + p = info.add_parameter("Restrict height") + p.set_type("bool") + p.set_description( + "When applicable, the modifier will remain within the local XZ plane + instead of using the full volume described by the ScatterShape nodes.") + + p = info.add_parameter("Reference frame") + p.set_type("int") + p.set_description( + "[p]+ [b]Global[/b]: Modifier operates in Global space. [/p] + [p]+ [b]Local[/b]: Modifier operates in local space, relative to the ProtonScatter node.[/p] + [p]+ [b]Individual[/b]: Modifier operates on local space, relative to each + individual transforms.[/p]" + ) + + return info diff --git a/addons/proton_scatter/src/documentation/pages/special_pages.gd.uid b/addons/proton_scatter/src/documentation/pages/special_pages.gd.uid new file mode 100644 index 0000000..082796d --- /dev/null +++ b/addons/proton_scatter/src/documentation/pages/special_pages.gd.uid @@ -0,0 +1 @@ +uid://cpocj4xj78mwu diff --git a/addons/proton_scatter/src/documentation/panel.tscn b/addons/proton_scatter/src/documentation/panel.tscn new file mode 100644 index 0000000..f5687e3 --- /dev/null +++ b/addons/proton_scatter/src/documentation/panel.tscn @@ -0,0 +1,22 @@ +[gd_scene format=3 uid="uid://cojoo2c73fpsb"] + +[node name="HSplitContainer" type="HSplitContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +split_offset = 250 + +[node name="Tree" type="Tree" parent="."] +layout_mode = 2 +offset_right = 250.0 +offset_bottom = 648.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +layout_mode = 2 +offset_left = 262.0 +offset_right = 1152.0 +offset_bottom = 648.0 +bbcode_enabled = true +text = "[center] [b] [i] Documentation page [/i] [/b] [/center]" diff --git a/addons/proton_scatter/src/modifiers/array.gd b/addons/proton_scatter/src/modifiers/array.gd new file mode 100644 index 0000000..d9abe1e --- /dev/null +++ b/addons/proton_scatter/src/modifiers/array.gd @@ -0,0 +1,182 @@ +@tool +extends "base_modifier.gd" + +# Takes existing objects and duplicates them recursively with given transforms + + +@export var amount := 1 +@export var min_amount := -1 +@export var local_offset := false +@export var offset := Vector3.ZERO +@export var local_rotation := false +@export var rotation := Vector3.ZERO +@export var individual_rotation_pivots := true +@export var rotation_pivot := Vector3.ZERO +@export var local_scale := true +@export var scale := Vector3.ONE +@export var randomize_indices := true + +var _rng: RandomNumberGenerator + + +func _init() -> void: + display_name = "Array" + category = "Create" + can_override_seed = true + can_restrict_height = false + global_reference_frame_available = false + local_reference_frame_available = false + individual_instances_reference_frame_available = false + + documentation.add_paragraph( + "Recursively creates copies of the existing transforms, with each copy + being offset from the previous one in any of a number of possible ways.") + + var p := documentation.add_parameter("Amount") + p.set_type("int") + p.set_cost(2) + p.set_description( + "The iteration count. If set to 1, each existing transforms are copied + once.") + p.add_warning("If set to 0, no copies are created.") + + p = documentation.add_parameter("Minimum amount") + p.set_type("int") + p.set_description( + "Creates a random amount of copies for each transforms, between this + value and the amount value.") + p.add_warning("Ignored if set to a negative value.") + + p = documentation.add_parameter("Offset") + p.set_type("Vector3") + p.set_description( + "Adds a constant offset between each copies and the previous one.") + + p = documentation.add_parameter("Local offset") + p.set_type("bool") + p.set_description( + "If enabled, offset is relative to the previous copy orientation. + Otherwise, the offset is in global space.") + + p = documentation.add_parameter("Rotation") + p.set_type("Vector3") + p.set_description( + "The rotation offset (on each axes) to add on each copy.") + + p = documentation.add_parameter("Local rotation") + p.set_type("bool") + p.set_description( + "If enabled, the rotation is applied in local space relative to each + individual transforms. Otherwise, the rotation is applied in global + space.") + + p = documentation.add_parameter("Rotation Pivot") + p.set_type("Vector3") + p.set_description( + "The point around which each copies are rotated. By default, each + transforms are rotated around their individual centers.") + + p = documentation.add_parameter("Individual Rotation Pivots") + p.set_type("bool") + p.set_description( + "If enabled, each copies will use their own pivot relative to the + previous copy. Otherwise, a single pivot point (defined in global space) + will be used for the rotation of [b]all[/b] the copies.") + + p = documentation.add_parameter("Scale") + p.set_type("Vector3") + p.set_description( + "Scales the copies relative to the transforms they are from.") + + p = documentation.add_parameter("Local Scale") + p.set_type("bool") + p.set_description( + "If enabled, scaling is applied in local space relative to each + individual transforms. Otherwise, global axes are used, resulting + in skewed transforms in most cases.") + + p = documentation.add_parameter("Randomize Indices") + p.set_type("bool") + p.set_description( + "Randomize the transform list order. This is only useful to break up the + repetitive patterns if you're using multiple ScatterItem nodes.") + + +func _process_transforms(transforms, domain, random_seed: int) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(random_seed) + + var new_transforms: Array[Transform3D] = [] + var rotation_rad := Vector3.ZERO + + rotation_rad.x = deg_to_rad(rotation.x) + rotation_rad.y = deg_to_rad(rotation.y) + rotation_rad.z = deg_to_rad(rotation.z) + + var axis_x := Vector3.RIGHT + var axis_y := Vector3.UP + var axis_z := Vector3.FORWARD + + for t in transforms.size(): + new_transforms.push_back(transforms.list[t]) + + var steps = amount + if min_amount >= 0: + steps = _rng.randi_range(min_amount, amount) + + for a in steps: + a += 1 + + # use original object's transform as base transform + var transform : Transform3D = transforms.list[t] + var basis := transform.basis + + # first move to rotation point defined in rotation offset + var rotation_pivot_offset = rotation_pivot + if individual_rotation_pivots: + rotation_pivot_offset = transform * rotation_pivot + + transform.origin -= rotation_pivot_offset + + # then rotate + if local_rotation: + axis_x = basis.x.normalized() + axis_y = basis.y.normalized() + axis_z = basis.z.normalized() + + transform = transform.rotated(axis_x, rotation_rad.x * a) + transform = transform.rotated(axis_y, rotation_rad.y * a) + transform = transform.rotated(axis_z, rotation_rad.z * a) + + # scale + # If the scale is different than 1, each transform gets bigger or + # smaller for each iteration. + var s = scale + s.x = pow(s.x, a) + s.y = pow(s.y, a) + s.z = pow(s.z, a) + + if local_scale: + transform.basis.x *= s.x + transform.basis.y *= s.y + transform.basis.z *= s.z + else: + transform.basis = transform.basis.scaled(s) + + # apply changes back to the transform and undo the rotation pivot offset + transform.origin += rotation_pivot_offset + + # offset + if local_offset: + transform.origin += offset * a + else: + transform.origin += (basis * offset) * a + + # store the final result if the position is valid + if not domain.is_point_excluded(transform.origin): + new_transforms.push_back(transform) + + transforms.list = new_transforms + + if randomize_indices: + transforms.shuffle(random_seed) diff --git a/addons/proton_scatter/src/modifiers/array.gd.uid b/addons/proton_scatter/src/modifiers/array.gd.uid new file mode 100644 index 0000000..6f9077e --- /dev/null +++ b/addons/proton_scatter/src/modifiers/array.gd.uid @@ -0,0 +1 @@ +uid://c428hkioaua7a diff --git a/addons/proton_scatter/src/modifiers/base_modifier.gd b/addons/proton_scatter/src/modifiers/base_modifier.gd new file mode 100644 index 0000000..c166f6e --- /dev/null +++ b/addons/proton_scatter/src/modifiers/base_modifier.gd @@ -0,0 +1,126 @@ +@tool +class_name ScatterBaseModifier +extends Resource + +# Modifiers place transforms. They create, edit or remove transforms in a list, +# before the next Modifier in the stack does the same. +# All Modifiers must inherit from this class. +# Transforms in the provided transforms list must be in global space. + + +signal warning_changed +signal modifier_changed + +const TransformList = preload("../common/transform_list.gd") +const Domain = preload("../common/domain.gd") +const DocumentationInfo = preload("../documentation/documentation_info.gd") + +@export var enabled := true +@export var override_global_seed := false +@export var custom_seed := 0 +@export var restrict_height := false # Tells the modifier whether to constrain transforms to the local XY plane or not +@export var reference_frame := 0 + +var display_name: String = "Base Modifier Name" +var category: String = "None" +var documentation := DocumentationInfo.new() +var warning: String = "" +var warning_ignore_no_transforms := false +var warning_ignore_no_shape := true +var expanded := false +var can_override_seed := false +var can_restrict_height := true +var global_reference_frame_available := true +var local_reference_frame_available := false +var individual_instances_reference_frame_available := false +var use_edge_data := false +var deprecated := false +var deprecation_message: String +var interrupt_update: bool = false + + +func get_warning() -> String: + return warning + + +func process_transforms(transforms: TransformList, domain: Domain, global_seed: int) -> void: + if not domain.get_root().is_inside_tree(): + return + + if Engine.is_editor_hint(): + _clear_warning() + + if deprecated: + warning += "This modifier is deprecated.\n" + warning += deprecation_message + "\n" + + if not enabled: + warning_changed.emit() + return + + if domain.is_empty() and not warning_ignore_no_shape: + warning += """The Scatter node does not have a shape. + Add at least one ScatterShape node as a child.\n""" + + if transforms.is_empty() and not warning_ignore_no_transforms: + warning += """There's no transforms to act on. + Make sure you have a Create modifier before this one.\n + """ + + var random_seed: int = global_seed + if can_override_seed and override_global_seed: + random_seed = custom_seed + interrupt_update = false + + @warning_ignore("redundant_await") # Not redundant as child classes could use the await keyword here. + await _process_transforms(transforms, domain, random_seed) + + warning_changed.emit() + + +func get_copy(): + var script: Script = get_script() + var copy = script.new() + for p in get_property_list(): + var value = get(p.name) + copy.set(p.name, value) + return copy + + +## Notify the modifier it should stop updating as soon as it can. +func interrupt() -> void: + interrupt_update = true + + +func is_using_global_space() -> bool: + return reference_frame == 0 + + +func is_using_local_space() -> bool: + return reference_frame == 1 + + +func is_using_individual_instances_space() -> bool: + return reference_frame == 2 + + +func use_global_space_by_default() -> void: + reference_frame = 0 + + +func use_local_space_by_default() -> void: + reference_frame = 1 + + +func use_individual_instances_space_by_default() -> void: + reference_frame = 2 + + +func _clear_warning() -> void: + warning = "" + warning_changed.emit() + + +# Override in inherited class +func _process_transforms(_transforms: TransformList, _domain: Domain, _seed: int) -> void: + pass diff --git a/addons/proton_scatter/src/modifiers/base_modifier.gd.uid b/addons/proton_scatter/src/modifiers/base_modifier.gd.uid new file mode 100644 index 0000000..5f2ed51 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/base_modifier.gd.uid @@ -0,0 +1 @@ +uid://cnmsv3hyahjcc diff --git a/addons/proton_scatter/src/modifiers/clusterize.gd b/addons/proton_scatter/src/modifiers/clusterize.gd new file mode 100644 index 0000000..5f17358 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/clusterize.gd @@ -0,0 +1,131 @@ +@tool +extends "base_modifier.gd" + + +@export_file("Texture") var mask: String +@export var mask_rotation := 0.0 +@export var mask_offset := Vector2.ZERO +@export var mask_scale := Vector2.ONE +@export var pixel_to_unit_ratio := 64.0 +@export_range(0.0, 1.0) var remove_below = 0.1 +@export_range(0.0, 1.0) var remove_above = 1.0 +@export var scale_transforms := true + + +func _init() -> void: + display_name = "Clusterize" + category = "Edit" + global_reference_frame_available = true + local_reference_frame_available = false # TODO, enable this and handle this case + individual_instances_reference_frame_available = false + + documentation.add_paragraph( + "Clump transforms together based on a mask. + Sampling the mask returns values between 0 and 1. The transforms are + scaled against these values which means, bright areas don't affect their + scale while dark area scales them down. Transforms are then removed + below a threshold, leaving clumps behind.") + + var p := documentation.add_parameter("Mask") + p.set_type("Texture") + p.set_description("The texture used as a mask.") + p.add_warning( + "The amount of texture fetch depends on the amount of transforms + generated in the previous modifiers (4 reads for each transform). + In theory, the texture size shouldn't affect performances in a + noticeable way.") + + p = documentation.add_parameter("Mask scale") + p.set_type("Vector2") + p.set_description( + "Depending on the mask resolution, the perceived scale will change. + Use this parameter to increase or decrease the area covered by the mask.") + + p = documentation.add_parameter("Mask offset") + p.set_type("Vector2") + p.set_description("Moves the mask XZ position in 3D space") + + p = documentation.add_parameter("Mask rotation") + p.set_type("Float") + p.set_description("Rotates the mask around the Y axis. (Angle in degrees)") + + p = documentation.add_parameter("Remove below") + p.set_type("Float") + p.set_description("Threshold below which the transforms are removed.") + + p = documentation.add_parameter("Remove above") + p.set_type("Float") + p.set_description("Threshold above which the transforms are removed.") + +func _process_transforms(transforms, domain, _seed) -> void: + if not ResourceLoader.exists(mask): + warning += "The specified file " + mask + " could not be loaded." + return + + var texture: Texture = load(mask) + + if not texture is Texture: + warning += "The specified file is not a valid texture." + return + + var image: Image + + # Wait for a frame or risk the whole editor to freeze because of get_image() + # TODO: Check if more safe guards are required here. + await domain.get_root().get_tree().process_frame + + if texture is Texture2D: + image = texture.get_image() + + elif texture is Texture3D: + image = texture.get_data()[0] # TMP, this should depends on the transforms Y coordinates + + elif texture is TextureLayered: + image = texture.get_layer_data(0) # TMP + + image.decompress() + + var width := image.get_width() + var height := image.get_height() + var i := 0 + var angle := deg_to_rad(mask_rotation) + + while i < transforms.list.size(): + var t: Transform3D = transforms.list[i] + var origin := t.origin.rotated(Vector3.UP, angle) + + var x := origin.x * (pixel_to_unit_ratio / mask_scale.x) + mask_offset.x + x = fposmod(x, width - 1) + var y := origin.z * (pixel_to_unit_ratio / mask_scale.y) + mask_offset.y + y = fposmod(y, height - 1) + + var level := _get_pixel(image, x, y) + if level < remove_below: + transforms.list.remove_at(i) + continue + + if level > remove_above: + transforms.list.remove_at(i) + continue + + if scale_transforms: + t.basis = t.basis.scaled(Vector3(level, level, level)) + + transforms.list[i] = t + i += 1 + + +# x and y don't always match an exact pixel, so we sample the neighboring +# pixels as well and return a weighted value based on the input coords. +func _get_pixel(image: Image, x: float, y: float) -> float: + var ix = int(x) + var iy = int(y) + x -= ix + y -= iy + + var nw = image.get_pixel(ix, iy).v + var ne = image.get_pixel(ix + 1, iy).v + var sw = image.get_pixel(ix, iy + 1).v + var se = image.get_pixel(ix + 1, iy + 1).v + + return nw * (1 - x) * (1 - y) + ne * x * (1 - y) + sw * (1 - x) * y + se * x * y diff --git a/addons/proton_scatter/src/modifiers/clusterize.gd.uid b/addons/proton_scatter/src/modifiers/clusterize.gd.uid new file mode 100644 index 0000000..78c539b --- /dev/null +++ b/addons/proton_scatter/src/modifiers/clusterize.gd.uid @@ -0,0 +1 @@ +uid://bacumt66875l3 diff --git a/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl b/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl new file mode 100644 index 0000000..4c9aa11 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl @@ -0,0 +1,43 @@ +#[compute] +#version 450 + +// Invocations in the (x, y, z) dimension +layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; + +// A binding to the input buffer we create in our script +layout(set = 0, binding = 0, std430) readonly buffer BufferIn { + vec4 data[]; +} +buffer_in; + +// A binding to the output buffer we create in our script +layout(set = 0, binding = 1, std430) restrict buffer BufferOut { + vec4 data[]; +} +buffer_out; + +// The code we want to execute in each invocation +void main() { + int last_element_index = buffer_in.data.length(); + // Unique index for each element + uint workgroupSize = gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z; + uint index = gl_WorkGroupID.x * workgroupSize + gl_LocalInvocationIndex; + + vec3 infvec = vec3(1, 1, 1) * 999999; // vector approaching "infinity" + vec3 closest = infvec; // initialize closest to infinity + vec3 origin = buffer_in.data[index].xyz; + + for(int i = 0; i <= last_element_index; i++){ + vec3 newvec = buffer_in.data[i].xyz; + + if (i == index) continue; // ignore self + + float olddist = length(closest - origin); + float newdist = length(newvec - origin); + if (newdist < olddist) + { + closest = newvec; + } + } + buffer_out.data[index] = vec4(origin - closest, 0); +} diff --git a/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl.import b/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl.import new file mode 100644 index 0000000..05cbec3 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl.import @@ -0,0 +1,14 @@ +[remap] + +importer="glsl" +type="RDShaderFile" +uid="uid://cpg67dxgr360g" +path="res://.godot/imported/compute_relax.glsl-b06f9e60cda7719b78bde9673f2501b7.res" + +[deps] + +source_file="res://addons/proton_scatter/src/modifiers/compute_shaders/compute_relax.glsl" +dest_files=["res://.godot/imported/compute_relax.glsl-b06f9e60cda7719b78bde9673f2501b7.res"] + +[params] + diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd b/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd new file mode 100644 index 0000000..c6eb0de --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd @@ -0,0 +1,98 @@ +@tool +extends "base_modifier.gd" + + +@export var item_length := 2.0 +@export var ignore_slopes := false + +var _current_offset = 0.0 + + +func _init() -> void: + display_name = "Create Along Edge (Continuous)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + use_edge_data = true + global_reference_frame_available = false + local_reference_frame_available = false + individual_instances_reference_frame_available = false + + var p + + documentation.add_paragraph( + "Create new transforms along the edges of the Scatter shapes. These + transforms are placed so they touch each other but don't overlap, even + if the curve has sharp turns.") + + documentation.add_paragraph( + "This is useful to place props suchs as fences, walls or anything that + needs to look organized without leaving gaps.") + + documentation.add_warning( + "The transforms are placed starting from the begining of each curves. + If the curve is closed, there will be a gap at the end if the total + curve length isn't a multiple of the item length.") + + p = documentation.add_parameter("Item length") + p.set_type("float") + p.set_description("How long is the item being placed") + p.set_cost(2) + p.add_warning( + "The smaller this value, the more transforms will be created. + Setting a slightly different length than the actual model length + allow for gaps between each transforms.") + + p = documentation.add_parameter("Ignore slopes") + p.set_type("bool") + p.set_description( + "If enabled, all the curves will be projected to the local XZ plane + before creating the new transforms.") + + +# TODO: Use dichotomic search instead of fixed step length? +func _process_transforms(transforms, domain, seed) -> void: + var new_transforms: Array[Transform3D] = [] + var curves: Array[Curve3D] = domain.get_edges() + + for curve in curves: + if not ignore_slopes: + curve = curve.duplicate() + else: + curve = get_projected_curve(curve, domain.get_global_transform()) + + var length_squared = pow(item_length, 2) + var offset_max = curve.get_baked_length() + var offset = 0.0 + var step = item_length / 20.0 + + while offset < offset_max: + var start := curve.sample_baked(offset) + var end: Vector3 + var dist: float + offset += item_length * 0.9 # Saves a few iterations, the target + # point will never be closer than the item length, only further + + while offset < offset_max: + offset += step + end = curve.sample_baked(offset) + dist = start.distance_squared_to(end) + + if dist >= length_squared: + var t = Transform3D() + t.origin = start + ((end - start) / 2.0) + new_transforms.push_back(t.looking_at(end, Vector3.UP)) + break + + transforms.append(new_transforms) + transforms.shuffle(seed) + + +func get_projected_curve(curve: Curve3D, t: Transform3D) -> Curve3D: + var points = curve.tessellate() + var new_curve = Curve3D.new() + for p in points: + p.y = t.origin.y + new_curve.add_point(p) + + return new_curve diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd.uid b/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd.uid new file mode 100644 index 0000000..1c1b0b2 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd.uid @@ -0,0 +1 @@ +uid://dud4dqcsypnql diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_even.gd b/addons/proton_scatter/src/modifiers/create_along_edge_even.gd new file mode 100644 index 0000000..503c8ab --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_even.gd @@ -0,0 +1,79 @@ +@tool +extends "base_modifier.gd" + + +const Util := preload("../common/util.gd") + + +# TODO : +# + change alignement parameters to something more usable and intuitive +# + Use the curve up vector, default to local Y+ when not available +@export var spacing := 1.0 +@export var offset := 0.0 +@export var align_to_path := false +@export var align_up_axis := Vector3.UP + +var _min_spacing := 0.05 + + +func _init() -> void: + display_name = "Create Along Edge (Even)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = false + use_edge_data = true + + var p + documentation.add_paragraph( + "Evenly create transforms along the edges of the ScatterShapes") + + p = documentation.add_parameter("Spacing") + p.set_type("float") + p.set_description("How much space between the transforms origin") + p.set_cost(3) + p.add_warning("The smaller the value, the denser the resulting transforms list.", 1) + p.add_warning( + "A value of 0 would result in infinite transforms, so it's capped + to 0.05 at least.") + + +func _process_transforms(transforms, domain, seed) -> void: + spacing = max(_min_spacing, spacing) + + var gt_inverse: Transform3D = domain.get_global_transform().affine_inverse() + var new_transforms: Array[Transform3D] = [] + var curves: Array[Curve3D] = domain.get_edges() + + for curve in curves: + var length: float = curve.get_baked_length() + var count := int(round(length / spacing)) + var stepped_length: float = count * spacing + + for i in count: + var curve_offset = i * spacing + abs(offset) + + while curve_offset > stepped_length: # Loop back to the curve start if offset is too large + curve_offset -= stepped_length + + var data : Array = Util.get_position_and_normal_at(curve, curve_offset) + var pos: Vector3 = data[0] + var normal: Vector3 = data[1] + + if domain.is_point_excluded(pos): + continue + + var t := Transform3D() + t.origin = pos + if align_to_path: + t = t.looking_at(normal + pos, align_up_axis) + elif is_using_global_space(): + t.basis = gt_inverse.basis + + new_transforms.push_back(t) + + transforms.append(new_transforms) + transforms.shuffle(seed) diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_even.gd.uid b/addons/proton_scatter/src/modifiers/create_along_edge_even.gd.uid new file mode 100644 index 0000000..c825e01 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_even.gd.uid @@ -0,0 +1 @@ +uid://dnsjvpts0fo5u diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_random.gd b/addons/proton_scatter/src/modifiers/create_along_edge_random.gd new file mode 100644 index 0000000..b83580c --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_random.gd @@ -0,0 +1,69 @@ +@tool +extends "base_modifier.gd" + + +@export var instance_count := 10 +@export var align_to_path := false +@export var align_up_axis := Vector3.UP + +var _rng: RandomNumberGenerator + + +func _init() -> void: + display_name = "Create Along Edge (Random)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + use_edge_data = true + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = false + + +func _process_transforms(transforms, domain, random_seed) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(random_seed) + + var gt_inverse: Transform3D = domain.get_global_transform().affine_inverse() + var new_transforms: Array[Transform3D] = [] + var curves: Array[Curve3D] = domain.get_edges() + var total_curve_length := 0.0 + + for curve in curves: + var length: float = curve.get_baked_length() + total_curve_length += length + + for curve in curves: + var length: float = curve.get_baked_length() + var local_instance_count: int = round((length / total_curve_length) * instance_count) + + for i in local_instance_count: + var data = get_pos_and_normal(curve, _rng.randf() * length) + var pos: Vector3 = data[0] + var normal: Vector3 = data[1] + var t := Transform3D() + + t.origin = pos + if align_to_path: + t = t.looking_at(normal + pos, align_up_axis) + elif is_using_global_space(): + t.basis = gt_inverse.basis + + new_transforms.push_back(t) + + transforms.append(new_transforms) + + +func get_pos_and_normal(curve: Curve3D, offset : float) -> Array: + var pos: Vector3 = curve.sample_baked(offset) + var normal := Vector3.ZERO + + var pos1 + if offset + curve.get_bake_interval() < curve.get_baked_length(): + pos1 = curve.sample_baked(offset + curve.get_bake_interval()) + normal = (pos1 - pos) + else: + pos1 = curve.sample_baked(offset - curve.get_bake_interval()) + normal = (pos - pos1) + + return [pos, normal] diff --git a/addons/proton_scatter/src/modifiers/create_along_edge_random.gd.uid b/addons/proton_scatter/src/modifiers/create_along_edge_random.gd.uid new file mode 100644 index 0000000..b3a84a7 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_along_edge_random.gd.uid @@ -0,0 +1 @@ +uid://cqjrn64u7g3ms diff --git a/addons/proton_scatter/src/modifiers/create_inside_grid.gd b/addons/proton_scatter/src/modifiers/create_inside_grid.gd new file mode 100644 index 0000000..475a2b3 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_grid.gd @@ -0,0 +1,97 @@ +@tool +extends "base_modifier.gd" + + +@export var spacing := Vector3(2.0, 2.0, 2.0) + +var _min_spacing := 0.05 + + +func _init() -> void: + display_name = "Create Inside (Grid)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + can_restrict_height = true + restrict_height = true + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = false + + documentation.add_paragraph( + "Place transforms along the edges of the ScatterShapes") + + documentation.add_paragraph( + "When [b]Local Space[/b] is enabled, the grid is aligned with the + Scatter root node. Otherwise, the grid is aligned with the global + axes." + ) + + var p = documentation.add_parameter("Spacing") + p.set_type("vector3") + p.set_description( + "Defines the grid size along the 3 axes. A spacing of 1 means 1 unit + of space between each transform on this axis.") + p.set_cost(3) + p.add_warning( + "The smaller the value, the denser the resulting transforms list. + Use with care as the performance impact will go up quickly.", 1) + p.add_warning( + "A value of 0 would result in infinite transforms, so it's capped to 0.05 + at least.") + + +func _process_transforms(transforms, domain, seed) -> void: + spacing.x = max(_min_spacing, spacing.x) + spacing.y = max(_min_spacing, spacing.y) + spacing.z = max(_min_spacing, spacing.z) + + var gt: Transform3D = domain.get_local_transform() + var center: Vector3 = domain.bounds_local.center + var size: Vector3 = domain.bounds_local.size + + var half_size := size * 0.5 + var start_corner := center - half_size + var baseline: float = 0.0 + + var width := int(ceil(size.x / spacing.x)) + var height := int(ceil(size.y / spacing.y)) + var length := int(ceil(size.z / spacing.z)) + + if restrict_height: + height = 1 + baseline = domain.bounds_local.max.y + else: + height = max(1, height) # Make sure height never gets below 1 or else nothing happens + + var max_count: int = width * length * height + var new_transforms: Array[Transform3D] = [] + new_transforms.resize(max_count) + + var t: Transform3D + var pos: Vector3 + var t_index := 0 + + for i in width * length: + for j in height: + t = Transform3D() + pos = Vector3.ZERO + pos.x = (i % width) * spacing.x + pos.y = (j * spacing.y) + baseline + pos.z = (i / width) * spacing.z + pos += start_corner + + if is_using_global_space(): + t.basis = gt.affine_inverse().basis + pos = t * pos + + if domain.is_point_inside(pos): + t.origin = pos + new_transforms[t_index] = t + t_index += 1 + + if t_index != new_transforms.size(): + new_transforms.resize(t_index) + + transforms.append(new_transforms) + transforms.shuffle(seed) diff --git a/addons/proton_scatter/src/modifiers/create_inside_grid.gd.uid b/addons/proton_scatter/src/modifiers/create_inside_grid.gd.uid new file mode 100644 index 0000000..e34d3aa --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_grid.gd.uid @@ -0,0 +1 @@ +uid://be6fi4fa4exf3 diff --git a/addons/proton_scatter/src/modifiers/create_inside_poisson.gd b/addons/proton_scatter/src/modifiers/create_inside_poisson.gd new file mode 100644 index 0000000..1ee9daf --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_poisson.gd @@ -0,0 +1,230 @@ +@tool +extends "base_modifier.gd" + + +# Poisson disc sampling based on Sebastian Lague implementation, modified to +# support both 2D and 3D space. +# Reference: https://www.youtube.com/watch?v=7WcmyxyFO7o + +# TODO: This doesn't work if the valid space isn't one solid space +# (fails to fill the full domain if it's made of discrete, separate shapes) + + +const Bounds := preload("../common/bounds.gd") + +@export var radius := 1.0 +@export var samples_before_rejection := 15 + + +var _rng: RandomNumberGenerator +var _squared_radius: float +var _domain +var _bounds: Bounds + +var _gt: Transform3D +var _points: Array[Transform3D] # Stores the generated points +var _grid: Array[int] = [] # Flattened array +var _grid_size := Vector3i.ZERO +var _cell_size: float +var _cell_x: int +var _cell_y: int +var _cell_z: int + + +func _init() -> void: + display_name = "Create Inside (Poisson)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + can_restrict_height = true + can_override_seed = true + restrict_height = true + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = false + use_local_space_by_default() + + documentation.add_paragraph( + "Place transforms without overlaps. Transforms are assumed to have a + spherical shape.") + + var p := documentation.add_parameter("Radius") + p.set_type("float") + p.set_description("Transform size.") + p.add_warning( + "The larger the radius, the harder it will be to place the transform, + resulting in a faster early exit. + On the other hand, smaller radius means more room for more points, + meaning more transforms to generate so it will take longer to complete.") + + p = documentation.add_parameter("Samples before rejection") + p.set_type("int") + p.set_description( + "The algorithm tries a point at random until it finds a valid one. This + parameter controls how many attempts before moving to the next + iteration. Lower values are faster but gives poor coverage. Higher + values generates better coverage but are slower.") + p.set_cost(2) + + documentation.add_warning( + "This modifier uses a poisson disk sampling algorithm which can be + quite slow.") + + +func _process_transforms(transforms, domain, seed) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(seed) + _domain = domain + _bounds = _domain.bounds_local + _gt = domain.get_global_transform() + _points = [] + _init_grid() + + # Stores the possible starting points from where we run the sampling. + # This array will progressively be emptied as the algorithm progresses. + var spawn_points: Array[Transform3D] + spawn_points.push_back(_get_starting_point()) + + # Sampler main loop + while not spawn_points.is_empty(): + + # Pick a starting point at random from the existing list + var spawn_index: int = _rng.randi_range(0, spawn_points.size() - 1) + var spawn_center := spawn_points[spawn_index] + + var tries := 0 + var candidate_accepted := false + + while tries < samples_before_rejection: + tries += 1 + + # Generate a random point in space, outside the radius of the spawn point + var dir: Vector3 = _generate_random_vector() + var candidate: Vector3 = spawn_center.origin + dir * _rng.randf_range(radius, radius * 2.0) + + if _is_valid(candidate): + candidate_accepted = true + + # Add new points to the lists + var t = Transform3D() + t.origin = candidate + + if is_using_global_space(): + t.basis = _gt.affine_inverse().basis + + _points.push_back(t) + spawn_points.push_back(t) + + var index: int + if restrict_height: + index = _cell_x + _cell_z * _grid_size.z + else: + index = _cell_x + (_grid_size.y * _cell_y) + (_grid_size.x * _grid_size.y * _cell_z) + + if index < _grid.size(): + _grid[index] = _points.size() - 1 + + break + + # Failed to find a point after too many tries. The space around this + # spawn point is probably full, discard it. + if not candidate_accepted: + spawn_points.remove_at(spawn_index) + + transforms.append(_points) + transforms.shuffle(seed) + + +func _init_grid() -> void: + _squared_radius = radius * radius + _cell_size = radius / sqrt(2) + _grid_size.x = ceil(_bounds.size.x / _cell_size) + _grid_size.y = ceil(_bounds.size.y / _cell_size) + _grid_size.z = ceil(_bounds.size.z / _cell_size) + + _grid_size = _grid_size.clamp(Vector3.ONE, _grid_size) + + _grid = [] + if restrict_height: + _grid.resize(_grid_size.x * _grid_size.z) + else: + _grid.resize(_grid_size.x * _grid_size.y * _grid_size.z) + + +# Starting point must be inside the domain, or we run the risk to never generate +# any valid point later on +# TODO: Domain may have islands, so we should use multiple starting points +func _get_starting_point() -> Transform3D: + var point: Vector3 = _bounds.center + + var tries := 0 + while not _domain.is_point_inside(point) or tries > 200: + tries += 1 + point.x = _rng.randf_range(_bounds.min.x, _bounds.max.x) + point.y = _rng.randf_range(_bounds.min.y, _bounds.max.y) + point.z = _rng.randf_range(_bounds.min.z, _bounds.max.z) + + if restrict_height: + point.y = _bounds.center.y + + var starting_point := Transform3D() + starting_point.origin = point + return starting_point + + +func _is_valid(candidate: Vector3) -> bool: + if not _domain.is_point_inside(candidate): + return false + + # compute candidate current cell + var t_candidate = candidate - _bounds.min + _cell_x = floor(t_candidate.x / _cell_size) + _cell_y = floor(t_candidate.y / _cell_size) + _cell_z = floor(t_candidate.z / _cell_size) + + # Search the surrounding cells for other points + var search_start_x: int = max(0, _cell_x - 2) + var search_end_x: int = min(_cell_x + 2, _grid_size.x - 1) + var search_start_y: int = max(0, _cell_y - 2) + var search_end_y: int = min(_cell_y + 2, _grid_size.y - 1) + var search_start_z: int = max(0, _cell_z - 2) + var search_end_z: int = min(_cell_z + 2, _grid_size.z - 1) + + if restrict_height: + for x in range(search_start_x, search_end_x + 1): + for z in range(search_start_z, search_end_z + 1): + var point_index = _grid[x + z * _grid_size.z] + if _is_point_too_close(candidate, point_index): + return false + else: + for x in range(search_start_x, search_end_x + 1): + for y in range(search_start_y, search_end_y + 1): + for z in range(search_start_z, search_end_z + 1): + var point_index = _grid[x + (_grid_size.y * y) + (_grid_size.x * _grid_size.y * z)] + if _is_point_too_close(candidate, point_index): + return false + + return true + + +func _is_point_too_close(candidate: Vector3, point_index: int) -> bool: + if point_index >= _points.size(): + return false + + var other_point := _points[point_index] + var squared_dist: float = candidate.distance_squared_to(other_point.origin) + return squared_dist < _squared_radius + + +func _generate_random_vector(): + var angle = _rng.randf_range(0.0, TAU) + if restrict_height: + return Vector3(sin(angle), 0.0, cos(angle)) + + var costheta = _rng.randf_range(-1.0, 1.0) + var theta = acos(costheta) + var vector := Vector3.ZERO + vector.x = sin(theta) * cos(angle) + vector.y = sin(theta) * sin(angle) + vector.z = cos(theta) + return vector diff --git a/addons/proton_scatter/src/modifiers/create_inside_poisson.gd.uid b/addons/proton_scatter/src/modifiers/create_inside_poisson.gd.uid new file mode 100644 index 0000000..dcc2e00 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_poisson.gd.uid @@ -0,0 +1 @@ +uid://bp0cvkshvlusy diff --git a/addons/proton_scatter/src/modifiers/create_inside_random.gd b/addons/proton_scatter/src/modifiers/create_inside_random.gd new file mode 100644 index 0000000..8bbc9c3 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_random.gd @@ -0,0 +1,84 @@ +@tool +extends "base_modifier.gd" + + +@export var amount := 10 + +var _rng: RandomNumberGenerator + + +func _init() -> void: + display_name = "Create Inside (Random)" + category = "Create" + warning_ignore_no_transforms = true + warning_ignore_no_shape = false + can_override_seed = true + global_reference_frame_available = true + local_reference_frame_available = true + use_local_space_by_default() + + documentation.add_paragraph( + "Randomly place new transforms inside the area defined by + the ScatterShape nodes.") + + var p := documentation.add_parameter("Amount") + p.set_type("int") + p.set_description("How many transforms will be created.") + p.set_cost(2) + + documentation.add_warning( + "In some cases, the amount of transforms created by this modifier + might be lower than the requested amount (but never higher). This may + happen if the provided ScatterShape has a huge bounding box but a tiny + valid space, like a curved and narrow path.") + + +# TODO: +# + Multithreading +# + Spatial partionning to discard areas outside the domain earlier +func _process_transforms(transforms, domain, random_seed) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(random_seed) + + var gt: Transform3D = domain.get_global_transform() + var center: Vector3 = domain.bounds_local.center + var half_size: Vector3 = domain.bounds_local.size / 2.0 + var height: float = domain.bounds_local.center.y + + # Generate a random point in the bounding box. Store if it's inside the + # domain, or discard if invalid. Repeat until enough valid points are found. + var t: Transform3D + var pos: Vector3 + var new_transforms: Array[Transform3D] = [] + var max_retries = amount * 10 # TODO: expose this parameter? + var tries := 0 + + while new_transforms.size() != amount: + t = Transform3D() + pos = _random_vec3() * half_size + center + + if restrict_height: + pos.y = height + + if is_using_global_space(): + t.basis = gt.affine_inverse().basis + + if domain.is_point_inside(pos): + t.origin = pos + new_transforms.push_back(t) + continue + + # Prevents an infinite loop + tries += 1 + if tries > max_retries: + break + + transforms.append(new_transforms) + + +func _random_vec3() -> Vector3: + var vec3 = Vector3.ZERO + vec3.x = _rng.randf_range(-1.0, 1.0) + vec3.y = _rng.randf_range(-1.0, 1.0) + vec3.z = _rng.randf_range(-1.0, 1.0) + return vec3 diff --git a/addons/proton_scatter/src/modifiers/create_inside_random.gd.uid b/addons/proton_scatter/src/modifiers/create_inside_random.gd.uid new file mode 100644 index 0000000..d706635 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/create_inside_random.gd.uid @@ -0,0 +1 @@ +uid://ccca88h6hgw0k diff --git a/addons/proton_scatter/src/modifiers/look_at.gd b/addons/proton_scatter/src/modifiers/look_at.gd new file mode 100644 index 0000000..51e2562 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/look_at.gd @@ -0,0 +1,39 @@ +@tool +extends "base_modifier.gd" + + +@export var target := Vector3.ZERO +@export var up := Vector3.UP + + +func _init() -> void: + display_name = "Look At" + category = "Edit" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_local_space_by_default() + + documentation.add_paragraph("Rotates every transform such that the forward axis (-Z) points towards the target position.") + + documentation.add_parameter("Target").set_type("Vector3").set_description( + "Target position (X, Y, Z)") + documentation.add_parameter("Up").set_type("Vector3").set_description( + "Up axes (X, Y, Z)") + + +func _process_transforms(transforms, domain, _seed : int) -> void: + var st: Transform3D = domain.get_global_transform() + + for i in transforms.size(): + var transform: Transform3D = transforms.list[i] + var local_target := target + + if is_using_global_space(): + local_target = st.affine_inverse().basis * local_target + + elif is_using_individual_instances_space(): + local_target = transform.basis * local_target + + transforms.list[i] = transform.looking_at(local_target, up) diff --git a/addons/proton_scatter/src/modifiers/look_at.gd.uid b/addons/proton_scatter/src/modifiers/look_at.gd.uid new file mode 100644 index 0000000..783a2a5 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/look_at.gd.uid @@ -0,0 +1 @@ +uid://qfbpnqrbdxm6 diff --git a/addons/proton_scatter/src/modifiers/offset_position.gd b/addons/proton_scatter/src/modifiers/offset_position.gd new file mode 100644 index 0000000..deefd84 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_position.gd @@ -0,0 +1,63 @@ +@tool +extends "base_modifier.gd" + + +@export_enum("Offset:0", "Multiply:1", "Override:2") var operation: int +@export var position := Vector3.ZERO + + + +func _init() -> void: + display_name = "Edit Position" + category = "Offset" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + documentation.add_paragraph("Moves every transform the same way.") + + var p := documentation.add_parameter("Position") + p.set_type("vector3") + p.set_description("How far each transforms are moved.") + + +func _process_transforms(transforms, domain, _seed) -> void: + var s_gt: Transform3D = domain.get_global_transform() + var s_gt_inverse: Transform3D = s_gt.affine_inverse() + var t: Transform3D + + for i in transforms.list.size(): + t = transforms.list[i] + + var value: Vector3 + + if is_using_individual_instances_space(): + value = t.basis * position + elif is_using_global_space(): + value = s_gt_inverse.basis * position + else: + value = position + + match operation: + 0: + t.origin += value + 1: + if is_using_local_space(): + t.origin *= value + + if is_using_global_space(): + var global_pos = s_gt * t.origin + global_pos -= s_gt.origin + global_pos *= position + global_pos += s_gt.origin + + t.origin = s_gt_inverse * global_pos + + elif is_using_individual_instances_space(): + pass # Multiply does nothing on this reference frame. + 2: + t.origin = value + + transforms.list[i] = t diff --git a/addons/proton_scatter/src/modifiers/offset_position.gd.uid b/addons/proton_scatter/src/modifiers/offset_position.gd.uid new file mode 100644 index 0000000..53b3942 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_position.gd.uid @@ -0,0 +1 @@ +uid://qoqguk5b4g3x diff --git a/addons/proton_scatter/src/modifiers/offset_rotation.gd b/addons/proton_scatter/src/modifiers/offset_rotation.gd new file mode 100644 index 0000000..ab7b11b --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_rotation.gd @@ -0,0 +1,100 @@ +@tool +extends "base_modifier.gd" + + +@export_enum("Offset:0", "Multiply:1", "Override:2") var operation: int +@export var rotation := Vector3.ZERO + + +func _init() -> void: + display_name = "Edit Rotation" + category = "Offset" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + documentation.add_paragraph("Rotates every transform.") + + documentation.add_parameter("Rotation").set_type("Vector3").set_description( + "Rotation angle (in degrees) along each axes (X, Y, Z)") + + +func _process_transforms(transforms, domain, _seed : int) -> void: + var rotation_rad := Vector3.ZERO + rotation_rad.x = deg_to_rad(rotation.x) + rotation_rad.y = deg_to_rad(rotation.y) + rotation_rad.z = deg_to_rad(rotation.z) + + var s_gt: Transform3D = domain.get_global_transform() + var s_lt: Transform3D = domain.get_local_transform() + var s_gt_inverse := s_gt.affine_inverse() + var t: Transform3D + var basis: Basis + var axis_x: Vector3 + var axis_y: Vector3 + var axis_z: Vector3 + var final_rotation: Vector3 + + if is_using_local_space(): + axis_x = Vector3.RIGHT + axis_y = Vector3.UP + axis_z = Vector3.FORWARD + + elif is_using_global_space(): + axis_x = (s_gt_inverse.basis * Vector3.RIGHT).normalized() + axis_y = (s_gt_inverse.basis * Vector3.UP).normalized() + axis_z = (s_gt_inverse.basis * Vector3.FORWARD).normalized() + + for i in transforms.size(): + t = transforms.list[i] + basis = t.basis + + match operation: + 0: # Offset + final_rotation = rotation_rad + + 1: # Multiply + # TMP: Local and global space calculations are probably wrong + var current_rotation: Vector3 + + if is_using_individual_instances_space(): + current_rotation = basis.get_euler() + + elif is_using_local_space(): + var local_t := t * s_lt + current_rotation = local_t.basis.get_euler() + + else: + var global_t := t * s_gt + current_rotation = global_t.basis.get_euler() + + final_rotation = (current_rotation * rotation) - current_rotation + + 2: # Override + # Creates a new basis with the original scale only + # Applies new rotation on top + + if is_using_individual_instances_space(): + basis = Basis().from_scale(t.basis.get_scale()) + + elif is_using_local_space(): + basis = (s_gt_inverse * s_gt).basis + + else: + var tmp_t = Transform3D(Basis.from_scale(t.basis.get_scale()), Vector3.ZERO) + basis = (s_gt_inverse * tmp_t).basis + + final_rotation = rotation_rad + + if is_using_individual_instances_space(): + axis_x = basis.x.normalized() + axis_y = basis.y.normalized() + axis_z = basis.z.normalized() + + basis = basis.rotated(axis_y, final_rotation.y) + basis = basis.rotated(axis_x, final_rotation.x) + basis = basis.rotated(axis_z, final_rotation.z) + + transforms.list[i].basis = basis diff --git a/addons/proton_scatter/src/modifiers/offset_rotation.gd.uid b/addons/proton_scatter/src/modifiers/offset_rotation.gd.uid new file mode 100644 index 0000000..e8cf653 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_rotation.gd.uid @@ -0,0 +1 @@ +uid://b7eyuysggjmjx diff --git a/addons/proton_scatter/src/modifiers/offset_scale.gd b/addons/proton_scatter/src/modifiers/offset_scale.gd new file mode 100644 index 0000000..7ab8389 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_scale.gd @@ -0,0 +1,94 @@ +@tool +extends "base_modifier.gd" + + +@export_enum("Offset:0", "Multiply:1", "Override:2") var operation: int = 1 +@export var scale := Vector3(1, 1, 1) + + +func _init() -> void: + display_name = "Edit Scale" + category = "Offset" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + documentation.add_paragraph("Scales every transform.") + + var p := documentation.add_parameter("Scale") + p.set_type("Vector3") + p.set_description("How much to scale the transform along each axes (X, Y, Z)") + + +func _process_transforms(transforms, domain, _seed) -> void: + var s_gt: Transform3D = domain.get_global_transform() + var s_lt: Transform3D = domain.get_local_transform() + var s_gt_inverse := s_gt.affine_inverse() + var s_lt_inverse := s_lt.affine_inverse() + var basis: Basis + var t: Transform3D + var tmp_t: Transform3D + + for i in transforms.size(): + t = transforms.list[i] + basis = t.basis + + match operation: + 0: # Offset + if is_using_individual_instances_space(): + var current_scale := basis.get_scale() + var s = (current_scale + scale) / current_scale + basis = t.scaled_local(s).basis + + elif is_using_global_space(): + # Convert to global space, scale, convert back to local space + tmp_t = s_gt * t + var current_scale: Vector3 = tmp_t.basis.get_scale() + tmp_t.basis = tmp_t.basis.scaled((current_scale + scale) / current_scale) + basis = (s_gt_inverse * tmp_t).basis + + else: + var current_scale: Vector3 = basis.get_scale() + basis = basis.scaled((current_scale + scale) / current_scale) + + 1: # Multiply + if is_using_individual_instances_space(): + basis = t.scaled_local(scale).basis + + elif is_using_global_space(): + # Convert to global space, scale, convert back to local space + tmp_t = s_gt * t + tmp_t = tmp_t.scaled(scale) + basis = (s_gt_inverse * tmp_t).basis + + else: + basis = basis.scaled(scale) + + 2: # Override + if is_using_individual_instances_space(): + var t_scale: Vector3 = basis.get_scale() + t_scale.x = (1.0 / t_scale.x) * scale.x + t_scale.y = (1.0 / t_scale.y) * scale.y + t_scale.z = (1.0 / t_scale.z) * scale.z + basis = t.scaled_local(t_scale).basis + + elif is_using_global_space(): + # Convert to global space, scale, convert back to local space + tmp_t = t * s_gt + var t_scale: Vector3 = tmp_t.basis.get_scale() + t_scale.x = (1.0 / t_scale.x) * scale.x + t_scale.y = (1.0 / t_scale.y) * scale.y + t_scale.z = (1.0 / t_scale.z) * scale.z + tmp_t.basis = tmp_t.basis.scaled(t_scale) + basis = (s_gt_inverse * tmp_t).basis + + else: + var t_scale: Vector3 = basis.get_scale() + t_scale.x = (1.0 / t_scale.x) * scale.x + t_scale.y = (1.0 / t_scale.y) * scale.y + t_scale.z = (1.0 / t_scale.z) * scale.z + basis = basis.scaled(t_scale) + + transforms.list[i].basis = basis diff --git a/addons/proton_scatter/src/modifiers/offset_scale.gd.uid b/addons/proton_scatter/src/modifiers/offset_scale.gd.uid new file mode 100644 index 0000000..ad444ad --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_scale.gd.uid @@ -0,0 +1 @@ +uid://7jqgthh5206u diff --git a/addons/proton_scatter/src/modifiers/offset_transform.gd b/addons/proton_scatter/src/modifiers/offset_transform.gd new file mode 100644 index 0000000..5caba1b --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_transform.gd @@ -0,0 +1,83 @@ +@tool +extends "base_modifier.gd" + + +@export var position := Vector3.ZERO +@export var rotation := Vector3(0.0, 0.0, 0.0) +@export var scale := Vector3.ONE + + +func _init() -> void: + display_name = "Edit Transform" + category = "Offset" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_local_space_by_default() + deprecated = true + deprecation_message = "Use a combination of 'Edit Position', 'Edit Rotation' and 'Edit Scale' instead." + + documentation.add_paragraph( + "Offsets position, rotation and scale in a single modifier. Every + transforms generated before will see the same transformation applied.") + + var p := documentation.add_parameter("Position") + p.set_type("Vector3") + p.set_description("How far each transforms are moved.") + + p = documentation.add_parameter("Rotation") + p.set_type("Vector3") + p.set_description("Rotation angle (in degrees) along each axes (X, Y, Z)") + + p = documentation.add_parameter("Scale") + p.set_type("Vector3") + p.set_description("How much to scale the transform along each axes (X, Y, Z)") + + +func _process_transforms(transforms, domain, _seed) -> void: + var t: Transform3D + var local_t: Transform3D + var basis: Basis + var axis_x := Vector3.RIGHT + var axis_y := Vector3.UP + var axis_z := Vector3.DOWN + var final_scale := scale + var final_position := position + var st: Transform3D = domain.get_global_transform() + + if is_using_local_space(): + axis_x = st.basis.x + axis_y = st.basis.y + axis_z = st.basis.z + final_scale = scale.rotated(Vector3.RIGHT, st.basis.get_euler().x) + final_position = st.basis * position + + for i in transforms.size(): + t = transforms.list[i] + basis = t.basis + + if is_using_individual_instances_space(): + axis_x = basis.x + axis_y = basis.y + axis_z = basis.z + basis.x *= scale.x + basis.y *= scale.y + basis.z *= scale.z + final_position = t.basis * position + + elif is_using_local_space(): + local_t = t * st + local_t.basis = local_t.basis.scaled(final_scale) + basis = (st * local_t).basis + + else: + basis = basis.scaled(final_scale) + + basis = basis.rotated(axis_x, deg_to_rad(rotation.x)) + basis = basis.rotated(axis_y, deg_to_rad(rotation.y)) + basis = basis.rotated(axis_z, deg_to_rad(rotation.z)) + t.basis = basis + t.origin += final_position + + transforms.list[i] = t diff --git a/addons/proton_scatter/src/modifiers/offset_transform.gd.uid b/addons/proton_scatter/src/modifiers/offset_transform.gd.uid new file mode 100644 index 0000000..eb09e6c --- /dev/null +++ b/addons/proton_scatter/src/modifiers/offset_transform.gd.uid @@ -0,0 +1 @@ +uid://c1uwa0nfw1icd diff --git a/addons/proton_scatter/src/modifiers/project_on_geometry.gd b/addons/proton_scatter/src/modifiers/project_on_geometry.gd new file mode 100644 index 0000000..6df96f3 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/project_on_geometry.gd @@ -0,0 +1,216 @@ +@tool +extends "base_modifier.gd" + + +signal projection_completed + + +const ProtonScatterPhysicsHelper := preload("res://addons/proton_scatter/src/common/physics_helper.gd") + + +@export var ray_direction := Vector3.DOWN +@export var ray_length := 10.0 +@export var ray_offset := 1.0 +@export var remove_points_on_miss := true +@export var align_with_collision_normal := false +@export_range(0.0, 90.0) var max_slope = 90.0 +@export_flags_3d_physics var collision_mask = 1 +@export_flags_3d_physics var exclude_mask = 0 + + +func _init() -> void: + display_name = "Project On Colliders" + category = "Edit" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_global_space_by_default() + + documentation.add_paragraph( + "Moves each transforms along the ray direction until they hit a collider. + This is useful to avoid floating objects on uneven terrain for example.") + + documentation.add_warning( + "This modifier only works when physics bodies are around. It will ignore + simple MeshInstances nodes.") + + var p := documentation.add_parameter("Ray direction") + p.set_type("Vector3") + p.set_description( + "In which direction we look for a collider. This default to the DOWN + direction by default (look at the ground).") + p.add_warning( + "This is relative to the transform is local space is enabled, or aligned + with the global axis if local space is disabled.") + + p = documentation.add_parameter("Ray length") + p.set_type("float") + p.set_description("How far we look for other physics objects.") + p.set_cost(2) + + p = documentation.add_parameter("Ray offset") + p.set_type("Vector3") + p.set_description( + "Moves back the raycast origin point along the ray direction. This is + useful if the initial transform is slightly below the ground, which would + make the raycast miss the collider (since it would start inside).") + + p = documentation.add_parameter("Remove points on miss") + p.set_type("bool") + p.set_description( + "When enabled, if the raycast didn't collide with anything, or collided + with a surface above the max slope setting, the transform is removed + from the list. + This is useful to avoid floating objects that are too far from the rest + of the scene's geometry.") + + p = documentation.add_parameter("Align with collision normal") + p.set_type("bool") + p.set_description( + "Rotate the transform to align it with the collision normal in case + the ray cast hit a collider.") + + p = documentation.add_parameter("Max slope") + p.set_type("float") + p.set_description( + "Angle (in degrees) after which the hit is considered invalid. + When a ray cast hit, the normal of the ray is compared against the + normal of the hit. If you set the slope to 0°, the ray and the hit + normal would have to be perfectly aligned to be valid. On the other + hand, setting the maximum slope to 90° treats every collisions as + valid regardless of their normals.") + + p = documentation.add_parameter("Mask") + p.set_description( + "Only collide with colliders on these layers. Disabled layers will + be ignored. It's useful to ignore players or npcs that might be on the + scene when you're editing it.") + + p = documentation.add_parameter("Exclude Mask") + p.set_description( + "Tests if the snapping would collide with the selected layers. + If it collides, the point will be excluded from the list.") + + +func _process_transforms(transforms, domain, _seed) -> void: + if transforms.is_empty(): + return + + # Create all the physics ray queries + var gt: Transform3D = domain.get_global_transform() + var gt_inverse := gt.affine_inverse() + var queries: Array[PhysicsRayQueryParameters3D] = [] + var exclude_queries: Array[PhysicsRayQueryParameters3D] = [] + + for t in transforms.list: + var start = gt * t.origin + var end = start + var dir = ray_direction.normalized() + + if is_using_individual_instances_space(): + dir = t.basis * dir + + elif is_using_local_space(): + dir = gt.basis * dir + + start -= ray_offset * dir + end += ray_length * dir + + var ray_query := PhysicsRayQueryParameters3D.new() + ray_query.from = start + ray_query.to = end + ray_query.collision_mask = collision_mask + + queries.push_back(ray_query) + + var exclude_query := PhysicsRayQueryParameters3D.new() + exclude_query.from = start + exclude_query.to = end + exclude_query.collision_mask = exclude_mask + exclude_queries.push_back(exclude_query) + + # Run the queries in the physics helper since we can't access the PhysicsServer + # from outside the _physics_process while also being in a separate thread. + var physics_helper: ProtonScatterPhysicsHelper = domain.get_root().get_physics_helper() + + var ray_hits := await physics_helper.execute(queries) + + if ray_hits.is_empty(): + return + + # Create queries from the hit points + var index := -1 + for ray_hit in ray_hits: + index += 1 + var hit : Dictionary = ray_hit + if hit.is_empty(): + exclude_queries[index].collision_mask = 0 # this point is empty anyway, we dont care + continue + exclude_queries[index].to = hit.position # only cast up to hit point for correct ordering + + var exclude_hits : Array[Dictionary] = [] + if exclude_mask != 0: # Only cast the rays if it makes any sense + exclude_hits = await physics_helper.execute(exclude_queries) + + # Apply the results + index = 0 + var d: float + var t: Transform3D + var remapped_max_slope = remap(max_slope, 0.0, 90.0, 0.0, 1.0) + var is_point_valid := false + exclude_hits.reverse() # makes it possible to use pop_back which is much faster + var new_transforms_array : Array[Transform3D] = [] + + for hit in ray_hits: + is_point_valid = true + + if hit.is_empty(): + is_point_valid = false + else: + d = abs(Vector3.UP.dot(hit.normal)) + is_point_valid = d >= (1.0 - remapped_max_slope) + + var exclude_hit = exclude_hits.pop_back() + if exclude_hit != null: + if not exclude_hit.is_empty(): + is_point_valid = false + + t = transforms.list[index] + if is_point_valid: + if align_with_collision_normal: + t = _align_with(t, gt_inverse.basis * hit.normal) + + t.origin = gt_inverse * hit.position + new_transforms_array.push_back(t) + elif not remove_points_on_miss: + new_transforms_array.push_back(t) + + index += 1 + + # All done, store the transforms in the original array + transforms.list.clear() + transforms.list.append_array(new_transforms_array) # this avoids memory leak + + if transforms.is_empty(): + warning += """Every points have been removed. Possible reasons include: \n + + No collider is close enough to the shapes. + + Ray length is too short. + + Ray direction is incorrect. + + Collision mask is not set properly. + + Max slope is too low. + """ + + +func _align_with(t: Transform3D, normal: Vector3) -> Transform3D: + var n1 = t.basis.y.normalized() + var n2 = normal.normalized() + + var cosa = n1.dot(n2) + var alpha = acos(cosa) + var axis = n1.cross(n2) + + if axis == Vector3.ZERO: + return t + + return t.rotated(axis.normalized(), alpha) diff --git a/addons/proton_scatter/src/modifiers/project_on_geometry.gd.uid b/addons/proton_scatter/src/modifiers/project_on_geometry.gd.uid new file mode 100644 index 0000000..ae81b90 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/project_on_geometry.gd.uid @@ -0,0 +1 @@ +uid://quoo7t5rxnu3 diff --git a/addons/proton_scatter/src/modifiers/proxy.gd b/addons/proton_scatter/src/modifiers/proxy.gd new file mode 100644 index 0000000..e22a9db --- /dev/null +++ b/addons/proton_scatter/src/modifiers/proxy.gd @@ -0,0 +1,75 @@ +@tool +extends "base_modifier.gd" + + +const ProtonScatter := preload("../scatter.gd") +const ModifierStack := preload("../stack/modifier_stack.gd") + + +@export_node_path var scatter_node: NodePath +@export var auto_rebuild := true: + set(val): + auto_rebuild = val + if not is_instance_valid(_source_node) or not _source_node is ProtonScatter: + return + + if auto_rebuild: # Connect signal if not already connected + if not _source_node.build_completed.is_connected(_on_source_changed): + _source_node.build_completed.connect(_on_source_changed) + + # Auto rebuild disabled, disconnect signal if connected + elif _source_node.build_completed.is_connected(_on_source_changed): + _source_node.build_completed.disconnect(_on_source_changed) + +var _source_node: ProtonScatter: + set(val): + # Disconnect signals from previous scatter node if any + if is_instance_valid(_source_node) and _source_node is ProtonScatter: + if _source_node.build_completed.is_connected(_on_source_changed): + _source_node.build_completed.disconnect(_on_source_changed) + + # Replace reference and retrigger the auto_rebuild setter + _source_node = val + auto_rebuild = auto_rebuild + + +func _init() -> void: + display_name = "Proxy" + category = "Misc" + can_restrict_height = false + can_override_seed = false + global_reference_frame_available = false + local_reference_frame_available = false + individual_instances_reference_frame_available = false + warning_ignore_no_transforms = true + + documentation.add_paragraph("Copy a modifier stack from another ProtonScatter node in the scene.") + documentation.add_paragraph( + "Useful when you need multiple Scatter nodes sharing the same rules, without having to + replicate their modifiers and settings in each." + ) + documentation.add_paragraph( + "Unlike presets which are full independent copies, this method is more similar to a linked + copy. Changes on the original modifier stack will be accounted for in here." + ) + + var p = documentation.add_parameter("Scatter node") + p.set_type("NodePath") + p.set_description("The Scatter node to use as a reference.") + + +func _process_transforms(transforms, domain, _seed) -> void: + _source_node = domain.get_root().get_node_or_null(scatter_node) + + if not _source_node or not _source_node is ProtonScatter: + warning += "You need to select a valid ProtonScatter node." + return + + if _source_node.modifier_stack: + var stack: ModifierStack = _source_node.modifier_stack.get_copy() + var results = await stack.start_update(domain.get_root(), domain) + transforms.append(results.list) + + +func _on_source_changed() -> void: + modifier_changed.emit() diff --git a/addons/proton_scatter/src/modifiers/proxy.gd.uid b/addons/proton_scatter/src/modifiers/proxy.gd.uid new file mode 100644 index 0000000..2acab4c --- /dev/null +++ b/addons/proton_scatter/src/modifiers/proxy.gd.uid @@ -0,0 +1 @@ +uid://dc4a75tpyhqla diff --git a/addons/proton_scatter/src/modifiers/randomize_rotation.gd b/addons/proton_scatter/src/modifiers/randomize_rotation.gd new file mode 100644 index 0000000..a60cee8 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/randomize_rotation.gd @@ -0,0 +1,88 @@ +@tool +extends "base_modifier.gd" + + +@export var rotation := Vector3(360.0, 360.0, 360.0) +@export var snap_angle := Vector3.ZERO + +var _rng: RandomNumberGenerator + + +func _init() -> void: + display_name = "Randomize Rotation" + category = "Edit" + can_override_seed = true + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + documentation.add_paragraph("Randomly rotate every transforms individually.") + + var p := documentation.add_parameter("Rotation") + p.set_type("Vector3") + p.set_description("Rotation angle (in degrees) along each axes (X, Y, Z)") + + p = documentation.add_parameter("Snap angle") + p.set_type("Vector3") + p.set_description( + "When set to any value above 0, the rotation will be done by increments + of the snap angle.") + p.add_warning( + "Example: When Snap Angle is set to 90, the possible random rotation + offsets around an axis will be among [0, 90, 180, 360].") + + +func _process_transforms(transforms, domain, random_seed) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(random_seed) + + var t: Transform3D + var b: Basis + + var gt: Transform3D = domain.get_global_transform() + var gb: Basis = gt.basis + var axis_x: Vector3 = Vector3.RIGHT + var axis_y: Vector3 = Vector3.UP + var axis_z: Vector3 = Vector3.FORWARD + + if is_using_local_space(): + axis_x = (Vector3.RIGHT * gb).normalized() + axis_y = (Vector3.UP * gb).normalized() + axis_z = (Vector3.FORWARD * gb).normalized() + + for i in transforms.list.size(): + t = transforms.list[i] + b = t.basis + + if is_using_individual_instances_space(): + axis_x = t.basis.x.normalized() + axis_y = t.basis.y.normalized() + axis_z = t.basis.z.normalized() + + b = b.rotated(axis_x, _random_angle(rotation.x, snap_angle.x)) + b = b.rotated(axis_y, _random_angle(rotation.y, snap_angle.y)) + b = b.rotated(axis_z, _random_angle(rotation.z, snap_angle.z)) + + t.basis = b + transforms.list[i] = t + + +func _random_vec3() -> Vector3: + var vec3 = Vector3.ZERO + vec3.x = _rng.randf_range(-1.0, 1.0) + vec3.y = _rng.randf_range(-1.0, 1.0) + vec3.z = _rng.randf_range(-1.0, 1.0) + return vec3 + + +func _random_angle(rot: float, snap: float) -> float: + return deg_to_rad(snapped(_rng.randf_range(-1.0, 1.0) * rot, snap)) + + +func _clamp_vector(vec3, vmin, vmax) -> Vector3: + vec3.x = clamp(vec3.x, vmin.x, vmax.x) + vec3.y = clamp(vec3.y, vmin.y, vmax.y) + vec3.z = clamp(vec3.z, vmin.z, vmax.z) + return vec3 diff --git a/addons/proton_scatter/src/modifiers/randomize_rotation.gd.uid b/addons/proton_scatter/src/modifiers/randomize_rotation.gd.uid new file mode 100644 index 0000000..9ac5e9e --- /dev/null +++ b/addons/proton_scatter/src/modifiers/randomize_rotation.gd.uid @@ -0,0 +1 @@ +uid://cc46mq2l386ss diff --git a/addons/proton_scatter/src/modifiers/randomize_transforms.gd b/addons/proton_scatter/src/modifiers/randomize_transforms.gd new file mode 100644 index 0000000..ab3e28f --- /dev/null +++ b/addons/proton_scatter/src/modifiers/randomize_transforms.gd @@ -0,0 +1,106 @@ +@tool +extends "base_modifier.gd" + + +@export var position := Vector3.ZERO +@export var rotation := Vector3.ZERO +@export var scale := Vector3.ZERO + +var _rng: RandomNumberGenerator + + +func _init() -> void: + display_name = "Randomize Transforms" + category = "Edit" + can_override_seed = true + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + +func _process_transforms(transforms, domain, random_seed) -> void: + _rng = RandomNumberGenerator.new() + _rng.set_seed(random_seed) + + var t: Transform3D + var global_t: Transform3D + var basis: Basis + var random_scale: Vector3 + var random_position: Vector3 + var s_gt: Transform3D = domain.get_global_transform() + var s_gt_inverse := s_gt.affine_inverse() + + # Global rotation axis + var axis_x := Vector3.RIGHT + var axis_y := Vector3.UP + var axis_z := Vector3.DOWN + + if is_using_global_space(): + axis_x = (s_gt_inverse.basis * Vector3.RIGHT).normalized() + axis_y = (s_gt_inverse.basis * Vector3.UP).normalized() + axis_z = (s_gt_inverse.basis * Vector3.FORWARD).normalized() + + for i in transforms.size(): + t = transforms.list[i] + basis = t.basis + + # Apply rotation + if is_using_individual_instances_space(): + axis_x = basis.x.normalized() + axis_y = basis.y.normalized() + axis_z = basis.z.normalized() + + basis = basis.rotated(axis_x, deg_to_rad(_random_float() * rotation.x)) + basis = basis.rotated(axis_y, deg_to_rad(_random_float() * rotation.y)) + basis = basis.rotated(axis_z, deg_to_rad(_random_float() * rotation.z)) + + # Apply scale + random_scale = Vector3.ONE + (_rng.randf() * scale) + + if is_using_individual_instances_space(): + basis.x *= random_scale.x + basis.y *= random_scale.y + basis.z *= random_scale.z + + elif is_using_global_space(): + global_t = s_gt * Transform3D(basis, Vector3.ZERO) + global_t = global_t.scaled(random_scale) + basis = (s_gt_inverse * global_t).basis + + else: + basis = basis.scaled(random_scale) + + # Apply position + random_position = _random_vec3() * position + + if is_using_individual_instances_space(): + random_position = t.basis * random_position + + elif is_using_global_space(): + random_position = s_gt_inverse.basis * random_position + + t.origin += random_position + t.basis = basis + + transforms.list[i] = t + + +func _random_vec3() -> Vector3: + var vec3 = Vector3.ZERO + vec3.x = _rng.randf_range(-1.0, 1.0) + vec3.y = _rng.randf_range(-1.0, 1.0) + vec3.z = _rng.randf_range(-1.0, 1.0) + return vec3 + + +func _random_float() -> float: + return _rng.randf_range(-1.0, 1.0) + + +func _clamp_vector(vec3, vmin, vmax) -> Vector3: + vec3.x = clamp(vec3.x, vmin.x, vmax.x) + vec3.y = clamp(vec3.y, vmin.y, vmax.y) + vec3.z = clamp(vec3.z, vmin.z, vmax.z) + return vec3 diff --git a/addons/proton_scatter/src/modifiers/randomize_transforms.gd.uid b/addons/proton_scatter/src/modifiers/randomize_transforms.gd.uid new file mode 100644 index 0000000..25288fb --- /dev/null +++ b/addons/proton_scatter/src/modifiers/randomize_transforms.gd.uid @@ -0,0 +1 @@ +uid://ccb3ri34jjl0p diff --git a/addons/proton_scatter/src/modifiers/relax.gd b/addons/proton_scatter/src/modifiers/relax.gd new file mode 100644 index 0000000..84527b7 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/relax.gd @@ -0,0 +1,191 @@ +@tool +extends "base_modifier.gd" + + +static var shader_file: RDShaderFile + + +@export var iterations : int = 3 +@export var offset_step : float = 0.01 +@export var consecutive_step_multiplier : float = 0.5 +@export var use_computeshader : bool = true + + +func _init() -> void: + display_name = "Relax Position" + category = "Edit" + global_reference_frame_available = false + local_reference_frame_available = false + individual_instances_reference_frame_available = false + can_restrict_height = true + restrict_height = true + + documentation.add_warning( + "This modifier is has an O(n²) complexity and will be slow with + large amounts of points, unless your device supports compute shaders.", + 1) + + var p := documentation.add_parameter("iterations") + p.set_type("int") + p.set_cost(2) + p.set_description( + "How many times the relax algorithm will run. Increasing this value will + generally improves the result, at the cost of execution speed." + ) + + p = documentation.add_parameter("Offset step") + p.set_type("float") + p.set_cost(0) + p.set_description("How far the transform will be pushed away each iteration.") + + p = documentation.add_parameter("Consecutive step multiplier") + p.set_type("float") + p.set_cost(0) + p.set_description( + "On each iteration, multiply the offset step by this value. This value + is usually set between 0 and 1, to make the effect less pronounced on + successive iterations.") + + p = documentation.add_parameter("Use compute shader") + p.set_cost(0) + p.set_type("bool") + p.set_description( + "Run the calculations on the GPU instead of the CPU. This provides + a significant speed boost and should be enabled when possible.") + p.add_warning( + "This parameter can't be enabled when using the OpenGL backend or running + in headless mode.", 2) + + +func _process_transforms(transforms, _domain, _seed) -> void: + var offset := offset_step + if transforms.size() < 2: + return + + # Disable the use of compute shader, if we cannot create a RenderingDevice + if use_computeshader: + var rd := RenderingServer.create_local_rendering_device() + if rd == null: + use_computeshader = false + else: + rd.free() + rd = null + + if use_computeshader: + for iteration in iterations: + if interrupt_update: + return + var movedir: PackedVector3Array = compute_closest(transforms) + for i in transforms.size(): + var dir = movedir[i] + if restrict_height: + dir.y = 0.0 + # move away from closest point + transforms.list[i].origin += dir.normalized() * offset + + offset *= consecutive_step_multiplier + + else: + # calculate the relax transforms on the cpu + for iteration in iterations: + for i in transforms.size(): + if interrupt_update: + return + var min_vector = Vector3.ONE * 99999.0 + var threshold := 99999.0 + var distance := 0.0 + var diff: Vector3 + + # Find the closest point + for j in transforms.size(): + if i == j: + continue + + diff = transforms.list[i].origin - transforms.list[j].origin + distance = diff.length_squared() + + if distance < threshold: + min_vector = diff + threshold = distance + + if restrict_height: + min_vector.y = 0.0 + + # move away from closest point + transforms.list[i].origin += min_vector.normalized() * offset + + offset *= consecutive_step_multiplier + + +# compute the closest points to each other using a compute shader +# return a vector for each point that points away from the closest neighbour +func compute_closest(transforms) -> PackedVector3Array: + var padded_num_vecs = ceil(float(transforms.size()) / 64.0) * 64 + var padded_num_floats = padded_num_vecs * 4 + var rd := RenderingServer.create_local_rendering_device() + var shader_spirv: RDShaderSPIRV = get_shader_file().get_spirv() + var shader := rd.shader_create_from_spirv(shader_spirv) + # Prepare our data. We use vec4 floats in the shader, so we need 32 bit. + var input := PackedFloat32Array() + for i in transforms.size(): + input.append(transforms.list[i].origin.x) + input.append(transforms.list[i].origin.y) + input.append(transforms.list[i].origin.z) + input.append(0) # needed to use vec4, necessary for byte alignment in the shader code + # buffer size, number of vectors sent to the gpu + input.resize(padded_num_floats) # indexing in the compute shader requires padding + var input_bytes := input.to_byte_array() + var output_bytes := input_bytes.duplicate() + # Create a storage buffer that can hold our float values. + var buffer_in := rd.storage_buffer_create(input_bytes.size(), input_bytes) + var buffer_out := rd.storage_buffer_create(output_bytes.size(), output_bytes) + + # Create a uniform to assign the buffer to the rendering device + var uniform_in := RDUniform.new() + uniform_in.uniform_type = RenderingDevice.UNIFORM_TYPE_STORAGE_BUFFER + uniform_in.binding = 0 # this needs to match the "binding" in our shader file + uniform_in.add_id(buffer_in) + # Create a uniform to assign the buffer to the rendering device + var uniform_out := RDUniform.new() + uniform_out.uniform_type = RenderingDevice.UNIFORM_TYPE_STORAGE_BUFFER + uniform_out.binding = 1 # this needs to match the "binding" in our shader file + uniform_out.add_id(buffer_out) + # the last parameter (the 0) needs to match the "set" in our shader file + var uniform_set := rd.uniform_set_create([uniform_in, uniform_out], shader, 0) + + # Create a compute pipeline + var pipeline := rd.compute_pipeline_create(shader) + var compute_list := rd.compute_list_begin() + rd.compute_list_bind_compute_pipeline(compute_list, pipeline) + rd.compute_list_bind_uniform_set(compute_list, uniform_set, 0) + # each workgroup computes 64 vectors +# print("Dispatching workgroups: ", padded_num_vecs/64) + rd.compute_list_dispatch(compute_list, padded_num_vecs/64, 1, 1) + rd.compute_list_end() + # Submit to GPU and wait for sync + rd.submit() + rd.sync() + # Read back the data from the buffer + var result_bytes := rd.buffer_get_data(buffer_out) + var result := result_bytes.to_float32_array() + var retval = PackedVector3Array() + for i in transforms.size(): + retval.append(Vector3(result[i*4], result[i*4+1], result[i*4+2])) + + # Free the allocated objects. + # All resources must be freed after use to avoid memory leaks. + if rd != null: + rd.free_rid(pipeline) + rd.free_rid(uniform_set) + rd.free_rid(shader) + rd.free_rid(buffer_in) + rd.free_rid(buffer_out) + rd.free() + rd = null + return retval + +func get_shader_file() -> RDShaderFile: + if shader_file == null: + shader_file = load(get_script().resource_path.get_base_dir() + "/compute_shaders/compute_relax.glsl") + + return shader_file diff --git a/addons/proton_scatter/src/modifiers/relax.gd.uid b/addons/proton_scatter/src/modifiers/relax.gd.uid new file mode 100644 index 0000000..d2ccd81 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/relax.gd.uid @@ -0,0 +1 @@ +uid://dnelpti3wyfcb diff --git a/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd b/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd new file mode 100644 index 0000000..50f20b9 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd @@ -0,0 +1,44 @@ +@tool +extends "base_modifier.gd" + + +@export var negative_shapes_only := false + + +func _init() -> void: + display_name = "Remove Outside" + category = "Remove" + can_restrict_height = false + global_reference_frame_available = false + local_reference_frame_available = false + individual_instances_reference_frame_available = false + + documentation.add_paragraph( + "Remove all transforms falling outside a ScatterShape node, or inside + a shape set to 'Negative' mode.") + + var p := documentation.add_parameter("Negative Shapes Only") + p.set_type("bool") + p.set_description( + "Only remove transforms falling inside the negative shapes (shown + in red). Transforms outside any shapes will still remain.") + + +func _process_transforms(transforms, domain, seed) -> void: + var i := 0 + var point: Vector3 + var to_remove := false + + while i < transforms.size(): + point = transforms.list[i].origin + + if negative_shapes_only: + to_remove = domain.is_point_excluded(point) + else: + to_remove = not domain.is_point_inside(point) + + if to_remove: + transforms.list.remove_at(i) + continue + + i += 1 diff --git a/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd.uid b/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd.uid new file mode 100644 index 0000000..22bcd0e --- /dev/null +++ b/addons/proton_scatter/src/modifiers/remove_outside_shapes.gd.uid @@ -0,0 +1 @@ +uid://c54be4eus1dtq diff --git a/addons/proton_scatter/src/modifiers/single_item.gd b/addons/proton_scatter/src/modifiers/single_item.gd new file mode 100644 index 0000000..2db6d00 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/single_item.gd @@ -0,0 +1,55 @@ +@tool +extends "base_modifier.gd" + +# Adds a single object with the given transform + +@export var offset := Vector3.ZERO +@export var rotation := Vector3.ZERO +@export var scale := Vector3.ONE + + +func _init() -> void: + display_name = "Add Single Item" + category = "Create" + warning_ignore_no_shape = true + warning_ignore_no_transforms = true + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = false + use_local_space_by_default() + + +func _process_transforms(transforms, domain, _seed) -> void: + var gt: Transform3D = domain.get_global_transform() + var gt_inverse: Transform3D = gt.affine_inverse() + + var t_origin := offset + var basis := Basis() + var x_axis = Vector3.RIGHT + var y_axis = Vector3.UP + var z_axis = Vector3.FORWARD + + if is_using_global_space(): + t_origin = gt_inverse.basis * t_origin + x_axis = gt_inverse.basis * x_axis + y_axis = gt_inverse.basis * y_axis + z_axis = gt_inverse.basis * z_axis + basis = gt_inverse.basis + + basis = basis.rotated(x_axis, deg_to_rad(rotation.x)) + basis = basis.rotated(y_axis, deg_to_rad(rotation.y)) + basis = basis.rotated(z_axis, deg_to_rad(rotation.z)) + + var transform := Transform3D(basis, Vector3.ZERO) + + if is_using_global_space(): + var global_t: Transform3D = gt * transform + global_t.basis = global_t.basis.scaled(scale) + transform = gt_inverse * global_t + else: + transform = transform.scaled_local(scale) + + transform.origin = t_origin + + transforms.list.push_back(transform) diff --git a/addons/proton_scatter/src/modifiers/single_item.gd.uid b/addons/proton_scatter/src/modifiers/single_item.gd.uid new file mode 100644 index 0000000..58f85c4 --- /dev/null +++ b/addons/proton_scatter/src/modifiers/single_item.gd.uid @@ -0,0 +1 @@ +uid://kchunk85k0uj diff --git a/addons/proton_scatter/src/modifiers/snap_transforms.gd b/addons/proton_scatter/src/modifiers/snap_transforms.gd new file mode 100644 index 0000000..308a25b --- /dev/null +++ b/addons/proton_scatter/src/modifiers/snap_transforms.gd @@ -0,0 +1,100 @@ +@tool +extends "base_modifier.gd" + +# TODO: This modifier has the same shortcomings as offset_rotation, but in every reference frame. + + +@export var position_step := Vector3.ZERO +@export var rotation_step := Vector3.ZERO +@export var scale_step := Vector3.ZERO + + +func _init() -> void: + display_name = "Snap Transforms" + category = "Edit" + can_restrict_height = false + global_reference_frame_available = true + local_reference_frame_available = true + individual_instances_reference_frame_available = true + use_individual_instances_space_by_default() + + documentation.add_paragraph("Snap the individual transforms components.") + documentation.add_paragraph("Values of 0 do not affect the transforms.") + + var p := documentation.add_parameter("Position") + p.set_type("Vector3") + p.set_description("Defines the grid size used to snap the transform position.") + + p = documentation.add_parameter("Rotation") + p.set_type("Vector3") + p.set_description( + "When set to any value above 0, the rotation will be set to the nearest + multiple of that angle.") + p.add_warning( + "Example: If rotation is set to (0, 90.0, 0), the rotation around the Y + axis will be snapped to the closed value among [0, 90, 180, 360].") + + p = documentation.add_parameter("Scale") + p.set_type("Vector3") + p.set_description("Snap the current scale to the nearest multiple.") + + +func _process_transforms(transforms, domain, _seed) -> void: + var s_gt: Transform3D = domain.get_global_transform() + var s_lt: Transform3D = domain.get_local_transform() + var s_gt_inverse := s_gt.affine_inverse() + + var axis_x := Vector3.RIGHT + var axis_y := Vector3.UP + var axis_z := Vector3.FORWARD + + if is_using_global_space(): + axis_x = (s_gt_inverse.basis * Vector3.RIGHT).normalized() + axis_y = (s_gt_inverse.basis * Vector3.UP).normalized() + axis_z = (s_gt_inverse.basis * Vector3.FORWARD).normalized() + + var rotation_step_rad := Vector3.ZERO + rotation_step_rad.x = deg_to_rad(rotation_step.x) + rotation_step_rad.y = deg_to_rad(rotation_step.y) + rotation_step_rad.z = deg_to_rad(rotation_step.z) + + for i in transforms.size(): + var t: Transform3D = transforms.list[i] + var b := Basis() + var current_rotation: Vector3 + + if is_using_individual_instances_space(): + axis_x = t.basis.x.normalized() + axis_y = t.basis.y.normalized() + axis_z = t.basis.z.normalized() + + current_rotation = t.basis.get_euler() + t.origin = snapped(t.origin, position_step) + + elif is_using_local_space(): + var local_t := s_lt * t + current_rotation = local_t.basis.get_euler() + t.origin = snapped(t.origin, position_step) + + else: + b = (s_gt_inverse * Transform3D()).basis + var global_t := s_gt * t + current_rotation = global_t.basis.get_euler() + t.origin = s_gt_inverse * snapped(global_t.origin, position_step) + + b = b.rotated(axis_x, snapped(current_rotation.x, rotation_step_rad.x)) + b = b.rotated(axis_y, snapped(current_rotation.y, rotation_step_rad.y)) + b = b.rotated(axis_z, snapped(current_rotation.z, rotation_step_rad.z)) + + # Snap scale + var current_scale := t.basis.get_scale() + var snapped_scale: Vector3 = snapped(current_scale, scale_step) + t.basis = b + transforms.list[i] = t.scaled_local(snapped_scale) + + +func _clamp_vector(vec3, vmin, vmax) -> Vector3: + vec3.x = clamp(vec3.x, vmin.x, vmax.x) + vec3.y = clamp(vec3.y, vmin.y, vmax.y) + vec3.z = clamp(vec3.z, vmin.z, vmax.z) + return vec3 diff --git a/addons/proton_scatter/src/modifiers/snap_transforms.gd.uid b/addons/proton_scatter/src/modifiers/snap_transforms.gd.uid new file mode 100644 index 0000000..b0796bb --- /dev/null +++ b/addons/proton_scatter/src/modifiers/snap_transforms.gd.uid @@ -0,0 +1 @@ +uid://dmkidi0cmuioa diff --git a/addons/proton_scatter/src/particles/example_random_motion.gdshader b/addons/proton_scatter/src/particles/example_random_motion.gdshader new file mode 100644 index 0000000..a7771c5 --- /dev/null +++ b/addons/proton_scatter/src/particles/example_random_motion.gdshader @@ -0,0 +1,37 @@ +shader_type particles; + + +uniform mat4 global_transform; + + +float rand_from_seed(in uint seed) { + int k; + int s = int(seed); + if (s == 0) + s = 305420679; + k = s / 127773; + s = 16807 * (s - k * 127773) - 2836 * k; + if (s < 0) + s += 2147483647; + seed = uint(s); + return float(seed % uint(65536)) / 65535.0; +} + +uint hash(uint x) { + x = ((x >> uint(16)) ^ x) * uint(73244475); + x = ((x >> uint(16)) ^ x) * uint(73244475); + x = (x >> uint(16)) ^ x; + return x; +} + +void start() { + CUSTOM.x = 0.0; +} + +void process() { + uint seed = hash(uint(INDEX) + uint(1) + RANDOM_SEED); + float random = rand_from_seed(seed); + float offset = cos(TIME) * random * 0.05; + + TRANSFORM[3].y += offset; +} \ No newline at end of file diff --git a/addons/proton_scatter/src/particles/example_random_motion.gdshader.uid b/addons/proton_scatter/src/particles/example_random_motion.gdshader.uid new file mode 100644 index 0000000..dbfa456 --- /dev/null +++ b/addons/proton_scatter/src/particles/example_random_motion.gdshader.uid @@ -0,0 +1 @@ +uid://cfn6acmq3u5om diff --git a/addons/proton_scatter/src/particles/static.gdshader b/addons/proton_scatter/src/particles/static.gdshader new file mode 100644 index 0000000..357a145 --- /dev/null +++ b/addons/proton_scatter/src/particles/static.gdshader @@ -0,0 +1,15 @@ +shader_type particles; +render_mode keep_data; + + +uniform mat4 global_transform; + + +void start() { + +} + +void process() { + +} + diff --git a/addons/proton_scatter/src/particles/static.gdshader.uid b/addons/proton_scatter/src/particles/static.gdshader.uid new file mode 100644 index 0000000..592bf2d --- /dev/null +++ b/addons/proton_scatter/src/particles/static.gdshader.uid @@ -0,0 +1 @@ +uid://cnnxxhu8bsk8w diff --git a/addons/proton_scatter/src/presets/preset_entry.gd b/addons/proton_scatter/src/presets/preset_entry.gd new file mode 100644 index 0000000..c7ca30b --- /dev/null +++ b/addons/proton_scatter/src/presets/preset_entry.gd @@ -0,0 +1,28 @@ +@tool +extends MarginContainer + +signal load_full +signal load_stack_only +signal delete + + +func _ready() -> void: + $%LoadStackOnly.pressed.connect(func (): load_stack_only.emit()) + $%LoadFullPreset.pressed.connect(func (): load_full.emit()) + $%DeleteButton.pressed.connect(func (): delete.emit()) + + +func set_preset_name(preset_name: String) -> void: + preset_name = preset_name.trim_suffix(".tres") + $%Label.set_text(preset_name.capitalize()) + + +func show_save_controls() -> void: + $%SaveButtons.visible = true + $%LoadButtons.visible = false + + +func show_load_controls() -> void: + $%SaveButtons.visible = false + $%LoadButtons.visible = true + diff --git a/addons/proton_scatter/src/presets/preset_entry.gd.uid b/addons/proton_scatter/src/presets/preset_entry.gd.uid new file mode 100644 index 0000000..a66fab4 --- /dev/null +++ b/addons/proton_scatter/src/presets/preset_entry.gd.uid @@ -0,0 +1 @@ +uid://tn20ee2gwcn5 diff --git a/addons/proton_scatter/src/presets/preset_entry.tscn b/addons/proton_scatter/src/presets/preset_entry.tscn new file mode 100644 index 0000000..d267d64 --- /dev/null +++ b/addons/proton_scatter/src/presets/preset_entry.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=6 format=3 uid="uid://bosqtuvhckh3g"] + +[ext_resource type="Texture2D" uid="uid://ddjrq1h4mkn6a" path="res://addons/proton_scatter/icons/load.svg" id="1_0auay"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/presets/preset_entry.gd" id="1_bqha3"] +[ext_resource type="Texture2D" uid="uid://btb6rqhhi27mx" path="res://addons/proton_scatter/icons/remove.svg" id="2_p04k2"] + +[sub_resource type="SystemFont" id="SystemFont_kgkwq"] + +[sub_resource type="LabelSettings" id="LabelSettings_poli7"] +font = SubResource("SystemFont_kgkwq") + +[node name="PresetEntry" type="MarginContainer"] +custom_minimum_size = Vector2(450, 0) +anchors_preset = 14 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_top = -45.0 +offset_bottom = 45.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +script = ExtResource("1_bqha3") + +[node name="Panel" type="Panel" parent="."] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 12 +theme_override_constants/margin_top = 12 +theme_override_constants/margin_right = 12 +theme_override_constants/margin_bottom = 12 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Preset name" +label_settings = SubResource("LabelSettings_poli7") + +[node name="VSeparator" type="VSeparator" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="LoadButtons" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +alignment = 1 + +[node name="LoadStackOnly" type="Button" parent="MarginContainer/HBoxContainer/LoadButtons"] +unique_name_in_owner = true +layout_mode = 2 +text = "Load modifier stack" +icon = ExtResource("1_0auay") +alignment = 0 + +[node name="LoadFullPreset" type="Button" parent="MarginContainer/HBoxContainer/LoadButtons"] +unique_name_in_owner = true +layout_mode = 2 +text = "Load full preset" +icon = ExtResource("1_0auay") +alignment = 0 + +[node name="SaveButtons" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +size_flags_stretch_ratio = 2.0 +alignment = 1 + +[node name="OverrideButton" type="Button" parent="MarginContainer/HBoxContainer/SaveButtons"] +unique_name_in_owner = true +layout_mode = 2 +text = "Override preset" +icon = ExtResource("1_0auay") +alignment = 0 + +[node name="VSeparator2" type="VSeparator" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="DeleteButton" type="Button" parent="MarginContainer/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_colors/icon_normal_color = Color(0.917647, 0.0784314, 0, 1) +icon = ExtResource("2_p04k2") diff --git a/addons/proton_scatter/src/presets/presets.gd b/addons/proton_scatter/src/presets/presets.gd new file mode 100644 index 0000000..33d57d5 --- /dev/null +++ b/addons/proton_scatter/src/presets/presets.gd @@ -0,0 +1,198 @@ +@tool +extends Popup + + +const PRESETS_PATH = "res://addons/proton_scatter/presets" +const PresetEntry := preload("./preset_entry.tscn") +const ProtonScatterUtil := preload('../common/scatter_util.gd') +const ProtonScatterItem := preload('../scatter_item.gd') +const ProtonScatterShape := preload('../scatter_shape.gd') + +var _scatter_node +var _ideal_popup_size: Vector2i +var _editor_file_system: EditorFileSystem +var _preset_path_to_delete: String +var _preset_control_to_delete: Control + +@onready var _new_preset_button: Button = %NewPresetButton +@onready var _new_preset_dialog: ConfirmationDialog = %NewPresetDialog +@onready var _delete_preset_dialog: ConfirmationDialog = %DeleteDialog +@onready var _delete_warning_label: Label = %DeleteLabel +@onready var _presets_root: Control = %PresetsRoot + + +func _ready(): + _new_preset_button.pressed.connect(_show_preset_dialog) + _new_preset_dialog.confirmed.connect(_on_new_preset_name_confirmed) + _delete_preset_dialog.confirmed.connect(_on_delete_preset_confirmed) + _new_preset_dialog.hide() + _delete_preset_dialog.hide() + hide() + + +func save_preset(scatter_node: Node3D) -> void: + if not scatter_node: + return + + _populate() + _scatter_node = scatter_node + _new_preset_button.visible = true + + for c in _presets_root.get_children(): + c.show_save_controls() + + popup_centered(_ideal_popup_size) + + +func load_preset(scatter_node: Node3D) -> void: + if not scatter_node: + return + + _populate() + _scatter_node = scatter_node + _new_preset_button.visible = false + + for c in _presets_root.get_children(): + c.show_load_controls() + + popup_centered(_ideal_popup_size) + + +func load_default(scatter_node: Node3D) -> void: + _scatter_node = scatter_node + _on_load_full_preset(PRESETS_PATH.path_join("scatter_default.tscn")) + + +func set_editor_plugin(editor_plugin: EditorPlugin) -> void: + if not editor_plugin: + return + + _editor_file_system = editor_plugin.get_editor_interface().get_resource_filesystem() + + +func _clear(): + for c in _presets_root.get_children(): + c.queue_free() + + +func _populate() -> void: + _clear() + var dir = DirAccess.open(PRESETS_PATH) + if not dir: + print_debug("ProtonScatter error: Could not open folder ", PRESETS_PATH) + return + + dir.include_hidden = false + dir.include_navigational = false + dir.list_dir_begin() + + while true: + var file := dir.get_next() + if file == "": + break + + if dir.current_is_dir(): + continue + + if not file.ends_with(".tscn") and not file.ends_with(".scn"): + continue + + # Preset found, create an entry + var full_path = PRESETS_PATH.path_join(file) + var entry := PresetEntry.instantiate() + entry.set_preset_name(file.get_basename()) + entry.load_full.connect(_on_load_full_preset.bind(full_path)) + entry.load_stack_only.connect(_on_load_stack_only.bind(full_path)) + entry.delete.connect(_on_delete_button_pressed.bind(full_path, entry)) + + _presets_root.add_child(entry) + + dir.list_dir_end() + var full_height = _presets_root.get_child_count() * 120 + _ideal_popup_size = Vector2i(450, clamp(full_height, 120, 500)) + + +func _show_preset_dialog() -> void: + $%NewPresetName.set_text("") + _new_preset_dialog.popup_centered() + + +func _on_new_preset_name_confirmed() -> void: + var file_name: String = $%NewPresetName.text.to_lower().strip_edges() + ".tscn" + var full_path := PRESETS_PATH.path_join(file_name) + _on_save_preset(full_path) + hide() + + +func _on_save_preset(path) -> void: + var preset = _scatter_node.duplicate(7) + preset.clear_output() + ProtonScatterUtil.set_owner_recursive(preset, preset) + preset.global_transform.origin = Vector3.ZERO + + var packed_scene = PackedScene.new() + if packed_scene.pack(preset) != OK: + print_debug("ProtonScatter error: Failed to save preset") + return + + var err = ResourceSaver.save(packed_scene, path) + if err: + print_debug("ProtonScatter error: Failed to save preset. Code: ", err) + + +func _on_load_full_preset(path: String) -> void: + var preset_scene: PackedScene = load(path) + if not preset_scene: + print("Could not find preset ", path) + return + + var preset = preset_scene.instantiate() + + if preset: + _scatter_node.modifier_stack = preset.modifier_stack.get_copy() + preset.global_transform = _scatter_node.get_global_transform() + + for c in _scatter_node.get_children(): + if c is ProtonScatterItem or c is ProtonScatterShape: + _scatter_node.remove_child(c) + c.owner = null + c.queue_free() + + for c in preset.get_children(): + if c is Marker3D or c.name == "ScatterOutput": + continue + preset.remove_child(c) + c.owner = null + _scatter_node.add_child(c, true) + + ProtonScatterUtil.set_owner_recursive(_scatter_node, get_tree().get_edited_scene_root()) + preset.queue_free() + + _scatter_node.rebuild.call_deferred() + hide() + + +func _on_load_stack_only(path: String) -> void: + var preset = load(path).instantiate() + if preset: + _scatter_node.modifier_stack = preset.modifier_stack.get_copy() + _scatter_node.rebuild.call_deferred() + preset.queue_free() + + hide() + + +func _on_delete_button_pressed(path: String, entry: Control) -> void: + _preset_path_to_delete = path + _preset_control_to_delete = entry + _delete_warning_label.text = "Are you sure you want to delete the preset [" \ + + path.get_file().get_basename().capitalize() + "] ?\n\n" \ + + "This operation cannot be undone." + _delete_preset_dialog.popup_centered() + + +func _on_delete_preset_confirmed() -> void: + DirAccess.remove_absolute(_preset_path_to_delete) + _presets_root.remove_child(_preset_control_to_delete) + _preset_control_to_delete.queue_free() + _editor_file_system.scan() # Refresh the filesystem view diff --git a/addons/proton_scatter/src/presets/presets.gd.uid b/addons/proton_scatter/src/presets/presets.gd.uid new file mode 100644 index 0000000..affe83a --- /dev/null +++ b/addons/proton_scatter/src/presets/presets.gd.uid @@ -0,0 +1 @@ +uid://cs8epljfccp82 diff --git a/addons/proton_scatter/src/presets/presets.tscn b/addons/proton_scatter/src/presets/presets.tscn new file mode 100644 index 0000000..559fc3d --- /dev/null +++ b/addons/proton_scatter/src/presets/presets.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=4 format=3 uid="uid://bcsosdvstytoq"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/presets/presets.gd" id="1_ualle"] +[ext_resource type="Texture2D" uid="uid://cun73k8jdmr4e" path="res://addons/proton_scatter/icons/add.svg" id="2_j26xt"] +[ext_resource type="PackedScene" uid="uid://bosqtuvhckh3g" path="res://addons/proton_scatter/src/presets/preset_entry.tscn" id="2_orram"] + +[node name="Presets" type="PopupPanel"] +title = "Manage presets" +initial_position = 2 +size = Vector2i(490, 200) +unresizable = false +borderless = false +extend_to_title = true +min_size = Vector2i(400, 150) +script = ExtResource("1_ualle") + +[node name="MarginContainer" type="MarginContainer" parent="."] +offset_left = 4.0 +offset_top = 4.0 +offset_right = 486.0 +offset_bottom = 196.0 +theme_override_constants/margin_left = 12 +theme_override_constants/margin_top = 12 +theme_override_constants/margin_right = 12 +theme_override_constants/margin_bottom = 12 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="PresetsRoot" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="PresetEntry" parent="MarginContainer/VBoxContainer/ScrollContainer/PresetsRoot" instance=ExtResource("2_orram")] +layout_mode = 2 + +[node name="NewPresetButton" type="Button" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(200, 0) +layout_mode = 2 +size_flags_horizontal = 4 +text = "Create new preset" +icon = ExtResource("2_j26xt") + +[node name="NewPresetDialog" type="ConfirmationDialog" parent="."] +unique_name_in_owner = true +title = "Create new preset" + +[node name="MarginContainer" type="MarginContainer" parent="NewPresetDialog"] +offset_left = 8.0 +offset_top = 8.0 +offset_right = 192.0 +offset_bottom = 51.0 + +[node name="NewPresetName" type="LineEdit" parent="NewPresetDialog/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 4 +placeholder_text = "New preset name" + +[node name="DeleteDialog" type="ConfirmationDialog" parent="."] +unique_name_in_owner = true +title = "Delete preset" +size = Vector2i(250, 184) +ok_button_text = "Delete" +dialog_autowrap = true + +[node name="MarginContainer" type="MarginContainer" parent="DeleteDialog"] +offset_left = 8.0 +offset_top = 8.0 +offset_right = 242.0 +offset_bottom = 395.0 + +[node name="DeleteLabel" type="Label" parent="DeleteDialog/MarginContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(250, 0) +layout_mode = 2 +text = "Are you sure you want to delete preset [Preset]? + +This operation cannot be undone." +horizontal_alignment = 1 +autowrap_mode = 2 diff --git a/addons/proton_scatter/src/scatter.gd b/addons/proton_scatter/src/scatter.gd new file mode 100644 index 0000000..6d8c89d --- /dev/null +++ b/addons/proton_scatter/src/scatter.gd @@ -0,0 +1,734 @@ +@tool +extends Node3D + + +signal shape_changed +signal thread_completed +signal build_completed + + +# Includes +const ProtonScatterDomain := preload("./common/domain.gd") +const ProtonScatterItem := preload("./scatter_item.gd") +const ProtonScatterModifierStack := preload("./stack/modifier_stack.gd") +const ProtonScatterPhysicsHelper := preload("./common/physics_helper.gd") +const ProtonScatterShape := preload("./scatter_shape.gd") +const ProtonScatterTransformList := preload("./common/transform_list.gd") +const ProtonScatterUtil := preload('./common/scatter_util.gd') + + +@export_category("ProtonScatter") + +@export_group("General") +@export var enabled := true: + set(val): + enabled = val + if is_ready: + rebuild() +@export var global_seed := 0: + set(val): + global_seed = val + rebuild() +@export var show_output_in_tree := false: + set(val): + show_output_in_tree = val + if output_root: + ProtonScatterUtil.enforce_output_root_owner(self) + +@export_group("Performance") +@export_enum("Use Instancing:0", + "Create Copies:1", + "Use Particles:2")\ + var render_mode := 0: + set(val): + render_mode = val + notify_property_list_changed() + if is_ready: + full_rebuild.call_deferred() + +var use_chunks : bool = true: + set(val): + use_chunks = val + notify_property_list_changed() + if is_ready: + full_rebuild.call_deferred() + +var chunk_dimensions := Vector3.ONE * 15.0: + set(val): + chunk_dimensions.x = max(val.x, 1.0) + chunk_dimensions.y = max(val.y, 1.0) + chunk_dimensions.z = max(val.z, 1.0) + if is_ready: + rebuild.call_deferred() + +@export var keep_static_colliders := false +@export var force_rebuild_on_load := true +@export var enable_updates_in_game := false + +@export_group("Dependency") +@export var scatter_parent: NodePath: + set(val): + if not is_inside_tree(): + scatter_parent = val + return + + scatter_parent = NodePath() + if is_instance_valid(_dependency_parent): + _dependency_parent.build_completed.disconnect(rebuild) + _dependency_parent = null + + var node = get_node_or_null(val) + if not node: + return + + var type = node.get_script() + var scatter_type = get_script() + if type != scatter_type: + push_warning("ProtonScatter warning: Please select a ProtonScatter node as a parent dependency.") + return + + # TODO: Check for cyclic dependency + + scatter_parent = val + _dependency_parent = node + _dependency_parent.build_completed.connect(rebuild, CONNECT_DEFERRED) + + +@export_group("Debug", "dbg_") +@export var dbg_disable_thread := false + +var undo_redo # EditorUndoRedoManager - Can't type this, class not available outside the editor +var modifier_stack: ProtonScatterModifierStack: + set(val): + if modifier_stack: + if modifier_stack.value_changed.is_connected(rebuild): + modifier_stack.value_changed.disconnect(rebuild) + if modifier_stack.stack_changed.is_connected(rebuild): + modifier_stack.stack_changed.disconnect(rebuild) + if modifier_stack.transforms_ready.is_connected(_on_transforms_ready): + modifier_stack.transforms_ready.disconnect(_on_transforms_ready) + + modifier_stack = val.get_copy() # Enfore uniqueness + modifier_stack.value_changed.connect(rebuild, CONNECT_DEFERRED) + modifier_stack.stack_changed.connect(rebuild, CONNECT_DEFERRED) + modifier_stack.transforms_ready.connect(_on_transforms_ready, CONNECT_DEFERRED) + +var domain: ProtonScatterDomain: + set(_val): + domain = ProtonScatterDomain.new() # Enforce uniqueness + +var items: Array = [] +var total_item_proportion: int +var output_root: Marker3D +var transforms: ProtonScatterTransformList +var editor_plugin # Holds a reference to the EditorPlugin. Used by other parts. +var is_ready := false +var build_version := 0 + +# Internal variables +var _thread: Thread +var _rebuild_queued := false +var _dependency_parent +var _physics_helper: ProtonScatterPhysicsHelper +var _body_rid: RID +var _collision_shapes: Array[RID] +var _ignore_transform_notification = false + + +func _ready() -> void: + if Engine.is_editor_hint() or enable_updates_in_game: + set_notify_transform(true) + child_exiting_tree.connect(_on_child_exiting_tree) + + _perform_sanity_check() + _discover_items() + update_configuration_warnings.call_deferred() + is_ready = true + + if force_rebuild_on_load and not is_instance_valid(_dependency_parent): + full_rebuild.call_deferred() + + +func _exit_tree(): + if is_thread_running(): + modifier_stack.stop_update() + _thread.wait_to_finish() + _thread = null + + _clear_collision_data() + + +func _get_property_list() -> Array: + var list := [] + list.push_back({ + name = "modifier_stack", + type = TYPE_OBJECT, + hint_string = "ScatterModifierStack", + }) + + var chunk_usage := PROPERTY_USAGE_NO_EDITOR + var dimensions_usage := PROPERTY_USAGE_NO_EDITOR + if render_mode == 0 or render_mode == 2: + chunk_usage = PROPERTY_USAGE_DEFAULT + if use_chunks: + dimensions_usage = PROPERTY_USAGE_DEFAULT + + list.push_back({ + name = "Performance/use_chunks", + type = TYPE_BOOL, + usage = chunk_usage + }) + + list.push_back({ + name = "Performance/chunk_dimensions", + type = TYPE_VECTOR3, + usage = dimensions_usage + }) + return list + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings := PackedStringArray() + + if items.is_empty(): + warnings.push_back("At least one ScatterItem node is required.") + + if modifier_stack and not modifier_stack.does_not_require_shapes(): + if domain and domain.is_empty(): + warnings.push_back("At least one ScatterShape node is required.") + + return warnings + + +func _notification(what): + if not is_ready: + return + match what: + NOTIFICATION_TRANSFORM_CHANGED: + if _ignore_transform_notification: + _ignore_transform_notification = false + return + _perform_sanity_check() + domain.compute_bounds() + rebuild.call_deferred() + NOTIFICATION_ENTER_WORLD: + _ignore_transform_notification = true + + +func _set(property, value): + if not Engine.is_editor_hint(): + return false + + # Workaround to detect when the node was duplicated from the editor. + if property == "transform": + _on_node_duplicated.call_deferred() + + elif property == "Performance/use_chunks": + use_chunks = value + + elif property == "Performance/chunk_dimensions": + chunk_dimensions = value + + # Backward compatibility. + # Convert the value of previous property "use_instancing" into the proper render_mode. + elif property == "use_instancing": + render_mode = 0 if value else 1 + return true + + return false + + +func _get(property): + if property == "Performance/use_chunks": + return use_chunks + + elif property == "Performance/chunk_dimensions": + return chunk_dimensions + + +func is_thread_running() -> bool: + return _thread != null and _thread.is_started() + + +# Used by some modifiers to retrieve a physics helper node +func get_physics_helper() -> ProtonScatterPhysicsHelper: + return _physics_helper + + +# Deletes what the Scatter node generated. +func clear_output() -> void: + if not output_root: + output_root = get_node_or_null("ScatterOutput") + + if output_root: + remove_child(output_root) + output_root.queue_free() + output_root = null + + ProtonScatterUtil.ensure_output_root_exists(self) + _clear_collision_data() + + +func _clear_collision_data() -> void: + if _body_rid.is_valid(): + PhysicsServer3D.free_rid(_body_rid) + _body_rid = RID() + + for rid in _collision_shapes: + if rid.is_valid(): + PhysicsServer3D.free_rid(rid) + + _collision_shapes.clear() + + +# Wrapper around the _rebuild function. Clears previous output and force +# a clean rebuild. +func full_rebuild(): + update_gizmos() + + if not is_inside_tree(): + return + + _rebuild_queued = false + + if is_thread_running(): + await _thread.wait_to_finish() + _thread = null + + clear_output() + _rebuild(true) + + +# A wrapper around the _rebuild function. Ensure it's not called more than once +# per frame. (Happens when the Scatter node is moved, which triggers the +# TRANSFORM_CHANGED notification in every children, which in turn notify the +# parent Scatter node back about the changes). +func rebuild(force_discover := false) -> void: + update_gizmos() + + if not is_inside_tree() or not is_ready: + return + + if is_thread_running(): + _rebuild_queued = true + return + + force_discover = true # TMP while we fix the other issues + _rebuild(force_discover) + + +# Re compute the desired output. +# This is the main function, scattering the objects in the scene. +# Scattered objects are stored under a Marker3D node called "ScatterOutput" +# DON'T call this function directly outside of the 'rebuild()' function above. +func _rebuild(force_discover) -> void: + if not enabled: + _clear_collision_data() + clear_output() + build_completed.emit() + return + + _perform_sanity_check() + + if force_discover: + _discover_items() + domain.discover_shapes(self) + + if items.is_empty() or (domain.is_empty() and not modifier_stack.does_not_require_shapes()): + clear_output() + push_warning("ProtonScatter warning: No items or shapes, abort") + return + + if render_mode == 1: + clear_output() # TMP, prevents raycasts in modifier to self intersect with previous output + + if keep_static_colliders: + _clear_collision_data() + + if dbg_disable_thread: + modifier_stack.start_update(self, domain) + return + + if is_thread_running(): + await _thread.wait_to_finish() + + _thread = Thread.new() + _thread.start(_rebuild_threaded, Thread.PRIORITY_NORMAL) + + +func _rebuild_threaded() -> void: + # Disable thread safety, but only after 4.1 beta 3 + if _thread.has_method("set_thread_safety_checks_enabled"): + # Calls static method on instance, otherwise it crashes in 4.0.x + @warning_ignore("static_called_on_instance") + _thread.set_thread_safety_checks_enabled(false) + + modifier_stack.start_update(self, domain.get_copy()) + + +func _discover_items() -> void: + items.clear() + total_item_proportion = 0 + + for c in get_children(): + if is_instance_of(c, ProtonScatterItem): + items.push_back(c) + total_item_proportion += c.proportion + + update_configuration_warnings() + + +# Creates one MultimeshInstance3D for each ScatterItem node. +func _update_multimeshes() -> void: + if items.is_empty(): + _discover_items() + + var offset := 0 + var transforms_count: int = transforms.size() + + for item in items: + var count = int(round(float(item.proportion) / total_item_proportion * transforms_count)) + var mmi = ProtonScatterUtil.get_or_create_multimesh(item, count) + if not mmi: + continue + var static_body := ProtonScatterUtil.get_collision_data(item) + + var t: Transform3D + for i in count: + # Extra check because of how 'count' is calculated + if (offset + i) >= transforms_count: + mmi.multimesh.instance_count = i - 1 + continue + + t = item.process_transform(transforms.list[offset + i]) + mmi.multimesh.set_instance_transform(i, t) + _create_collision(static_body, t) + + static_body.queue_free() + offset += count + + +func _update_split_multimeshes() -> void: + var size = domain.bounds_local.size + + var splits := Vector3i.ONE + splits.x = max(1, ceil(size.x / chunk_dimensions.x)) + splits.y = max(1, ceil(size.y / chunk_dimensions.y)) + splits.z = max(1, ceil(size.z / chunk_dimensions.z)) + + if items.is_empty(): + _discover_items() + + var offset := 0 # this many transforms have been used up + var transforms_count: int = transforms.size() + clear_output() + + for item in items: + var root: Node3D = ProtonScatterUtil.get_or_create_item_root(item) + if not is_instance_valid(root): + continue + + # use count number of transforms for this item + var count = int(round(float(item.proportion) / total_item_proportion * transforms_count)) + + # create 3d array with dimensions of split_size to store the chunks' transforms + var transform_chunks : Array = [] + for xi in splits.x: + transform_chunks.append([]) + for yi in splits.y: + transform_chunks[xi].append([]) + for zi in splits.z: + transform_chunks[xi][yi].append([]) + + var t_list = transforms.list.slice(offset) + var aabb = ProtonScatterUtil.get_aabb_from_transforms(t_list) + aabb = aabb.grow(0.1) # avoid degenerate cases + var static_body := ProtonScatterUtil.get_collision_data(item) + + for i in count: + if (offset + i) >= transforms_count: + continue + # both aabb and t are in mmi's local coordinates + var t = item.process_transform(transforms.list[offset + i]) + var p_rel = (t.origin - aabb.position) / aabb.size + # Chunk index + var ci = (p_rel * Vector3(splits)).floor() + # Store the transform to the appropriate array + transform_chunks[ci.x][ci.y][ci.z].append(t) + _create_collision(static_body, t) + + static_body.queue_free() + + # Cache the mesh instance to be used for the chunks + var mesh_instance: MeshInstance3D = ProtonScatterUtil.get_merged_meshes_from(item) + # The relevant transforms are now ordered in chunks + for xi in splits.x: + for yi in splits.y: + for zi in splits.z: + var chunk_elements = transform_chunks[xi][yi][zi].size() + if chunk_elements == 0: + continue + var mmi = ProtonScatterUtil.get_or_create_multimesh_chunk( + item, + mesh_instance, + Vector3i(xi, yi, zi), + chunk_elements) + if not mmi: + continue + + # Use the eventual aabb as origin + # The multimeshinstance needs to be centered where the transforms are + # This matters because otherwise the visibility range fading is messed up + var center = ProtonScatterUtil.get_aabb_from_transforms(transform_chunks[xi][yi][zi]).get_center() + mmi.transform.origin = center + + var t: Transform3D + for i in chunk_elements: + t = transform_chunks[xi][yi][zi][i] + t.origin -= center + mmi.multimesh.set_instance_transform(i, t) + mesh_instance.queue_free() + offset += count + + +func _update_duplicates() -> void: + var offset := 0 + var transforms_count: int = transforms.size() + + for item in items: + var count := int(round(float(item.proportion) / total_item_proportion * transforms_count)) + var root: Node3D = ProtonScatterUtil.get_or_create_item_root(item) + var child_count := root.get_child_count() + + for i in count: + if (offset + i) >= transforms_count: + return + + var instance + if i < child_count: # Grab an instance from the pool if there's one available + instance = root.get_child(i) + else: + instance = _create_instance(item, root) + + if not instance: + break + + var t: Transform3D = item.process_transform(transforms.list[offset + i]) + instance.transform = t + ProtonScatterUtil.set_visibility_layers(instance, item.visibility_layers) + + # Delete the unused instances left in the pool if any + if count < child_count: + for i in (child_count - count): + root.get_child(-1).queue_free() + + offset += count + + +func _update_particles_system() -> void: + var offset := 0 + var transforms_count: int = transforms.size() + + for item in items: + var count := int(round(float(item.proportion) / total_item_proportion * transforms_count)) + var particles = ProtonScatterUtil.get_or_create_particles(item) + if not particles: + continue + + particles.visibility_aabb = AABB(domain.bounds_local.min, domain.bounds_local.size) + particles.amount = count + + var static_body := ProtonScatterUtil.get_collision_data(item) + var t: Transform3D + + for i in count: + if (offset + i) >= transforms_count: + particles.amount = i - 1 + return + + t = item.process_transform(transforms.list[offset + i]) + particles.emit_particle( + t, + Vector3.ZERO, + Color.WHITE, + Color.BLACK, + GPUParticles3D.EMIT_FLAG_POSITION | GPUParticles3D.EMIT_FLAG_ROTATION_SCALE) + _create_collision(static_body, t) + + offset += count + + +# Creates collision data with the Physics server directly. +# This does not create new nodes in the scene tree. This also means you can't +# see these colliders, even when enabling "Debug > Visible collision shapes". +func _create_collision(body: StaticBody3D, t: Transform3D) -> void: + if not keep_static_colliders or render_mode == 1: + return + + # Create a static body + if not _body_rid.is_valid(): + _body_rid = PhysicsServer3D.body_create() + PhysicsServer3D.body_set_mode(_body_rid, PhysicsServer3D.BODY_MODE_STATIC) + PhysicsServer3D.body_set_state(_body_rid, PhysicsServer3D.BODY_STATE_TRANSFORM, global_transform) + PhysicsServer3D.body_set_space(_body_rid, get_world_3d().space) + + for c in body.get_children(): + if c is CollisionShape3D: + var shape_rid: RID + var data: Variant + + if c.shape is SphereShape3D: + shape_rid = PhysicsServer3D.sphere_shape_create() + data = c.shape.radius + + elif c.shape is BoxShape3D: + shape_rid = PhysicsServer3D.box_shape_create() + data = c.shape.size / 2.0 + + elif c.shape is CapsuleShape3D: + shape_rid = PhysicsServer3D.capsule_shape_create() + data = { + "radius": c.shape.radius, + "height": c.shape.height, + } + + elif c.shape is CylinderShape3D: + shape_rid = PhysicsServer3D.cylinder_shape_create() + data = { + "radius": c.shape.radius, + "height": c.shape.height, + } + + elif c.shape is ConcavePolygonShape3D: + shape_rid = PhysicsServer3D.concave_polygon_shape_create() + data = { + "faces": c.shape.get_faces(), + "backface_collision": c.shape.backface_collision, + } + + elif c.shape is ConvexPolygonShape3D: + shape_rid = PhysicsServer3D.convex_polygon_shape_create() + data = c.shape.points + + elif c.shape is HeightMapShape3D: + shape_rid = PhysicsServer3D.heightmap_shape_create() + var min_height := 9999999.0 + var max_height := -9999999.0 + for v in c.shape.map_data: + min_height = v if v < min_height else min_height + max_height = v if v > max_height else max_height + data = { + "width": c.shape.map_width, + "depth": c.shape.map_depth, + "heights": c.shape.map_data, + "min_height": min_height, + "max_height": max_height, + } + + elif c.shape is SeparationRayShape3D: + shape_rid = PhysicsServer3D.separation_ray_shape_create() + data = { + "length": c.shape.length, + "slide_on_slope": c.shape.slide_on_slope, + } + + else: + print_debug("Scatter - Unsupported collision shape: ", c.shape) + continue + + PhysicsServer3D.shape_set_data(shape_rid, data) + PhysicsServer3D.body_add_shape(_body_rid, shape_rid, t * c.transform) + _collision_shapes.push_back(shape_rid) + + +func _create_instance(item: ProtonScatterItem, root: Node3D): + if not item: + return null + + var instance = item.get_item() + if not instance: + return null + + instance.visible = true + root.add_child.bind(instance, true).call_deferred() + + if show_output_in_tree: + # We have to use a lambda here because ProtonScatterUtil isn't an + # actual class_name, it's a const, which makes it impossible to reference + # the callable, (but we can still call it) + var defer_ownership := func(i, o): + ProtonScatterUtil.set_owner_recursive(i, o) + defer_ownership.bind(instance, get_tree().get_edited_scene_root()).call_deferred() + + return instance + + +# Enforce the Scatter node has its required variables set. +func _perform_sanity_check() -> void: + if not modifier_stack: + modifier_stack = ProtonScatterModifierStack.new() + modifier_stack.just_created = true + + if not domain: + domain = ProtonScatterDomain.new() + + domain.discover_shapes(self) + + if not is_instance_valid(_physics_helper): + _physics_helper = ProtonScatterPhysicsHelper.new() + _physics_helper.name = "PhysicsHelper" + add_child(_physics_helper, true, INTERNAL_MODE_BACK) + + # Retrigger the parent setter, in case the parent node no longer exists or changed type. + scatter_parent = scatter_parent + + +# Remove output coming from the source node to avoid linked multimeshes or +# other unwanted side effects +func _on_node_duplicated() -> void: + clear_output() + + +func _on_child_exiting_tree(node: Node) -> void: + if node is ProtonScatterShape or node is ProtonScatterItem: + rebuild.bind(true).call_deferred() + + +# Called when the modifier stack is done generating the full transform list +func _on_transforms_ready(new_transforms: ProtonScatterTransformList) -> void: + if is_thread_running(): + await _thread.wait_to_finish() + _thread = null + + _clear_collision_data() + + if _rebuild_queued: + _rebuild_queued = false + rebuild.call_deferred() + return + + transforms = new_transforms + + if not transforms or transforms.is_empty(): + clear_output() + update_gizmos() + return + + match render_mode: + 0: + if use_chunks: + _update_split_multimeshes() + else: + _update_multimeshes() + 1: + _update_duplicates() + 2: + _update_particles_system() + + update_gizmos() + build_version += 1 + + if is_inside_tree(): + await get_tree().process_frame + + build_completed.emit() diff --git a/addons/proton_scatter/src/scatter.gd.uid b/addons/proton_scatter/src/scatter.gd.uid new file mode 100644 index 0000000..fd3553d --- /dev/null +++ b/addons/proton_scatter/src/scatter.gd.uid @@ -0,0 +1 @@ +uid://mlpya7qid02x diff --git a/addons/proton_scatter/src/scatter_gizmo_plugin.gd b/addons/proton_scatter/src/scatter_gizmo_plugin.gd new file mode 100644 index 0000000..644d1a9 --- /dev/null +++ b/addons/proton_scatter/src/scatter_gizmo_plugin.gd @@ -0,0 +1,82 @@ +@tool +extends EditorNode3DGizmoPlugin + + +# Gizmo plugin for the ProtonScatter nodes. +# +# Displays a loading animation when the node is rebuilding its output +# Also displays the domain edges if one of its modifiers is using this data. + + +const ProtonScatter := preload("./scatter.gd") +const LoadingAnimation := preload("../icons/loading/m_loading.tres") + +var _loading_mesh: Mesh +var _editor_plugin: EditorPlugin + + +func _init(): + # TODO: Replace hardcoded colors by a setting fetch + create_custom_material("line", Color(0.2, 0.4, 0.8)) + add_material("loading", LoadingAnimation) + + _loading_mesh = QuadMesh.new() + _loading_mesh.set_size(Vector2.ONE * 0.15) + + +func _get_gizmo_name() -> String: + return "ProtonScatter" + + +func _has_gizmo(node) -> bool: + return node is ProtonScatter + + +func _redraw(gizmo: EditorNode3DGizmo): + gizmo.clear() + var node = gizmo.get_node_3d() + + if not node.modifier_stack: + return + + if node.is_thread_running(): + gizmo.add_mesh(_loading_mesh, get_material("loading")) + + if node.modifier_stack.is_using_edge_data() and _is_selected(node): + var curves: Array[Curve3D] = node.domain.get_edges() + + for curve in curves: + var lines := PackedVector3Array() + var points: PackedVector3Array = curve.tessellate(4, 8) + var lines_count := points.size() - 1 + + for i in lines_count: + lines.append(points[i]) + lines.append(points[i + 1]) + + gizmo.add_lines(lines, get_material("line")) + + +func set_editor_plugin(plugin: EditorPlugin) -> void: + _editor_plugin = plugin + + +# WORKAROUND +# Creates a standard material displayed on top of everything. +# Only exists because 'create_material() on_top' parameter doesn't seem to work. +func create_custom_material(name, color := Color.WHITE): + var material := StandardMaterial3D.new() + material.set_blend_mode(StandardMaterial3D.BLEND_MODE_ADD) + material.set_shading_mode(StandardMaterial3D.SHADING_MODE_UNSHADED) + material.set_flag(StandardMaterial3D.FLAG_DISABLE_DEPTH_TEST, true) + material.set_albedo(color) + material.render_priority = 100 + + add_material(name, material) + + +func _is_selected(node: Node) -> bool: + if ProjectSettings.get_setting(_editor_plugin.GIZMO_SETTING): + return true + + return node in _editor_plugin.get_custom_selection() diff --git a/addons/proton_scatter/src/scatter_gizmo_plugin.gd.uid b/addons/proton_scatter/src/scatter_gizmo_plugin.gd.uid new file mode 100644 index 0000000..1d95649 --- /dev/null +++ b/addons/proton_scatter/src/scatter_gizmo_plugin.gd.uid @@ -0,0 +1 @@ +uid://d1c6br3v0s0hi diff --git a/addons/proton_scatter/src/scatter_item.gd b/addons/proton_scatter/src/scatter_item.gd new file mode 100644 index 0000000..45851fc --- /dev/null +++ b/addons/proton_scatter/src/scatter_item.gd @@ -0,0 +1,171 @@ +@tool +extends Node3D + + +const ScatterUtil := preload('./common/scatter_util.gd') + + +@export_category("ScatterItem") +@export var proportion := 100: + set(val): + proportion = val + ScatterUtil.request_parent_to_rebuild(self) + +@export_enum("From current scene:0", "From disk:1") var source = 1: + set(val): + source = val + property_list_changed.emit() + +@export_group("Source options", "source_") +@export var source_scale_multiplier := 1.0: + set(val): + source_scale_multiplier = val + ScatterUtil.request_parent_to_rebuild(self) + +@export var source_ignore_position := true: + set(val): + source_ignore_position = val + ScatterUtil.request_parent_to_rebuild(self) + +@export var source_ignore_rotation := true: + set(val): + source_ignore_rotation = val + ScatterUtil.request_parent_to_rebuild(self) + +@export var source_ignore_scale := true: + set(val): + source_ignore_scale = val + ScatterUtil.request_parent_to_rebuild(self) + +@export_group("Override options", "override_") +@export var override_material: Material: + set(val): + override_material = val + ScatterUtil.request_parent_to_rebuild(self) + +@export var override_process_material: Material: + set(val): + override_process_material = val + ScatterUtil.request_parent_to_rebuild(self) # TODO - No need for a full rebuild here + +@export var override_cast_shadow: GeometryInstance3D.ShadowCastingSetting = GeometryInstance3D.SHADOW_CASTING_SETTING_ON: + set(val): + override_cast_shadow = val + ScatterUtil.request_parent_to_rebuild(self) # TODO - Only change the multimesh flag instead + +@export_group("Visibility", "visibility") +@export_flags_3d_render var visibility_layers: int = 1 +@export var visibility_range_begin : float = 0 +@export var visibility_range_begin_margin : float = 0 +@export var visibility_range_end : float = 0 +@export var visibility_range_end_margin : float = 0 +#TODO what is a nicer way to expose this? +@export_enum("Disabled:0", "Self:1") var visibility_range_fade_mode = 0 + +@export_group("Level Of Detail", "lod_") +@export var lod_generate := true: + set(val): + lod_generate = val + ScatterUtil.request_parent_to_rebuild(self) +@export_range(0.0, 180.0) var lod_merge_angle := 25.0: + set(val): + lod_merge_angle = val + ScatterUtil.request_parent_to_rebuild(self) +@export_range(0.0, 180.0) var lod_split_angle := 60.0: + set(val): + lod_split_angle = val + ScatterUtil.request_parent_to_rebuild(self) + +var path: String: + set(val): + path = val + source_data_ready = false + _target_scene = load(path) if source != 0 else null + ScatterUtil.request_parent_to_rebuild(self) + +var source_position: Vector3 +var source_rotation: Vector3 +var source_scale: Vector3 +var source_data_ready := false + +var _target_scene: PackedScene + + +func _get_property_list() -> Array: + var list := [] + + if source == 0: + list.push_back({ + name = "path", + type = TYPE_NODE_PATH, + }) + else: + list.push_back({ + name = "path", + type = TYPE_STRING, + hint = PROPERTY_HINT_FILE, + }) + + return list + + +func get_item() -> Node3D: + if path.is_empty(): + return null + + var node: Node3D + + if source == 0 and has_node(path): + node = get_node(path).duplicate() # Never expose the original node + elif source == 1: + node = _target_scene.instantiate() + + if node: + _save_source_data(node) + return node + + return null + + +# Takes a transform in input, scale it based on the local scale multiplier +# If the source transform is not ignored, also copy the source position, rotation and scale. +# Returns the processed transform +func process_transform(t: Transform3D) -> Transform3D: + if not source_data_ready: + _update_source_data() + + var origin = t.origin + t.origin = Vector3.ZERO + + t = t.scaled(Vector3.ONE * source_scale_multiplier) + + if not source_ignore_scale: + t = t.scaled(source_scale) + + if not source_ignore_rotation: + t = t.rotated(t.basis.x.normalized(), source_rotation.x) + t = t.rotated(t.basis.y.normalized(), source_rotation.y) + t = t.rotated(t.basis.z.normalized(), source_rotation.z) + + t.origin = origin + + if not source_ignore_position: + t.origin += source_position + + return t + + +func _save_source_data(node: Node3D) -> void: + if not node: + return + + source_position = node.position + source_rotation = node.rotation + source_scale = node.scale + source_data_ready = true + + +func _update_source_data() -> void: + var node = get_item() + if node: + node.queue_free() diff --git a/addons/proton_scatter/src/scatter_item.gd.uid b/addons/proton_scatter/src/scatter_item.gd.uid new file mode 100644 index 0000000..1e954c2 --- /dev/null +++ b/addons/proton_scatter/src/scatter_item.gd.uid @@ -0,0 +1 @@ +uid://dqqal1jno4xml diff --git a/addons/proton_scatter/src/scatter_shape.gd b/addons/proton_scatter/src/scatter_shape.gd new file mode 100644 index 0000000..5510c5a --- /dev/null +++ b/addons/proton_scatter/src/scatter_shape.gd @@ -0,0 +1,64 @@ +@tool +extends Node3D + + +const ScatterUtil := preload('./common/scatter_util.gd') + + +@export_category("ScatterShape") +@export var negative = false: + set(val): + negative = val + update_gizmos() + ScatterUtil.request_parent_to_rebuild(self) + +@export var shape: ProtonScatterBaseShape: + set(val): + # Disconnect the previous shape if any + if shape and shape.changed.is_connected(_on_shape_changed): + shape.changed.disconnect(_on_shape_changed) + + shape = val + if shape: + shape.changed.connect(_on_shape_changed) + + update_gizmos() + ScatterUtil.request_parent_to_rebuild(self) + +var _ignore_transform_notification = false + + +func _ready() -> void: + set_notify_transform(true) + + +func _notification(what): + match what: + NOTIFICATION_TRANSFORM_CHANGED: + if _ignore_transform_notification: + _ignore_transform_notification = false + return + ScatterUtil.request_parent_to_rebuild(self) + + NOTIFICATION_ENTER_WORLD: + _ignore_transform_notification = true + + +func _set(property, _value): + if not Engine.is_editor_hint(): + return false + + # Workaround to detect when the node was duplicated from the editor. + if property == "transform": + _on_node_duplicated.call_deferred() + + return false + + +func _on_shape_changed() -> void: + update_gizmos() + ScatterUtil.request_parent_to_rebuild(self) + + +func _on_node_duplicated() -> void: + shape = shape.get_copy() # Enfore uniqueness on duplicate, could be an option diff --git a/addons/proton_scatter/src/scatter_shape.gd.uid b/addons/proton_scatter/src/scatter_shape.gd.uid new file mode 100644 index 0000000..c183273 --- /dev/null +++ b/addons/proton_scatter/src/scatter_shape.gd.uid @@ -0,0 +1 @@ +uid://bsl3en0gdt8ka diff --git a/addons/proton_scatter/src/shapes/base_shape.gd b/addons/proton_scatter/src/shapes/base_shape.gd new file mode 100644 index 0000000..0682e6e --- /dev/null +++ b/addons/proton_scatter/src/shapes/base_shape.gd @@ -0,0 +1,36 @@ +@tool +class_name ProtonScatterBaseShape +extends Resource + + +func is_point_inside_global(_point_global: Vector3, _global_transform: Transform3D) -> bool: + return false + + +func is_point_inside_local(_point_local: Vector3) -> bool: + return false + + +# Returns an array of Vector3. This should contain enough points to compute +# a bounding box for the given shape. +func get_corners_global(_shape_global_transform: Transform3D) -> Array[Vector3]: + return [] + + +# Returns the closed contour of the shape (closed, inner and outer if +# applicable) as a 2D polygon, in local space relative to the scatter node. +func get_closed_edges(_shape_t: Transform3D) -> Array[PackedVector2Array]: + return [] + + +# Returns the open edges (in the case of a regular path, not closed) +# in local space relative to the scatter node. +func get_open_edges(_shape_t: Transform3D) -> Array[Curve3D]: + return [] + + +# Returns a copy of this shape. +# TODO: check later when Godot4 enters beta if we can get rid of this and use +# the built-in duplicate() method properly. +func get_copy() -> Resource: + return null diff --git a/addons/proton_scatter/src/shapes/base_shape.gd.uid b/addons/proton_scatter/src/shapes/base_shape.gd.uid new file mode 100644 index 0000000..a6c9443 --- /dev/null +++ b/addons/proton_scatter/src/shapes/base_shape.gd.uid @@ -0,0 +1 @@ +uid://cuxf53j3m7ju diff --git a/addons/proton_scatter/src/shapes/box_shape.gd b/addons/proton_scatter/src/shapes/box_shape.gd new file mode 100644 index 0000000..d1cc531 --- /dev/null +++ b/addons/proton_scatter/src/shapes/box_shape.gd @@ -0,0 +1,95 @@ +@tool +class_name ProtonScatterBoxShape +extends ProtonScatterBaseShape + + +@export var size := Vector3.ONE: + set(val): + size = val + _half_size = size * 0.5 + emit_changed() + +var _half_size := Vector3.ONE + + +func get_copy(): + var copy = get_script().new() + copy.size = size + return copy + + +func is_point_inside(point: Vector3, global_transform: Transform3D) -> bool: + var local_point = global_transform.affine_inverse() * point + return AABB(-_half_size, size).has_point(local_point) + + +func get_corners_global(gt: Transform3D) -> Array: + var res := [] + var corners := [ + Vector3(-1, -1, -1), + Vector3(-1, -1, 1), + Vector3(1, -1, 1), + Vector3(1, -1, -1), + Vector3(-1, 1, -1), + Vector3(-1, 1, 1), + Vector3(1, 1, 1), + Vector3(1, 1, -1), + ] + + for c in corners: + c *= size * 0.5 + res.push_back(gt * c) + + return res + + +# Intersection between and box and a plane results in a polygon between 3 and 6 +# vertices. +# Compute the intersection of each of the 12 edges to the plane, then recompute +# the polygon from the positions found. +func get_closed_edges(shape_t: Transform3D) -> Array[PackedVector2Array]: + var polygon := PackedVector2Array() + + var plane := Plane(Vector3.UP, 0.0) + + var box_edges := [ + # Bottom square + [Vector3(-1, -1, -1), Vector3(-1, -1, 1)], + [Vector3(-1, -1, 1), Vector3(1, -1, 1)], + [Vector3(1, -1, 1), Vector3(1, -1, -1)], + [Vector3(1, -1, -1), Vector3(-1, -1, -1)], + + # Top square + [Vector3(-1, 1, -1), Vector3(-1, 1, 1)], + [Vector3(-1, 1, 1), Vector3(1, 1, 1)], + [Vector3(1, 1, 1), Vector3(1, 1, -1)], + [Vector3(1, 1, -1), Vector3(-1, 1, -1)], + + # Vertical lines + [Vector3(-1, -1, -1), Vector3(-1, 1, -1)], + [Vector3(-1, -1, 1), Vector3(-1, 1, 1)], + [Vector3(1, -1, 1), Vector3(1, 1, 1)], + [Vector3(1, -1, -1), Vector3(1, 1, -1)], + ] + + var intersection_points := PackedVector3Array() + var point + var shape_t_inverse := shape_t.affine_inverse() + + for edge in box_edges: + var p1 = (edge[0] * _half_size) * shape_t_inverse + var p2 = (edge[1] * _half_size) * shape_t_inverse + point = plane.intersects_segment(p1, p2) + if point: + intersection_points.push_back(point) + + if intersection_points.size() < 3: + return [] + + var points_unordered := PackedVector2Array() + for p in intersection_points: + points_unordered.push_back(Vector2(p.x, p.z)) + + polygon = Geometry2D.convex_hull(points_unordered) + + return [polygon] diff --git a/addons/proton_scatter/src/shapes/box_shape.gd.uid b/addons/proton_scatter/src/shapes/box_shape.gd.uid new file mode 100644 index 0000000..079bf45 --- /dev/null +++ b/addons/proton_scatter/src/shapes/box_shape.gd.uid @@ -0,0 +1 @@ +uid://d011g8ga6gea7 diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd new file mode 100644 index 0000000..504894f --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd @@ -0,0 +1,135 @@ +@tool +extends "gizmo_handler.gd" + +# 3D Gizmo for the Box shape. + + +func get_handle_name(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> String: + return "Box Size" + + +func get_handle_value(gizmo: EditorNode3DGizmo, handle_id: int, _secondary: bool) -> Variant: + return gizmo.get_node_3d().shape.size + + +func set_handle(gizmo: EditorNode3DGizmo, handle_id: int, _secondary: bool, camera: Camera3D, screen_pos: Vector2) -> void: + if handle_id < 0 or handle_id > 2: + return + + var axis := Vector3.ZERO + axis[handle_id] = 1.0 # handle 0:x, 1:y, 2:z + + var shape_node = gizmo.get_node_3d() + var gt := shape_node.get_global_transform() + var gt_inverse := gt.affine_inverse() + + var origin := gt.origin + var drag_axis := (axis * 4096) * gt_inverse + var ray_from = camera.project_ray_origin(screen_pos) + var ray_to = ray_from + camera.project_ray_normal(screen_pos) * 4096 + + var points = Geometry3D.get_closest_points_between_segments(origin, drag_axis, ray_from, ray_to) + + var size = shape_node.shape.size + size -= axis * size + var dist = origin.distance_to(points[0]) * 2.0 + size += axis * dist + + shape_node.shape.size = size + + +func commit_handle(gizmo: EditorNode3DGizmo, handle_id: int, _secondary: bool, restore: Variant, cancel: bool) -> void: + var shape: ProtonScatterBoxShape = gizmo.get_node_3d().shape + if cancel: + shape.size = restore + return + + _undo_redo.create_action("Set ScatterShape size") + _undo_redo.add_undo_method(self, "_set_size", shape, restore) + _undo_redo.add_do_method(self, "_set_size", shape, shape.size) + _undo_redo.commit_action() + + +func redraw(plugin: EditorNode3DGizmoPlugin, gizmo: EditorNode3DGizmo): + gizmo.clear() + var scatter_shape = gizmo.get_node_3d() + var shape: ProtonScatterBoxShape = scatter_shape.shape + + ### Draw the Box lines + var lines = PackedVector3Array() + var lines_material := plugin.get_material("primary_top", gizmo) + var half_size = shape.size * 0.5 + + var corners := [ + [ # Bottom square + Vector3(-1, -1, -1), + Vector3(-1, -1, 1), + Vector3(1, -1, 1), + Vector3(1, -1, -1), + Vector3(-1, -1, -1), + ], + [ # Top square + Vector3(-1, 1, -1), + Vector3(-1, 1, 1), + Vector3(1, 1, 1), + Vector3(1, 1, -1), + Vector3(-1, 1, -1), + ], + [ # Vertical lines + Vector3(-1, -1, -1), + Vector3(-1, 1, -1), + ], + [ + Vector3(-1, -1, 1), + Vector3(-1, 1, 1), + ], + [ + Vector3(1, -1, 1), + Vector3(1, 1, 1), + ], + [ + Vector3(1, -1, -1), + Vector3(1, 1, -1), + ] + ] + + var block_count = corners.size() + if not is_selected(gizmo): + block_count = 1 + + for i in block_count: + var block = corners[i] + for j in block.size() - 1: + lines.push_back(block[j] * half_size) + lines.push_back(block[j + 1] * half_size) + + gizmo.add_lines(lines, lines_material) + gizmo.add_collision_segments(lines) + + ### Fills the box inside + var mesh = BoxMesh.new() + mesh.size = shape.size + + var mesh_material: StandardMaterial3D + if scatter_shape.negative: + mesh_material = plugin.get_material("exclusive", gizmo) + else: + mesh_material = plugin.get_material("inclusive", gizmo) + + gizmo.add_mesh(mesh, mesh_material) + + ### Draw the handles, one for each axis + var handles := PackedVector3Array() + var handles_ids := PackedInt32Array() + var handles_material := plugin.get_material("default_handle", gizmo) + + handles.push_back(Vector3.RIGHT * shape.size.x * 0.5) + handles.push_back(Vector3.UP * shape.size.y * 0.5) + handles.push_back(Vector3.BACK * shape.size.z * 0.5) + + gizmo.add_handles(handles, handles_material, handles_ids) + + +func _set_size(box: ProtonScatterBoxShape, size: Vector3) -> void: + if box: + box.size = size diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd.uid new file mode 100644 index 0000000..8a7913a --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/box_gizmo.gd.uid @@ -0,0 +1 @@ +uid://cb8hui4dny2fo diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/components/curve_mode_button_group.tres b/addons/proton_scatter/src/shapes/gizmos_plugin/components/curve_mode_button_group.tres new file mode 100644 index 0000000..f8a67d2 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/components/curve_mode_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=3 uid="uid://1xy55037k3k5"] + +[resource] diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_advanced_options_panel.tscn b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_advanced_options_panel.tscn new file mode 100644 index 0000000..c5a44f0 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_advanced_options_panel.tscn @@ -0,0 +1,55 @@ +[gd_scene format=3 uid="uid://qb8j7oasuqbc"] + +[node name="AdvancedOptionsPanel" type="MarginContainer"] +offset_right = 221.0 +offset_bottom = 136.0 +grow_horizontal = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +metadata/_edit_use_custom_anchors = true + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +offset_right = 221.0 +offset_bottom = 136.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +offset_right = 217.0 +offset_bottom = 136.0 + +[node name="MirrorLength" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +offset_right = 217.0 +offset_bottom = 31.0 +focus_mode = 0 +text = "Mirror handles length" + +[node name="MirrorAngle" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +offset_top = 35.0 +offset_right = 217.0 +offset_bottom = 66.0 +focus_mode = 0 +text = "Mirror handles angle" + +[node name="LockToPlane" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +offset_top = 70.0 +offset_right = 217.0 +offset_bottom = 101.0 +focus_mode = 0 +text = "Lock to plane" + +[node name="MirrorAngle3" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +offset_top = 105.0 +offset_right = 217.0 +offset_bottom = 136.0 +focus_mode = 0 +text = "Snap to colliders" + +[node name="VSeparator" type="VSeparator" parent="HBoxContainer"] +visible = false +offset_left = 221.0 +offset_right = 225.0 +offset_bottom = 136.0 + +[node name="VBoxContainer2" type="VBoxContainer" parent="HBoxContainer"] +offset_left = 221.0 +offset_right = 221.0 +offset_bottom = 136.0 diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd new file mode 100644 index 0000000..9d0b735 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd @@ -0,0 +1,96 @@ +@tool +extends Control + + +const ScatterShape = preload("../../../scatter_shape.gd") +const PathShape = preload("../../path_shape.gd") + +var shape_node: ScatterShape + +@onready var _options_button: Button = $%Options +@onready var _options_panel: Popup = $%OptionsPanel + + +func _ready() -> void: + _options_button.toggled.connect(_on_options_button_toggled) + _options_panel.popup_hide.connect(_on_options_panel_hide) + $%SnapToColliders.toggled.connect(_on_snap_to_colliders_toggled) + $%ClosedPath.toggled.connect(_on_closed_path_toggled) + $%MirrorAngle.toggled.connect(_on_mirror_angle_toggled) + + for button in [$%LockToPlane, $%SnapToColliders, $%ClosedPath]: + button.pressed.connect(_on_button_pressed) + + +# Called by the editor plugin when the node selection changes. +# Hides the panel when the selected node is not a path shape. +func selection_changed(selected: Array) -> void: + if selected.is_empty(): + visible = false + shape_node = null + return + + var node = selected[0] + visible = node is ScatterShape and node.shape is PathShape + if visible: + shape_node = node + $%ClosedPath.button_pressed = node.shape.closed + + +func is_select_mode_enabled() -> bool: + return $%Select.button_pressed + + +func is_create_mode_enabled() -> bool: + return $%Create.button_pressed + + +func is_delete_mode_enabled() -> bool: + return $%Delete.button_pressed + + +func is_lock_to_plane_enabled() -> bool: + return $%LockToPlane.button_pressed and not is_snap_to_colliders_enabled() + + +func is_snap_to_colliders_enabled() -> bool: + return $%SnapToColliders.button_pressed + + +func is_mirror_length_enabled() -> bool: + return $%MirrorLength.button_pressed + + +func is_mirror_angle_enabled() -> bool: + return $%MirrorAngle.button_pressed + + +func _on_options_button_toggled(enabled: bool) -> void: + if enabled: + var popup_position := Vector2i(get_global_transform().origin) + popup_position.y += size.y + 12 + _options_panel.popup(Rect2i(popup_position, Vector2i.ZERO)) + else: + _options_panel.hide() + + +func _on_options_panel_hide() -> void: + _options_button.button_pressed = false + + +func _on_mirror_angle_toggled(enabled: bool) -> void: + $%MirrorLength.disabled = not enabled + + +func _on_snap_to_colliders_toggled(enabled: bool) -> void: + $%LockToPlane.disabled = enabled + + +func _on_closed_path_toggled(enabled: bool) -> void: + if shape_node and shape_node.shape is PathShape: + shape_node.shape.closed = enabled + + +func _on_button_pressed() -> void: + if shape_node: + shape_node.update_gizmos() diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd.uid new file mode 100644 index 0000000..e57eec8 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd.uid @@ -0,0 +1 @@ +uid://b47j1875lf52f diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.tscn b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.tscn new file mode 100644 index 0000000..98f4cc8 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.tscn @@ -0,0 +1,124 @@ +[gd_scene load_steps=7 format=3 uid="uid://vijpujrvtyin"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/gizmos_plugin/components/path_panel.gd" id="1_o7kkg"] +[ext_resource type="Texture2D" uid="uid://c1t5x34pc4vs5" path="res://addons/proton_scatter/icons/curve_select.svg" id="2_d7o1n"] +[ext_resource type="ButtonGroup" uid="uid://1xy55037k3k5" path="res://addons/proton_scatter/src/shapes/gizmos_plugin/components/curve_mode_button_group.tres" id="2_sl6yo"] +[ext_resource type="Texture2D" uid="uid://cmykha5ja17vj" path="res://addons/proton_scatter/icons/curve_create.svg" id="3_l70sn"] +[ext_resource type="Texture2D" uid="uid://cligdljx1ad5e" path="res://addons/proton_scatter/icons/curve_delete.svg" id="4_b5yum"] +[ext_resource type="Texture2D" uid="uid://n66mufjib4ds" path="res://addons/proton_scatter/icons/menu.svg" id="6_xiaj2"] + +[node name="PathPanel" type="MarginContainer"] +offset_right = 108.0 +offset_bottom = 24.0 +size_flags_horizontal = 0 +size_flags_vertical = 4 +script = ExtResource("1_o7kkg") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="Select" type="Button" parent="HBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +toggle_mode = true +button_pressed = true +button_group = ExtResource("2_sl6yo") +icon = ExtResource("2_d7o1n") +flat = true +icon_alignment = 1 + +[node name="Create" type="Button" parent="HBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +toggle_mode = true +button_group = ExtResource("2_sl6yo") +icon = ExtResource("3_l70sn") +flat = true +icon_alignment = 1 + +[node name="Delete" type="Button" parent="HBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +toggle_mode = true +button_group = ExtResource("2_sl6yo") +icon = ExtResource("4_b5yum") +flat = true +icon_alignment = 1 + +[node name="Options" type="Button" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +toggle_mode = true +action_mode = 0 +icon = ExtResource("6_xiaj2") +flat = true +icon_alignment = 1 + +[node name="OptionsPanel" type="PopupPanel" parent="."] +unique_name_in_owner = true +size = Vector2i(229, 179) + +[node name="AdvancedOptionsPanel" type="MarginContainer" parent="OptionsPanel"] +offset_left = 4.0 +offset_top = 4.0 +offset_right = 225.0 +offset_bottom = 175.0 +grow_horizontal = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +metadata/_edit_use_custom_anchors = true + +[node name="HBoxContainer" type="HBoxContainer" parent="OptionsPanel/AdvancedOptionsPanel"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer"] +layout_mode = 2 + +[node name="MirrorAngle" type="CheckButton" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +button_pressed = true +text = "Mirror handles angle" + +[node name="MirrorLength" type="CheckButton" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +button_pressed = true +text = "Mirror handles length" + +[node name="ClosedPath" type="CheckButton" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Closed path" + +[node name="LockToPlane" type="CheckButton" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +button_pressed = true +text = "Lock to plane" + +[node name="SnapToColliders" type="CheckButton" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Snap to colliders" + +[node name="VSeparator" type="VSeparator" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer"] +visible = false +layout_mode = 2 + +[node name="VBoxContainer2" type="VBoxContainer" parent="OptionsPanel/AdvancedOptionsPanel/HBoxContainer"] +layout_mode = 2 diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd new file mode 100644 index 0000000..26e0baf --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd @@ -0,0 +1,50 @@ +@tool +extends RefCounted + +# Abstract class. + + +var _undo_redo: EditorUndoRedoManager +var _plugin: EditorPlugin + + +func set_undo_redo(ur: EditorUndoRedoManager) -> void: + _undo_redo = ur + + +func set_editor_plugin(plugin: EditorPlugin) -> void: + _plugin = plugin + + +func get_handle_name(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> String: + return "" + + +func get_handle_value(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> Variant: + return null + + +func set_handle(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool, _camera: Camera3D, _screen_pos: Vector2) -> void: + pass + + +func commit_handle(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool, _restore: Variant, _cancel: bool) -> void: + pass + + +func redraw(_gizmo_plugin: EditorNode3DGizmoPlugin, _gizmo: EditorNode3DGizmo): + pass + + +func forward_3d_gui_input(_viewport_camera: Camera3D, _event: InputEvent) -> bool: + return false + + +func is_selected(gizmo: EditorNode3DGizmo) -> bool: + if not _plugin: + return true + + var current_node = gizmo.get_node_3d() + var selected_nodes := _plugin.get_editor_interface().get_selection().get_selected_nodes() + + return current_node in selected_nodes diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd.uid new file mode 100644 index 0000000..72dcdd9 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/gizmo_handler.gd.uid @@ -0,0 +1 @@ +uid://rig0u4pmg6uw diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg new file mode 100644 index 0000000..d4bd434 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg.import b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg.import new file mode 100644 index 0000000..b3b6d08 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmjp2vpqp4qjy" +path.s3tc="res://.godot/imported/main_handle.svg-e76638c615070e68035d2b711214a1fc.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/src/shapes/gizmos_plugin/icons/main_handle.svg" +dest_files=["res://.godot/imported/main_handle.svg-e76638c615070e68035d2b711214a1fc.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg new file mode 100644 index 0000000..1bdf32d --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg @@ -0,0 +1 @@ + diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg.import b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg.import new file mode 100644 index 0000000..32e8583 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kygbxbbnqkdh" +path.s3tc="res://.godot/imported/secondary_handle.svg-d46e6e295afbc9a7509025fe11144dfd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/proton_scatter/src/shapes/gizmos_plugin/icons/secondary_handle.svg" +dest_files=["res://.godot/imported/secondary_handle.svg-d46e6e295afbc9a7509025fe11144dfd.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd new file mode 100644 index 0000000..823311a --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd @@ -0,0 +1,356 @@ +@tool +extends "gizmo_handler.gd" + + +const ProtonScatter := preload("res://addons/proton_scatter/src/scatter.gd") +const ProtonScatterShape := preload("res://addons/proton_scatter/src/scatter_shape.gd") +const ProtonScatterEventHelper := preload("res://addons/proton_scatter/src/common/event_helper.gd") +const PathPanel := preload("./components/path_panel.gd") + +var _gizmo_panel: PathPanel +var _event_helper: ProtonScatterEventHelper + + +func get_handle_name(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> String: + return "Path point" + + +func get_handle_value(gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> Variant: + var shape: ProtonScatterPathShape = gizmo.get_node_3d().shape + return shape.get_copy() + + +func set_handle(gizmo: EditorNode3DGizmo, handle_id: int, secondary: bool, camera: Camera3D, screen_pos: Vector2) -> void: + if not _gizmo_panel.is_select_mode_enabled(): + return + + var shape_node: ProtonScatterShape = gizmo.get_node_3d() + var curve: Curve3D = shape_node.shape.curve + var point_count: int = curve.get_point_count() + var curve_index := handle_id + var previous_handle_position: Vector3 + + if not secondary: + previous_handle_position = curve.get_point_position(curve_index) + else: + curve_index = int(handle_id / 2) + previous_handle_position = curve.get_point_position(curve_index) + if handle_id % 2 == 0: + previous_handle_position += curve.get_point_in(curve_index) + else: + previous_handle_position += curve.get_point_out(curve_index) + + var click_world_position := _intersect_with(shape_node, camera, screen_pos, previous_handle_position) + var point_local_position: Vector3 = shape_node.get_global_transform().affine_inverse() * click_world_position + + if not secondary: + # Main curve point moved + curve.set_point_position(handle_id, point_local_position) + else: + # In out handle moved + var mirror_angle := _gizmo_panel.is_mirror_angle_enabled() + var mirror_length := _gizmo_panel.is_mirror_length_enabled() + + var point_origin = curve.get_point_position(curve_index) + var in_out_position = point_local_position - point_origin + var mirror_position = -in_out_position + + if handle_id % 2 == 0: + curve.set_point_in(curve_index, in_out_position) + if mirror_angle: + if not mirror_length: + mirror_position = curve.get_point_out(curve_index).length() * -in_out_position.normalized() + curve.set_point_out(curve_index, mirror_position) + else: + curve.set_point_out(curve_index, in_out_position) + if mirror_angle: + if not mirror_length: + mirror_position = curve.get_point_in(curve_index).length() * -in_out_position.normalized() + curve.set_point_in(curve_index, mirror_position) + + shape_node.update_gizmos() + + +func commit_handle(gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool, restore: Variant, cancel: bool) -> void: + var shape_node: ProtonScatterShape = gizmo.get_node_3d() + + if cancel: + _edit_path(shape_node, restore) + else: + _undo_redo.create_action("Edit ScatterShape Path") + _undo_redo.add_undo_method(self, "_edit_path", shape_node, restore) + _undo_redo.add_do_method(self, "_edit_path", shape_node, shape_node.shape.get_copy()) + _undo_redo.commit_action() + + shape_node.update_gizmos() + + +func redraw(plugin: EditorNode3DGizmoPlugin, gizmo: EditorNode3DGizmo): + gizmo.clear() + + # Force the path panel to appear when the scatter shape type is changed + # from the inspector. + if is_selected(gizmo): + _gizmo_panel.selection_changed([gizmo.get_node_3d()]) + + var shape_node: ProtonScatterShape = gizmo.get_node_3d() + var shape: ProtonScatterPathShape = shape_node.shape + + if not shape: + return + + var curve: Curve3D = shape.curve + if not curve or curve.get_point_count() == 0: + return + + # ------ Common stuff ------ + var points := curve.tessellate(4, 8) + var points_2d := PackedVector2Array() + for p in points: + points_2d.push_back(Vector2(p.x, p.z)) + + var line_material: StandardMaterial3D = plugin.get_material("primary_top", gizmo) + var mesh_material: StandardMaterial3D = plugin.get_material("inclusive", gizmo) + if shape_node.negative: + mesh_material = plugin.get_material("exclusive", gizmo) + + # ------ Main line along the path curve ------ + var lines := PackedVector3Array() + var lines_count := points.size() - 1 + + for i in lines_count: + lines.append(points[i]) + lines.append(points[i + 1]) + + gizmo.add_lines(lines, line_material) + gizmo.add_collision_segments(lines) + + # ------ Draw handles ------ + var main_handles := PackedVector3Array() + var in_out_handles := PackedVector3Array() + var handle_lines := PackedVector3Array() + var ids := PackedInt32Array() # Stays empty on purpose + + for i in curve.get_point_count(): + var point_pos = curve.get_point_position(i) + var point_in = curve.get_point_in(i) + point_pos + var point_out = curve.get_point_out(i) + point_pos + + handle_lines.push_back(point_pos) + handle_lines.push_back(point_in) + handle_lines.push_back(point_pos) + handle_lines.push_back(point_out) + + in_out_handles.push_back(point_in) + in_out_handles.push_back(point_out) + main_handles.push_back(point_pos) + + gizmo.add_handles(main_handles, plugin.get_material("primary_handle", gizmo), ids) + gizmo.add_handles(in_out_handles, plugin.get_material("secondary_handle", gizmo), ids, false, true) + + if is_selected(gizmo): + gizmo.add_lines(handle_lines, plugin.get_material("secondary_top", gizmo)) + + # -------- Visual when lock to plane is enabled -------- + if _gizmo_panel.is_lock_to_plane_enabled() and is_selected(gizmo): + var bounds = shape.get_bounds() + var aabb = AABB(bounds.min, bounds.size).grow(shape.thickness / 2.0) + + var width: float = aabb.size.x + var length: float = aabb.size.z + var plane_center: Vector3 = bounds.center + plane_center.y = 0.0 + + var plane_mesh := PlaneMesh.new() + plane_mesh.set_size(Vector2(width, length)) + plane_mesh.set_center_offset(plane_center) + + gizmo.add_mesh(plane_mesh, plugin.get_material("tertiary", gizmo)) + + var plane_lines := PackedVector3Array() + var corners = [ + Vector3(-width, 0, -length), + Vector3(-width, 0, length), + Vector3(width, 0, length), + Vector3(width, 0, -length), + Vector3(-width, 0, -length), + ] + for i in corners.size() - 1: + plane_lines.push_back(corners[i] * 0.5 + plane_center) + plane_lines.push_back(corners[i + 1] * 0.5 + plane_center) + + gizmo.add_lines(plane_lines, plugin.get_material("secondary_top", gizmo)) + + # ----- Mesh representing the inside part of the path ----- + if shape.closed: + var indices = Geometry2D.triangulate_polygon(points_2d) + if indices.is_empty(): + indices = Geometry2D.triangulate_delaunay(points_2d) + + var st = SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLES) + for index in indices: + var p = points_2d[index] + st.add_vertex(Vector3(p.x, 0.0, p.y)) + + var mesh = st.commit() + gizmo.add_mesh(mesh, mesh_material) + + # ------ Mesh representing path thickness ------ + if shape.thickness > 0 and points.size() > 1: + + # ____ TODO ____ : check if this whole section could be replaced by + # Geometry2D.expand_polyline, or an extruded capsule along the path + + ## Main path mesh + var st = SurfaceTool.new() + st.begin(Mesh.PRIMITIVE_TRIANGLE_STRIP) + + for i in points.size() - 1: + var p1: Vector3 = points[i] + var p2: Vector3 = points[i + 1] + + var normal = (p2 - p1).cross(Vector3.UP).normalized() + var offset = normal * shape.thickness * 0.5 + + st.add_vertex(p1 - offset) + st.add_vertex(p1 + offset) + + ## Add the last missing two triangles from the loop above + var p1: Vector3 = points[-1] + var p2: Vector3 = points[-2] + var normal = (p1 - p2).cross(Vector3.UP).normalized() + var offset = normal * shape.thickness * 0.5 + + st.add_vertex(p1 - offset) + st.add_vertex(p1 + offset) + + var mesh := st.commit() + gizmo.add_mesh(mesh, mesh_material) + + ## Rounded cap (start) + st.begin(Mesh.PRIMITIVE_TRIANGLES) + var center = points[0] + var next = points[1] + normal = (center - next).cross(Vector3.UP).normalized() + + for i in 12: + st.add_vertex(center) + st.add_vertex(center + normal * shape.thickness * 0.5) + normal = normal.rotated(Vector3.UP, PI / 12) + st.add_vertex(center + normal * shape.thickness * 0.5) + + mesh = st.commit() + gizmo.add_mesh(mesh, mesh_material) + + ## Rounded cap (end) + st.begin(Mesh.PRIMITIVE_TRIANGLES) + center = points[-1] + next = points[-2] + normal = (next - center).cross(Vector3.UP).normalized() + + for i in 12: + st.add_vertex(center) + st.add_vertex(center + normal * shape.thickness * 0.5) + normal = normal.rotated(Vector3.UP, -PI / 12) + st.add_vertex(center + normal * shape.thickness * 0.5) + + mesh = st.commit() + gizmo.add_mesh(mesh, mesh_material) + + +func forward_3d_gui_input(viewport_camera: Camera3D, event: InputEvent) -> bool: + if not _event_helper: + _event_helper = ProtonScatterEventHelper.new() + + _event_helper.feed(event) + + if not event is InputEventMouseButton: + return false + + if not _event_helper.is_key_just_pressed(MOUSE_BUTTON_LEFT): # Can't use just_released here + return false + + var shape_node: ProtonScatterShape = _gizmo_panel.shape_node + if not shape_node: + return false + + if not shape_node.shape or not shape_node.shape is ProtonScatterPathShape: + return false + + var shape: ProtonScatterPathShape = shape_node.shape + + # In select mode, the set_handle and commit_handle functions take over. + if _gizmo_panel.is_select_mode_enabled(): + return false + + var click_world_position := _intersect_with(shape_node, viewport_camera, event.position) + var point_local_position: Vector3 = shape_node.get_global_transform().affine_inverse() * click_world_position + + if _gizmo_panel.is_create_mode_enabled(): + shape.create_point(point_local_position) # TODO: add undo redo + shape_node.update_gizmos() + return true + + elif _gizmo_panel.is_delete_mode_enabled(): + var index = shape.get_closest_to(point_local_position) + if index != -1: + shape.remove_point(index) # TODO: add undo redo + shape_node.update_gizmos() + return true + + return false + + +func set_gizmo_panel(panel: PathPanel) -> void: + _gizmo_panel = panel + + +func _edit_path(shape_node: ProtonScatterShape, restore: ProtonScatterPathShape) -> void: + shape_node.shape.curve = restore.curve.duplicate() + shape_node.shape.thickness = restore.thickness + shape_node.update_gizmos() + + +func _intersect_with(path: ProtonScatterShape, camera: Camera3D, screen_point: Vector2, handle_position_local = null) -> Vector3: + # Get the ray data + var from = camera.project_ray_origin(screen_point) + var dir = camera.project_ray_normal(screen_point) + var gt = path.get_global_transform() + + # Snap to collider enabled + if _gizmo_panel.is_snap_to_colliders_enabled(): + var space_state: PhysicsDirectSpaceState3D = path.get_world_3d().get_direct_space_state() + var parameters := PhysicsRayQueryParameters3D.new() + parameters.from = from + parameters.to = from + (dir * 2048) + var hit := space_state.intersect_ray(parameters) + if not hit.is_empty(): + return hit.position + + # Lock to plane enabled + if _gizmo_panel.is_lock_to_plane_enabled(): + var t = Transform3D(gt) + var a = t.basis.x + var b = t.basis.z + var c = a + b + var o = t.origin + var plane = Plane(a + o, b + o, c + o) + var result = plane.intersects_ray(from, dir) + if result != null: + return result + + # Default case (similar to the built in Path3D node) + var origin: Vector3 + if handle_position_local: + origin = gt * handle_position_local + else: + origin = path.get_global_transform().origin + + var plane = Plane(dir, origin) + var res = plane.intersects_ray(from, dir) + if res != null: + return res + + return origin + diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd.uid new file mode 100644 index 0000000..328cd22 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/path_gizmo.gd.uid @@ -0,0 +1 @@ +uid://dj7nabqhtlc6s diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd new file mode 100644 index 0000000..d8aa306 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd @@ -0,0 +1,136 @@ +@tool +extends EditorNode3DGizmoPlugin + + +# Actual logic split in the handler class to avoid cluttering this script as +# we add extra shapes. +# +# Although we could make an actual gizmo per shape type and add the extra type +# check in the 'has_gizmo' function, it causes more issues to the editor +# than it's worth (2 fewer files), so it's done like this instead. + + +const ScatterShape = preload("../../scatter_shape.gd") +const GizmoHandler = preload("./gizmo_handler.gd") + + +var _editor_plugin: EditorPlugin +var _handlers: Dictionary + + +func _init(): + var handle_icon = preload("./icons/main_handle.svg") + var secondary_handle_icon = preload("./icons/secondary_handle.svg") + + # TODO: Replace hardcoded colors by a setting fetch + create_material("primary", Color(1, 0.4, 0)) + create_material("secondary", Color(0.4, 0.7, 1.0)) + create_material("tertiary", Color(Color.STEEL_BLUE, 0.2)) + create_custom_material("primary_top", Color(1, 0.4, 0)) + create_custom_material("secondary_top", Color(0.4, 0.7, 1.0)) + create_custom_material("tertiary_top", Color(Color.STEEL_BLUE, 0.1)) + + create_material("inclusive", Color(0.9, 0.7, 0.2, 0.15)) + create_material("exclusive", Color(0.9, 0.1, 0.2, 0.15)) + + create_handle_material("default_handle") + create_handle_material("primary_handle", false, handle_icon) + create_handle_material("secondary_handle", false, secondary_handle_icon) + + _handlers[ProtonScatterSphereShape] = preload("./sphere_gizmo.gd").new() + _handlers[ProtonScatterPathShape] = preload("./path_gizmo.gd").new() + _handlers[ProtonScatterBoxShape] = preload("./box_gizmo.gd").new() + + +func _get_gizmo_name() -> String: + return "ScatterShape" + + +func _has_gizmo(node) -> bool: + return node is ScatterShape + + +func _get_handle_name(gizmo: EditorNode3DGizmo, handle_id: int, secondary: bool) -> String: + return _get_handler(gizmo).get_handle_name(gizmo, handle_id, secondary) + + +func _get_handle_value(gizmo: EditorNode3DGizmo, handle_id: int, secondary: bool) -> Variant: + return _get_handler(gizmo).get_handle_value(gizmo, handle_id, secondary) + + +func _set_handle(gizmo: EditorNode3DGizmo, handle_id: int, secondary: bool, camera: Camera3D, screen_pos: Vector2) -> void: + _get_handler(gizmo).set_handle(gizmo, handle_id, secondary, camera, screen_pos) + + +func _commit_handle(gizmo: EditorNode3DGizmo, handle_id: int, secondary: bool, restore: Variant, cancel: bool) -> void: + _get_handler(gizmo).commit_handle(gizmo, handle_id, secondary, restore, cancel) + + +func _redraw(gizmo: EditorNode3DGizmo): + if _is_node_selected(gizmo): + _get_handler(gizmo).redraw(self, gizmo) + else: + gizmo.clear() + + +func forward_3d_gui_input(viewport_camera: Camera3D, event: InputEvent) -> int: + for handler in _handlers.values(): + if handler.forward_3d_gui_input(viewport_camera, event): + return EditorPlugin.AFTER_GUI_INPUT_STOP + + return EditorPlugin.AFTER_GUI_INPUT_PASS + + +func set_undo_redo(ur: EditorUndoRedoManager) -> void: + for handler_type in _handlers: + _handlers[handler_type].set_undo_redo(ur) + + +func set_path_gizmo_panel(panel: Control) -> void: + if ProtonScatterPathShape in _handlers: + _handlers[ProtonScatterPathShape].set_gizmo_panel(panel) + + +func set_editor_plugin(plugin: EditorPlugin) -> void: + _editor_plugin = plugin + for handler_type in _handlers: + _handlers[handler_type].set_editor_plugin(plugin) + + +# Creates a standard material displayed on top of everything. +# Only exists because 'create_material() on_top' parameter doesn't seem to work. +func create_custom_material(name: String, color := Color.WHITE): + var material := StandardMaterial3D.new() + material.set_blend_mode(StandardMaterial3D.BLEND_MODE_ADD) + material.set_shading_mode(StandardMaterial3D.SHADING_MODE_UNSHADED) + material.set_flag(StandardMaterial3D.FLAG_DISABLE_DEPTH_TEST, true) + material.set_albedo(color) + material.render_priority = 100 + + add_material(name, material) + + +func _get_handler(gizmo: EditorNode3DGizmo) -> GizmoHandler: + var null_handler = GizmoHandler.new() # Only so we don't have to check existence later + + var shape_node = gizmo.get_node_3d() + if not shape_node or not shape_node is ScatterShape: + return null_handler + + var shape_resource = shape_node.shape + if not shape_resource: + return null_handler + + var shape_type = shape_resource.get_script() + if not shape_type in _handlers: + return null_handler + + return _handlers[shape_type] + + +func _is_node_selected(gizmo: EditorNode3DGizmo) -> bool: + if ProjectSettings.get_setting(_editor_plugin.GIZMO_SETTING): + return true + + var selected_nodes: Array[Node] = _editor_plugin.get_custom_selection() + return gizmo.get_node_3d() in selected_nodes diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd.uid new file mode 100644 index 0000000..4a7d728 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/shape_gizmo_plugin.gd.uid @@ -0,0 +1 @@ +uid://tif2uv7g1vkr diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd b/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd new file mode 100644 index 0000000..12319e7 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd @@ -0,0 +1,97 @@ +@tool +extends "gizmo_handler.gd" + +# 3D Gizmo for the Sphere shape. Draws three circle on each axis to represent +# a sphere, displays one handle on the size to control the radius. +# +# (handle_id is ignored in every function since there's a single handle) + +const SphereShape = preload("../sphere_shape.gd") + + +func get_handle_name(_gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> String: + return "Radius" + + +func get_handle_value(gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool) -> Variant: + return gizmo.get_node_3d().shape.radius + + +func set_handle(gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool, camera: Camera3D, screen_pos: Vector2) -> void: + var shape_node = gizmo.get_node_3d() + var gt := shape_node.get_global_transform() + var gt_inverse := gt.affine_inverse() + var origin := gt.origin + + var ray_from = camera.project_ray_origin(screen_pos) + var ray_to = ray_from + camera.project_ray_normal(screen_pos) * 4096 + var points = Geometry3D.get_closest_points_between_segments(origin, (Vector3.LEFT * 4096) * gt_inverse, ray_from, ray_to) + shape_node.shape.radius = origin.distance_to(points[0]) + + +func commit_handle(gizmo: EditorNode3DGizmo, _handle_id: int, _secondary: bool, restore: Variant, cancel: bool) -> void: + var shape: SphereShape = gizmo.get_node_3d().shape + if cancel: + shape.radius = restore + return + + _undo_redo.create_action("Set ScatterShape Radius") + _undo_redo.add_undo_method(self, "_set_radius", shape, restore) + _undo_redo.add_do_method(self, "_set_radius", shape, shape.radius) + _undo_redo.commit_action() + + +func redraw(plugin: EditorNode3DGizmoPlugin, gizmo: EditorNode3DGizmo): + gizmo.clear() + + var scatter_shape = gizmo.get_node_3d() + var shape: SphereShape = scatter_shape.shape + + ### Draw the 3 circles on each axis to represent the sphere + var lines = PackedVector3Array() + var lines_material := plugin.get_material("primary_top", gizmo) + var steps = 32 # TODO: Update based on sphere radius maybe ? + var step_angle = 2 * PI / steps + var radius = shape.radius + + for i in steps: + lines.append(Vector3(cos(i * step_angle), 0.0, sin(i * step_angle)) * radius) + lines.append(Vector3(cos((i + 1) * step_angle), 0.0, sin((i + 1) * step_angle)) * radius) + + if is_selected(gizmo): + for i in steps: + lines.append(Vector3(cos(i * step_angle), sin(i * step_angle), 0.0) * radius) + lines.append(Vector3(cos((i + 1) * step_angle), sin((i + 1) * step_angle), 0.0) * radius) + + for i in steps: + lines.append(Vector3(0.0, cos(i * step_angle), sin(i * step_angle)) * radius) + lines.append(Vector3(0.0, cos((i + 1) * step_angle), sin((i + 1) * step_angle)) * radius) + + gizmo.add_lines(lines, lines_material) + gizmo.add_collision_segments(lines) + + ### Draw the handle + var handles := PackedVector3Array() + var handles_ids := PackedInt32Array() + var handles_material := plugin.get_material("default_handle", gizmo) + + var handle_position: Vector3 = Vector3.LEFT * radius + handles.push_back(handle_position) + + gizmo.add_handles(handles, handles_material, handles_ids) + + ### Fills the sphere inside + var mesh = SphereMesh.new() + mesh.height = shape.radius * 2.0 + mesh.radius = shape.radius + var mesh_material: StandardMaterial3D + if scatter_shape.negative: + mesh_material = plugin.get_material("exclusive", gizmo) + else: + mesh_material = plugin.get_material("inclusive", gizmo) + gizmo.add_mesh(mesh, mesh_material) + + +func _set_radius(sphere: SphereShape, radius: float) -> void: + if sphere: + sphere.radius = radius diff --git a/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd.uid b/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd.uid new file mode 100644 index 0000000..3e04830 --- /dev/null +++ b/addons/proton_scatter/src/shapes/gizmos_plugin/sphere_gizmo.gd.uid @@ -0,0 +1 @@ +uid://ry17elq508bj diff --git a/addons/proton_scatter/src/shapes/path_shape.gd b/addons/proton_scatter/src/shapes/path_shape.gd new file mode 100644 index 0000000..7d6c92c --- /dev/null +++ b/addons/proton_scatter/src/shapes/path_shape.gd @@ -0,0 +1,249 @@ +@tool +class_name ProtonScatterPathShape +extends ProtonScatterBaseShape + + +const Bounds := preload("../common/bounds.gd") + + +@export var closed := true: + set(val): + closed = val + emit_changed() + +@export var thickness := 0.0: + set(val): + thickness = max(0, val) # Width cannot be negative + _half_thickness_squared = pow(thickness * 0.5, 2) + emit_changed() + +@export var curve: Curve3D: + set(val): + # Disconnect previous signal + if curve and curve.changed.is_connected(_on_curve_changed): + curve.changed.disconnect(_on_curve_changed) + + curve = val + curve.changed.connect(_on_curve_changed) + emit_changed() + + +var _polygon: PolygonPathFinder +var _half_thickness_squared: float +var _bounds: Bounds + + +func is_point_inside(point: Vector3, global_transform: Transform3D) -> bool: + if not _polygon: + _update_polygon_from_curve() + + if not _polygon: + return false + + point = global_transform.affine_inverse() * point + + if thickness > 0: + var closest_point_on_curve: Vector3 = curve.get_closest_point(point) + var dist2 = closest_point_on_curve.distance_squared_to(point) + if dist2 < _half_thickness_squared: + return true + + if closed: + return _polygon.is_point_inside(Vector2(point.x, point.z)) + + return false + + +func get_corners_global(gt: Transform3D) -> Array: + var res := [] + + if not curve: + return res + + var half_thickness = thickness * 0.5 + var corners = [ + Vector3(-1, -1, -1), + Vector3(1, -1, -1), + Vector3(1, -1, 1), + Vector3(-1, -1, 1), + Vector3(-1, 1, -1), + Vector3(1, 1, -1), + Vector3(1, 1, 1), + Vector3(-1, 1, 1), + ] + + var points = curve.tessellate(3, 10) + for p in points: + res.push_back(gt * p) + + if thickness > 0: + for offset in corners: + res.push_back(gt * (p + offset * half_thickness)) + + return res + + +func get_bounds() -> Bounds: + if not _bounds: + _update_polygon_from_curve() + return _bounds + + +func get_copy(): + var copy = get_script().new() + + copy.thickness = thickness + copy.closed = closed + if curve: + copy.curve = curve.duplicate() + + return copy + + +func copy_from(source) -> void: + thickness = source.thickness + if source.curve: + curve = source.curve.duplicate() # TODO, update signals + + +# TODO: create points in the middle of the path +func create_point(position: Vector3) -> void: + if not curve: + curve = Curve3D.new() + + curve.add_point(position) + + +func remove_point(index): + if index > curve.get_point_count() - 1: + return + curve.remove_point(index) + + +func get_closest_to(position): + if curve.get_point_count() == 0: + return -1 + + var closest = -1 + var dist_squared = -1 + + for i in curve.get_point_count(): + var point_pos: Vector3 = curve.get_point_position(i) + var point_dist: float = point_pos.distance_squared_to(position) + + if (closest == -1) or (dist_squared > point_dist): + closest = i + dist_squared = point_dist + + var threshold = 16 # Ignore if the closest point is farther than this + if dist_squared >= threshold: + return -1 + + return closest + + +func get_closed_edges(shape_t: Transform3D) -> Array[PackedVector2Array]: + if not closed and thickness <= 0: + return [] + + if not curve: + return [] + + var edges: Array[PackedVector2Array] = [] + var polyline := PackedVector2Array() + var shape_t_inverse := shape_t.affine_inverse() + var points := curve.tessellate(5, 5) # TODO: find optimal values + + for p in points: + p *= shape_t_inverse # Apply the shape node transform + polyline.push_back(Vector2(p.x, p.z)) + + if closed: + # Ensure the polygon is closed + var first_point: Vector3 = points[0] + var last_point: Vector3 = points[-1] + + if first_point != last_point: + first_point *= shape_t_inverse + polyline.push_back(Vector2(first_point.x, first_point.z)) + + # Prevents the polyline to be considered as a hole later. + if Geometry2D.is_polygon_clockwise(polyline): + polyline.reverse() + + # Expand the polyline to get the outer edge of the path. + if thickness > 0: + # WORKAROUND. We cant specify the round end caps resolution, but it's tied to the polyline + # size. So we scale everything up before calling offset_polyline(), then scale the result + # down so we get rounder caps. + var scale = 5.0 * thickness + var delta = (thickness / 2.0) * scale + + var t2 = Transform2D().scaled(Vector2.ONE * scale) + var result := Geometry2D.offset_polyline(polyline * t2, delta, Geometry2D.JOIN_ROUND, Geometry2D.END_ROUND) + + t2 = Transform2D().scaled(Vector2.ONE * (1.0 / scale)) + for polygon in result: + edges.push_back(polygon * t2) + + if closed and thickness == 0.0: + edges.push_back(polyline) + + return edges + + +func get_open_edges(shape_t: Transform3D) -> Array[Curve3D]: + if not curve or closed or thickness > 0: + return [] + + var res := Curve3D.new() + var shape_t_inverse := shape_t.affine_inverse() + + for i in curve.get_point_count(): + var pos = curve.get_point_position(i) + var pos_t = pos * shape_t_inverse + var p_in = (curve.get_point_in(i) + pos) * shape_t_inverse - pos_t + var p_out = (curve.get_point_out(i) + pos) * shape_t_inverse - pos_t + res.add_point(pos_t, p_in, p_out) + + return [res] + + +func _update_polygon_from_curve() -> void: + var connections = PackedInt32Array() + var polygon_points = PackedVector2Array() + + if not _bounds: + _bounds = Bounds.new() + + _bounds.clear() + _polygon = PolygonPathFinder.new() + + if not curve: + curve = Curve3D.new() + + if curve.get_point_count() == 0: + return + + var baked_points = curve.tessellate(4, 6) + var steps := baked_points.size() + + for i in baked_points.size(): + var point = baked_points[i] + var projected_point = Vector2(point.x, point.z) + _bounds.feed(point) + + polygon_points.push_back(projected_point) + connections.append(i) + if i == steps - 1: + connections.append(0) + else: + connections.append(i + 1) + + _bounds.compute_bounds() + _polygon.setup(polygon_points, connections) + + +func _on_curve_changed() -> void: + _update_polygon_from_curve() + emit_changed() diff --git a/addons/proton_scatter/src/shapes/path_shape.gd.uid b/addons/proton_scatter/src/shapes/path_shape.gd.uid new file mode 100644 index 0000000..829d2aa --- /dev/null +++ b/addons/proton_scatter/src/shapes/path_shape.gd.uid @@ -0,0 +1 @@ +uid://bmla8l6tfeta5 diff --git a/addons/proton_scatter/src/shapes/sphere_shape.gd b/addons/proton_scatter/src/shapes/sphere_shape.gd new file mode 100644 index 0000000..3816ea7 --- /dev/null +++ b/addons/proton_scatter/src/shapes/sphere_shape.gd @@ -0,0 +1,71 @@ +@tool +class_name ProtonScatterSphereShape +extends ProtonScatterBaseShape + + +@export var radius := 1.0: + set(val): + radius = val + _radius_squared = val * val + emit_changed() + +var _radius_squared := 0.0 + + +func get_copy(): + var copy = ProtonScatterSphereShape.new() + copy.radius = radius + return copy + + +func is_point_inside(point: Vector3, global_transform: Transform3D) -> bool: + var shape_center = global_transform * Vector3.ZERO + return shape_center.distance_squared_to(point) < _radius_squared + + +func get_corners_global(gt: Transform3D) -> Array: + var res := [] + + var corners := [ + Vector3(-1, -1, -1), + Vector3(-1, -1, 1), + Vector3(1, -1, 1), + Vector3(1, -1, -1), + Vector3(-1, 1, -1), + Vector3(-1, 1, 1), + Vector3(1, 1, 1), + Vector3(1, 1, -1), + ] + + for c in corners: + c *= radius + res.push_back(gt * c) + + return res + + + +# Returns the circle matching the intersection between the scatter node XZ plane +# and the sphere. Returns an empty array if there's no intersection. +func get_closed_edges(shape_t: Transform3D) -> Array[PackedVector2Array]: + var edge := PackedVector2Array() + var plane := Plane(Vector3.UP, 0.0) + + var sphere_center := shape_t.origin + var dist2plane = plane.distance_to(sphere_center) + var radius_at_ground_level := sqrt(pow(radius, 2) - pow(dist2plane, 2)) + + # No intersection with plane + if radius_at_ground_level <= 0.0 or radius_at_ground_level > radius: + return [] + + var origin := Vector2(sphere_center.x, sphere_center.z) + var steps: int = max(16, int(radius_at_ground_level * 12)) + var angle: float = TAU / steps + + for i in steps + 1: + var theta = angle * i + var point := origin + Vector2(cos(theta), sin(theta)) * radius_at_ground_level + edge.push_back(point) + + return [edge] diff --git a/addons/proton_scatter/src/shapes/sphere_shape.gd.uid b/addons/proton_scatter/src/shapes/sphere_shape.gd.uid new file mode 100644 index 0000000..b392b51 --- /dev/null +++ b/addons/proton_scatter/src/shapes/sphere_shape.gd.uid @@ -0,0 +1 @@ +uid://djsvn08xssx6k diff --git a/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd b/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd new file mode 100644 index 0000000..76c8cc3 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd @@ -0,0 +1,15 @@ +@tool +extends EditorProperty + + +var _ui: Control + + +func _init(): + _ui = preload("./ui/stack_panel.tscn").instantiate() + add_child(_ui) + set_bottom_editor(_ui) + + +func set_node(object) -> void: + _ui.set_node(object) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd.uid new file mode 100644 index 0000000..136b4cc --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/editor_property.gd.uid @@ -0,0 +1 @@ +uid://bgmx0gi8ut7fs diff --git a/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd b/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd new file mode 100644 index 0000000..55290ef --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd @@ -0,0 +1,19 @@ +@tool +extends EditorInspectorPlugin + + +const Editor = preload("./editor_property.gd") +const Scatter = preload("../../scatter.gd") + + +func _can_handle(object): + return is_instance_of(object, Scatter) + + +func _parse_property(object, type, name, hint_type, hint_string, usage_flags, wide): + if name == "modifier_stack": + var editor_property = Editor.new() + editor_property.set_node(object) + add_property_editor("modifier_stack", editor_property) + return true + return false diff --git a/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd.uid new file mode 100644 index 0000000..55c4869 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/modifier_stack_plugin.gd.uid @@ -0,0 +1 @@ +uid://d02nt2l7bt6vn diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd new file mode 100644 index 0000000..2d2ecb0 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd @@ -0,0 +1,19 @@ +@tool +extends Button + + +@onready var _popup: PopupPanel = $ModifiersPopup + + +func _ready() -> void: + _popup.popup_hide.connect(_on_popup_closed) + + +func _toggled(button_pressed): + if button_pressed: + _popup.position = global_position + Vector2(0.0, size.y) + _popup.popup() + + +func _on_popup_closed() -> void: + button_pressed = false diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd.uid new file mode 100644 index 0000000..4338f73 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd.uid @@ -0,0 +1 @@ +uid://bcw5hnfa5vnjy diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd new file mode 100644 index 0000000..1026ed8 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd @@ -0,0 +1,59 @@ +@tool +extends Control + + +signal value_changed + + +var _scatter +var _previous +var _locked := false + + +func set_scatter(scatter_node) -> void: + _scatter = scatter_node + + +func set_parameter_name(_text: String) -> void: + pass + + +func set_hint_string(_hint: String) -> void: + pass + + +func set_value(val) -> void: + _locked = true + _set_value(val) + _previous = get_value() + _locked = false + + +func get_value(): + pass + + +func get_editor_theme() -> Theme: + if not _scatter: + return ThemeDB.get_default_theme() + + var editor_interface: Variant + + if Engine.get_version_info().minor >= 2: + editor_interface = EditorInterface + return editor_interface.get_editor_theme() + else: + editor_interface = _scatter.editor_plugin.get_editor_interface() + return editor_interface.get_base_control().get_theme() + + +func _set_value(_val): + pass + + +func _on_value_changed(_val) -> void: + if not _locked: + var value = get_value() + if value != _previous: + value_changed.emit(value, _previous) + _previous = value diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd.uid new file mode 100644 index 0000000..80d211a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/base_parameter.gd.uid @@ -0,0 +1 @@ +uid://dmec2vgorp72p diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/bitmask_button.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/bitmask_button.tscn new file mode 100644 index 0000000..978b123 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/bitmask_button.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=4 format=3 uid="uid://cf4lrr5tnlwnw"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lylt6"] +content_margin_left = 0.0 +content_margin_top = 0.0 +content_margin_right = 0.0 +content_margin_bottom = 0.0 +bg_color = Color(1, 1, 1, 0.54902) +corner_radius_top_left = 2 +corner_radius_top_right = 2 +corner_radius_bottom_right = 2 +corner_radius_bottom_left = 2 +corner_detail = 6 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8hejw"] +content_margin_left = 0.0 +content_margin_top = 0.0 +content_margin_right = 0.0 +content_margin_bottom = 0.0 +bg_color = Color(1, 1, 1, 0.784314) +corner_radius_top_left = 2 +corner_radius_top_right = 2 +corner_radius_bottom_right = 2 +corner_radius_bottom_left = 2 +corner_detail = 6 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dmtgy"] +content_margin_left = 0.0 +content_margin_top = 0.0 +content_margin_right = 0.0 +content_margin_bottom = 0.0 +bg_color = Color(1, 1, 1, 1) +corner_radius_top_left = 2 +corner_radius_top_right = 2 +corner_radius_bottom_right = 2 +corner_radius_bottom_left = 2 +corner_detail = 6 + +[node name="Button" type="Button"] +custom_minimum_size = Vector2(20, 20) +size_flags_horizontal = 3 +focus_mode = 0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 12 +theme_override_styles/normal = SubResource("StyleBoxFlat_lylt6") +theme_override_styles/hover = SubResource("StyleBoxFlat_8hejw") +theme_override_styles/pressed = SubResource("StyleBoxFlat_dmtgy") +toggle_mode = true +text = "00" diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd new file mode 100644 index 0000000..a002e49 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd @@ -0,0 +1,347 @@ +# warning-ignore-all:return_value_discarded + +@tool +extends Control + + +signal curve_updated + + +@export var grid_color := Color(1, 1, 1, 0.2) +@export var grid_color_sub := Color(1, 1, 1, 0.1) +@export var curve_color := Color(1, 1, 1, 0.9) +@export var point_color := Color.WHITE +@export var selected_point_color := Color.ORANGE +@export var point_radius := 4.0 +@export var text_color := Color(0.9, 0.9, 0.9) +@export var columns := 4 +@export var rows := 2 +@export var dynamic_row_count := true + +var curve: Curve +var gt: Transform2D + +var _hover_point := -1: + set(val): + if val != _hover_point: + _hover_point = val + queue_redraw() + +var _selected_point := -1: + set(val): + if val != _selected_point: + _selected_point = val + queue_redraw() + +var _selected_tangent := -1: + set(val): + if val != _selected_tangent: + _selected_tangent = val + queue_redraw() + +var _dragging := false +var _hover_radius := 50.0 # Squared +var _tangents_length := 30.0 +var _font: Font + + +func _ready() -> void: + #rect_min_size.y *= EditorUtil.get_editor_scale() + var plugin := EditorPlugin.new() + var editor_theme := plugin.get_editor_interface().get_base_control().get_theme() + if editor_theme: + _font = editor_theme.get_font("Main", "EditorFonts") + else: + _font = ThemeDB.fallback_font + plugin.queue_free() + + queue_redraw() + connect("resized", _on_resized) + + +func set_curve(c: Curve) -> void: + curve = c + queue_redraw() + + +func get_curve() -> Curve: + return curve + + +func _gui_input(event) -> void: + if event is InputEventKey: + if _selected_point != -1 and event.scancode == KEY_DELETE: + remove_point(_selected_point) + + elif event is InputEventMouseButton: + if event.double_click: + add_point(_to_curve_space(event.position)) + + elif event.pressed and event.button_index == MOUSE_BUTTON_MIDDLE: + var i = get_point_at(event.position) + if i != -1: + remove_point(i) + + elif event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + set_selected_tangent(get_tangent_at(event.position)) + + if _selected_tangent == -1: + set_selected_point(get_point_at(event.position)) + if _selected_point != -1: + _dragging = true + + elif _dragging and not event.pressed: + _dragging = false + emit_signal("curve_updated") + + elif event is InputEventMouseMotion: + if _dragging: + var curve_amplitude: float = curve.get_max_value() - curve.get_min_value() + + # Snap to "round" coordinates when holding Ctrl. + # Be more precise when holding Shift as well. + var snap_threshold: float + if event.ctrl_pressed: + snap_threshold = 0.025 if event.shift else 0.1 + else: + snap_threshold = 0.0 + + if _selected_tangent == -1: # Drag point + var point_pos: Vector2 = _to_curve_space(event.position).snapped(Vector2(snap_threshold, snap_threshold * curve_amplitude)) + + # The index may change if the point is dragged across another one + var i: int = curve.set_point_offset(_selected_point, point_pos.x) + set_hover(i) + set_selected_point(i) + + # This is to prevent the user from losing a point out of view. + if point_pos.y < curve.get_min_value(): + point_pos.y = curve.get_min_value() + elif point_pos.y > curve.get_max_value(): + point_pos.y = curve.get_max_value() + + curve.set_point_value(_selected_point, point_pos.y) + + else: # Drag tangent + var point_pos: Vector2 = curve.get_point_position(_selected_point) + var control_pos: Vector2 = _to_curve_space(event.position).snapped(Vector2(snap_threshold, snap_threshold * curve_amplitude)) + + var dir: Vector2 = (control_pos - point_pos).normalized() + + var tangent: float + if not is_zero_approx(dir.x): + tangent = dir.y / dir.x + else: + tangent = 1 if dir.y >= 0 else -1 + tangent *= 9999 + + var link: bool = not Input.is_key_pressed(KEY_SHIFT) + + if _selected_tangent == 0: + curve.set_point_left_tangent(_selected_point, tangent) + + # Note: if a tangent is set to linear, it shouldn't be linked to the other + if link and _selected_point != (curve.get_point_count() - 1) and curve.get_point_right_mode(_selected_point) != Curve.TANGENT_LINEAR: + curve.set_point_right_tangent(_selected_point, tangent) + + else: + curve.set_point_right_tangent(_selected_point, tangent) + + if link and _selected_point != 0 and curve.get_point_left_mode(_selected_point) != Curve.TANGENT_LINEAR: + curve.set_point_left_tangent(_selected_point, tangent) + queue_redraw() + else: + set_hover(get_point_at(event.position)) + + +func add_point(pos: Vector2) -> void: + if not curve: + return + + pos.y = clamp(pos.y, 0.0, 1.0) + curve.add_point(pos) + queue_redraw() + emit_signal("curve_updated") + + +func remove_point(idx: int) -> void: + if not curve: + return + + if idx == _selected_point: + set_selected_point(-1) + + if idx == _hover_point: + set_hover(-1) + + curve.remove_point(idx) + queue_redraw() + emit_signal("curve_updated") + + +func get_point_at(pos: Vector2) -> int: + if not curve: + return -1 + + for i in curve.get_point_count(): + var p := _to_view_space(curve.get_point_position(i)) + if p.distance_squared_to(pos) <= _hover_radius: + return i + + return -1 + + +func get_tangent_at(pos: Vector2) -> int: + if not curve or _selected_point < 0: + return -1 + + if _selected_point != 0: + var control_pos: Vector2 = _get_tangent_view_pos(_selected_point, 0) + if control_pos.distance_squared_to(pos) < _hover_radius: + return 0 + + if _selected_point != curve.get_point_count() - 1: + var control_pos = _get_tangent_view_pos(_selected_point, 1) + if control_pos.distance_squared_to(pos) < _hover_radius: + return 1 + + return -1 + + +func _draw() -> void: + if not curve: + return + + var text_height = _font.get_height() + var min_outer := Vector2(0, size.y) + var max_outer := Vector2(size.x, 0) + var min_inner := Vector2(text_height, size.y - text_height) + var max_inner := Vector2(size.x - text_height, text_height) + + var width: float = max_inner.x - min_inner.x + var height: float = max_inner.y - min_inner.y + + var curve_min: float = curve.get_min_value() + var curve_max: float = curve.get_max_value() + + + # Main area + draw_line(Vector2(0, max_inner.y), Vector2(max_outer.x, max_inner.y), grid_color) + draw_line(Vector2(0, min_inner.y), Vector2(max_outer.x, min_inner.y), grid_color) + draw_line(Vector2(min_inner.x, max_outer.y), Vector2(min_inner.x, min_outer.y), grid_color) + draw_line(Vector2(max_inner.x, max_outer.y), Vector2(max_inner.x, min_outer.y), grid_color) + + # Grid and scale + ## Vertical lines + var x_offset = 1.0 / columns + var margin = 4 + + for i in columns + 1: + var x = width * (i * x_offset) + min_inner.x + draw_line(Vector2(x, max_outer.y), Vector2(x, min_outer.y), grid_color_sub) + draw_string(_font, Vector2(x + margin, min_outer.y - margin), str(snapped(i * x_offset, 0.01)), 0, -1, -1, text_color) + + ## Horizontal lines + var y_offset = 1.0 / rows + + for i in rows + 1: + var y = height * (i * y_offset) + min_inner.y + draw_line(Vector2(min_outer.x, y), Vector2(max_outer.x, y), grid_color_sub) + var y_value = i * ((curve_max - curve_min) / rows) + curve_min + draw_string(_font, Vector2(min_inner.x + margin, y - margin), str(snapped(y_value, 0.01)), 0, -1, -1, text_color) + + # Plot curve + var steps = 100 + var offset = 1.0 / steps + x_offset = width / steps + + var a: float + var a_y: float + var b: float + var b_y: float + + a = curve.sample_baked(0.0) + a_y = remap(a, curve_min, curve_max, min_inner.y, max_inner.y) + + for i in steps - 1: + b = curve.sample_baked((i + 1) * offset) + b_y = remap(b, curve_min, curve_max, min_inner.y, max_inner.y) + draw_line(Vector2(min_inner.x + x_offset * i, a_y), Vector2(min_inner.x + x_offset * (i + 1), b_y), curve_color) + a_y = b_y + + # Draw points + for i in curve.get_point_count(): + var pos: Vector2 = _to_view_space(curve.get_point_position(i)) + if _selected_point == i: + draw_circle(pos, point_radius, selected_point_color) + else: + draw_circle(pos, point_radius, point_color); + + if _hover_point == i: + draw_arc(pos, point_radius + 4.0, 0.0, 2 * PI, 12, point_color, 1.0, true) + + # Draw tangents + if _selected_point >= 0: + var i: int = _selected_point + var pos: Vector2 = _to_view_space(curve.get_point_position(i)) + + if i != 0: + var control_pos: Vector2 = _get_tangent_view_pos(i, 0) + draw_line(pos, control_pos, selected_point_color) + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), selected_point_color) + + if i != curve.get_point_count() - 1: + var control_pos: Vector2 = _get_tangent_view_pos(i, 1) + draw_line(pos, control_pos, selected_point_color) + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), selected_point_color) + + +func _to_view_space(pos: Vector2) -> Vector2: + var h = _font.get_height() + pos.x = remap(pos.x, 0.0, 1.0, h, size.x - h) + pos.y = remap(pos.y, curve.get_min_value(), curve.get_max_value(), size.y - h, h) + return pos + + +func _to_curve_space(pos: Vector2) -> Vector2: + var h = _font.get_height() + pos.x = remap(pos.x, h, size.x - h, 0.0, 1.0) + pos.y = remap(pos.y, size.y - h, h, curve.get_min_value(), curve.get_max_value()) + return pos + + +func _get_tangent_view_pos(i: int, tangent: int) -> Vector2: + var dir: Vector2 + + if tangent == 0: + dir = -Vector2(1.0, curve.get_point_left_tangent(i)) + else: + dir = Vector2(1.0, curve.get_point_right_tangent(i)) + + var point_pos = _to_view_space(curve.get_point_position(i)) + var control_pos = _to_view_space(curve.get_point_position(i) + dir) + + return point_pos + _tangents_length * (control_pos - point_pos).normalized() + + +func set_hover(val: int) -> void: + if val != _hover_point: + _hover_point = val + queue_redraw() + + +func set_selected_point(val: int) -> void: + if val != _selected_point: + _selected_point = val + queue_redraw() + + +func set_selected_tangent(val: int) -> void: + if val != _selected_tangent: + _selected_tangent = val + queue_redraw() + + +func _on_resized() -> void: + if dynamic_row_count: + rows = (int(size.y / custom_minimum_size.y) + 1) * 2 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd.uid new file mode 100644 index 0000000..4a4ceed --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd.uid @@ -0,0 +1 @@ +uid://cseouy3e63ry6 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd new file mode 100644 index 0000000..fda5f0c --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd @@ -0,0 +1,23 @@ +@tool +extends "../base_parameter.gd" + + +var _button + + +func _ready() -> void: + _button = get_node("Button") + _button.toggled.connect(_on_value_changed) + + +func enable(enabled: bool) -> void: + _button.disabled = not enabled + _button.flat = not enabled + + +func get_value() -> bool: + return _button.button_pressed + + +func _set_value(val: bool) -> void: + _button.button_pressed = val diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd.uid new file mode 100644 index 0000000..3985591 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd.uid @@ -0,0 +1 @@ +uid://b4mwwix1u1px diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.tscn new file mode 100644 index 0000000..12dab18 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://w6ycb4oveqhd"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.gd" id="1_f6puy"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd" id="2_167vc"] + +[node name="MarginContainer" type="MarginContainer"] +offset_right = 40.0 +offset_bottom = 40.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource( "1_f6puy" ) + +[node name="Button" type="Button" parent="."] +offset_right = 40.0 +offset_bottom = 40.0 +focus_mode = 0 +toggle_mode = true +icon_alignment = 1 +script = ExtResource( "2_167vc" ) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd new file mode 100644 index 0000000..688f19a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd @@ -0,0 +1,17 @@ +@tool +extends "../base_parameter.gd" + + +@onready var _spinbox = $SpinBox + + +func _ready() -> void: + _spinbox.value_changed.connect(_on_value_changed) + + +func get_value() -> int: + return int(_spinbox.get_value()) + + +func _set_value(val: int) -> void: + _spinbox.set_value(val) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd.uid new file mode 100644 index 0000000..771f376 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd.uid @@ -0,0 +1 @@ +uid://dm47bifned3ud diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.tscn new file mode 100644 index 0000000..76175e5 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=2 format=3 uid="uid://c36gqn03pvlnr"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.gd" id="1_f0oq6"] + +[node name="ParameterSpinbox" type="MarginContainer"] +offset_right = 83.0625 +offset_bottom = 31.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource( "1_f0oq6" ) + +[node name="SpinBox" type="SpinBox" parent="."] +offset_right = 83.0 +offset_bottom = 31.0 +min_value = -100.0 +allow_greater = true +allow_lesser = true diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd new file mode 100644 index 0000000..c32279a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd @@ -0,0 +1,131 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $Label +@onready var _grid_1: Control = $%GridContainer1 +@onready var _grid_2: Control = $%GridContainer2 +@onready var _grid_3: Control = $%GridContainer3 +@onready var _grid_4: Control = $%GridContainer4 +@onready var _menu_button: MenuButton = $%MenuButton + +var _buttons: Array[Button] +var _popup: PopupMenu +var _layer_count := 32 + + +func _ready() -> void: + _buttons = [] + var grids = [_grid_1, _grid_2, _grid_3, _grid_4] + + for g in grids: + for c in g.get_children(): + if c is Button: + var layer_number = c.text.to_int() + if layer_number > _layer_count: + c.visible = false + continue + _buttons.push_front(c) + c.focus_mode = Control.FOCUS_NONE + c.pressed.connect(_on_button_pressed) + + _popup = _menu_button.get_popup() + _popup.clear() + + var layer_name := "" + for i in _layer_count: + if i != 0 and i % 4 == 0: + _popup.add_separator("", 100 + i) + + layer_name = ProjectSettings.get_setting("layer_names/3d_physics/layer_" + str(i + 1)) + if layer_name.is_empty(): + layer_name = "Layer " + str(i + 1) + _popup.add_check_item(layer_name, _layer_count - 1 - i) + + _sync_popup_state() + _popup.id_pressed.connect(_on_id_pressed) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func _set_value(val: int) -> void: + var binary_string: String = _dec2bin(val) + var length = binary_string.length() + + if length < _layer_count: + binary_string = binary_string.pad_zeros(_layer_count) + elif length > _layer_count: + binary_string = binary_string.substr(length - _layer_count, length) + + for i in _layer_count: + _buttons[i].button_pressed = binary_string[i] == "1" + + _sync_popup_state() + + +func get_value() -> int: + var binary_string = "" + for b in _buttons: + binary_string += "1" if b.button_pressed else "0" + + var val = _bin2dec(binary_string) + return val + + +func _dec2bin(value: int) -> String: + if value == 0: + return "0" + + var binary_string = "" + while value != 0: + var m = value % 2 + binary_string = str(m) + binary_string + # warning-ignore:integer_division + value = value / 2 + + return binary_string + + +func _bin2dec(binary_string: String) -> int: + var decimal_value = 0 + var count = binary_string.length() - 1 + + for i in binary_string.length(): + decimal_value += pow(2, count) * binary_string[i].to_int() + count -= 1 + + return decimal_value + + +func _sync_popup_state() -> void: + if not _popup: + return + + for i in _layer_count: + var idx = _popup.get_item_index(i) + _popup.set_item_checked(idx, _buttons[i].button_pressed) + + +func _on_button_pressed() -> void: + _on_value_changed(null) + _sync_popup_state() + + +func _on_id_pressed(id: int) -> void: + var idx = _popup.get_item_index(id) + var checked = not _popup.is_item_checked(idx) + _buttons[id].button_pressed = checked + _popup.set_item_checked(idx, checked) + _on_button_pressed() + + +func _on_enable_all_pressed() -> void: + _set_value(4294967295) + _on_value_changed(null) + + +func _on_clear_pressed() -> void: + _set_value(0) + _on_value_changed(null) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd.uid new file mode 100644 index 0000000..1f5f601 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd.uid @@ -0,0 +1 @@ +uid://bo26i7gkkj4qc diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.tscn new file mode 100644 index 0000000..afff086 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.tscn @@ -0,0 +1,335 @@ +[gd_scene load_steps=6 format=3 uid="uid://chondv2lhs4pl"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bitmask.gd" id="1"] +[ext_resource type="PackedScene" uid="uid://cf4lrr5tnlwnw" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/bitmask_button.tscn" id="2"] +[ext_resource type="Texture2D" uid="uid://n66mufjib4ds" path="res://addons/proton_scatter/icons/menu.svg" id="3"] +[ext_resource type="Texture2D" uid="uid://bosx22dy64f11" path="res://addons/proton_scatter/icons/clear.svg" id="4"] +[ext_resource type="Texture2D" uid="uid://uytbptu3a34s" path="res://addons/proton_scatter/icons/select_all.svg" id="4_h30jm"] + +[node name="parameter_bitmask" type="VBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 178.0 +script = ExtResource("1") + +[node name="Label" type="Label" parent="."] +layout_mode = 2 +text = "Parameter name" + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +layout_mode = 2 +alignment = 2 + +[node name="MenuButton" type="MenuButton" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +icon = ExtResource("3") +item_count = 39 +popup/item_0/text = "Layer 1" +popup/item_0/checkable = 1 +popup/item_0/id = 31 +popup/item_1/text = "Layer 2" +popup/item_1/checkable = 1 +popup/item_1/id = 30 +popup/item_2/text = "Layer 3" +popup/item_2/checkable = 1 +popup/item_2/id = 29 +popup/item_3/text = "Layer 4" +popup/item_3/checkable = 1 +popup/item_3/id = 28 +popup/item_4/text = "" +popup/item_4/id = 104 +popup/item_4/separator = true +popup/item_5/text = "Layer 5" +popup/item_5/checkable = 1 +popup/item_5/id = 27 +popup/item_6/text = "Layer 6" +popup/item_6/checkable = 1 +popup/item_6/id = 26 +popup/item_7/text = "Layer 7" +popup/item_7/checkable = 1 +popup/item_7/id = 25 +popup/item_8/text = "Layer 8" +popup/item_8/checkable = 1 +popup/item_8/id = 24 +popup/item_9/text = "" +popup/item_9/id = 108 +popup/item_9/separator = true +popup/item_10/text = "Layer 9" +popup/item_10/checkable = 1 +popup/item_10/id = 23 +popup/item_11/text = "Layer 10" +popup/item_11/checkable = 1 +popup/item_11/id = 22 +popup/item_12/text = "Layer 11" +popup/item_12/checkable = 1 +popup/item_12/id = 21 +popup/item_13/text = "Layer 12" +popup/item_13/checkable = 1 +popup/item_13/id = 20 +popup/item_14/text = "" +popup/item_14/id = 112 +popup/item_14/separator = true +popup/item_15/text = "Layer 13" +popup/item_15/checkable = 1 +popup/item_15/id = 19 +popup/item_16/text = "Layer 14" +popup/item_16/checkable = 1 +popup/item_16/id = 18 +popup/item_17/text = "Layer 15" +popup/item_17/checkable = 1 +popup/item_17/id = 17 +popup/item_18/text = "Layer 16" +popup/item_18/checkable = 1 +popup/item_18/id = 16 +popup/item_19/text = "" +popup/item_19/id = 116 +popup/item_19/separator = true +popup/item_20/text = "Layer 17" +popup/item_20/checkable = 1 +popup/item_20/id = 15 +popup/item_21/text = "Layer 18" +popup/item_21/checkable = 1 +popup/item_21/id = 14 +popup/item_22/text = "Layer 19" +popup/item_22/checkable = 1 +popup/item_22/id = 13 +popup/item_23/text = "Layer 20" +popup/item_23/checkable = 1 +popup/item_23/id = 12 +popup/item_24/text = "" +popup/item_24/id = 120 +popup/item_24/separator = true +popup/item_25/text = "Layer 21" +popup/item_25/checkable = 1 +popup/item_25/id = 11 +popup/item_26/text = "Layer 22" +popup/item_26/checkable = 1 +popup/item_26/id = 10 +popup/item_27/text = "Layer 23" +popup/item_27/checkable = 1 +popup/item_27/id = 9 +popup/item_28/text = "Layer 24" +popup/item_28/checkable = 1 +popup/item_28/id = 8 +popup/item_29/text = "" +popup/item_29/id = 124 +popup/item_29/separator = true +popup/item_30/text = "Layer 25" +popup/item_30/checkable = 1 +popup/item_30/id = 7 +popup/item_31/text = "Layer 26" +popup/item_31/checkable = 1 +popup/item_31/id = 6 +popup/item_32/text = "Layer 27" +popup/item_32/checkable = 1 +popup/item_32/id = 5 +popup/item_33/text = "Layer 28" +popup/item_33/checkable = 1 +popup/item_33/id = 4 +popup/item_34/text = "" +popup/item_34/id = 128 +popup/item_34/separator = true +popup/item_35/text = "Layer 29" +popup/item_35/checkable = 1 +popup/item_35/id = 3 +popup/item_36/text = "Layer 30" +popup/item_36/checkable = 1 +popup/item_36/id = 2 +popup/item_37/text = "Layer 31" +popup/item_37/checkable = 1 +popup/item_37/id = 1 +popup/item_38/text = "Layer 32" +popup/item_38/checkable = 1 +popup/item_38/id = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="GridContainer1" type="GridContainer" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +columns = 4 + +[node name="Button1" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "1" + +[node name="Button2" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "2" + +[node name="Button3" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "3" + +[node name="Button4" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "4" + +[node name="Button5" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "5" + +[node name="Button6" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "6" + +[node name="Button7" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "7" + +[node name="Button8" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer1" instance=ExtResource("2")] +layout_mode = 2 +text = "8" + +[node name="VSeparator" type="VSeparator" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 + +[node name="GridContainer2" type="GridContainer" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +columns = 4 + +[node name="Button9" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "9" + +[node name="Button10" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "10" + +[node name="Button11" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "11" + +[node name="Button12" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "12" + +[node name="Button13" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "13" + +[node name="Button14" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "14" + +[node name="Button15" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "15" + +[node name="Button16" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/GridContainer2" instance=ExtResource("2")] +layout_mode = 2 +text = "16" + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="GridContainer3" type="GridContainer" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +columns = 4 + +[node name="Button17" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "17" + +[node name="Button18" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "18" + +[node name="Button19" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "19" + +[node name="Button20" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "20" + +[node name="Button21" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "21" + +[node name="Button22" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "22" + +[node name="Button23" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "23" + +[node name="Button24" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer3" instance=ExtResource("2")] +layout_mode = 2 +text = "24" + +[node name="VSeparator2" type="VSeparator" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 + +[node name="GridContainer4" type="GridContainer" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +columns = 4 + +[node name="Button25" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "25" + +[node name="Button26" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "26" + +[node name="Button27" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "27" + +[node name="Button28" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "28" + +[node name="Button29" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "29" + +[node name="Button30" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "30" + +[node name="Button31" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "31" + +[node name="Button32" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer2/GridContainer4" instance=ExtResource("2")] +layout_mode = 2 +text = "32" + +[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="EnableAll" type="Button" parent="MarginContainer/HBoxContainer/VBoxContainer2"] +layout_mode = 2 +size_flags_vertical = 3 +focus_mode = 0 +icon = ExtResource("4_h30jm") +flat = true +expand_icon = true + +[node name="ClearButton" type="Button" parent="MarginContainer/HBoxContainer/VBoxContainer2"] +layout_mode = 2 +size_flags_vertical = 3 +focus_mode = 0 +icon = ExtResource("4") +flat = true + +[connection signal="pressed" from="MarginContainer/HBoxContainer/VBoxContainer2/EnableAll" to="." method="_on_enable_all_pressed"] +[connection signal="pressed" from="MarginContainer/HBoxContainer/VBoxContainer2/ClearButton" to="." method="_on_clear_pressed"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd new file mode 100644 index 0000000..cdd2f2f --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd @@ -0,0 +1,23 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $Label +@onready var _check_box: CheckBox = $CheckBox + + +func _ready() -> void: + # warning-ignore:return_value_discarded + _check_box.connect("toggled", _on_value_changed) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func get_value() -> bool: + return _check_box.button_pressed + + +func _set_value(val: bool) -> void: + _check_box.button_pressed = val diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd.uid new file mode 100644 index 0000000..f48ce38 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd.uid @@ -0,0 +1 @@ +uid://df7yvxjbmab2s diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.tscn new file mode 100644 index 0000000..49aa944 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=2 format=3 uid="uid://10wqs13p5i3d"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_bool.gd" id="1"] + +[node name="ParameterScalar" type="HBoxContainer"] +anchor_right = 1.0 +script = ExtResource( "1" ) + +[node name="Label" type="Label" parent="."] +offset_top = 2.0 +offset_right = 996.0 +offset_bottom = 28.0 +size_flags_horizontal = 3 +text = "Parameter name" + +[node name="CheckBox" type="CheckBox" parent="."] +offset_left = 1000.0 +offset_right = 1024.0 +offset_bottom = 31.0 +focus_mode = 0 +mouse_filter = 1 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd new file mode 100644 index 0000000..9159699 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd @@ -0,0 +1,25 @@ +@tool +extends "base_parameter.gd" + + +const Util = preload("../../../../../common/util.gd") + + +@onready var _label: Label = $Label +@onready var _panel: Control = $MarginContainer/CurvePanel + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func get_value() -> Curve: + return _panel.get_curve() + + +func _set_value(val: Curve) -> void: + _panel.set_curve(val) + + +func _on_curve_updated() -> void: + _on_value_changed(get_value()) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd.uid new file mode 100644 index 0000000..a39d148 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd.uid @@ -0,0 +1 @@ +uid://b6e5olh06u3h diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.tscn new file mode 100644 index 0000000..9917586 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=3 uid="uid://dqjwibwhdmgsb"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_curve.gd" id="1"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/curve_panel.gd" id="2"] + +[node name="ParameterCurve" type="VBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1") + +[node name="Label" type="Label" parent="."] +layout_mode = 2 +text = "Curve name" + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 + +[node name="CurvePanel" type="PanelContainer" parent="MarginContainer"] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +script = ExtResource("2") +selected_point_color = Color(0.878431, 0.47451, 0, 1) +rows = 4 + +[connection signal="curve_updated" from="MarginContainer/CurvePanel" to="." method="_on_curve_updated"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd new file mode 100644 index 0000000..7f5b9e3 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd @@ -0,0 +1,54 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $%Label +@onready var _select_button: Button = $%FileButton +@onready var _dialog: FileDialog = $%FileDialog +@onready var _texture: Button = $%TextureButton +@onready var _preview_root: Control = $%PreviewRoot + +var _path := "" +var _is_texture := false + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func set_hint_string(hint: String) -> void: + _is_texture = hint == "Texture" + _set_value(get_value()) + + +func _set_value(val: String) -> void: + _path = val + _select_button.text = val.get_file() + _preview_root.visible = false + + if val.is_empty(): + _select_button.text = "Select a file" + + if _is_texture: + var texture = load(get_value()) + if texture is Texture: + _texture.icon = texture + _preview_root.visible = true + + +func get_value() -> String: + return _path + + +func _on_clear_button_pressed() -> void: + _set_value("") + _on_value_changed("") + + +func _on_select_button_pressed() -> void: + _dialog.popup_centered() + + +func _on_file_selected(file: String) -> void: + _set_value(file) + _on_value_changed(file) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd.uid new file mode 100644 index 0000000..eda16a6 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd.uid @@ -0,0 +1 @@ +uid://c2drmd8qvly25 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.tscn new file mode 100644 index 0000000..109b6dc --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.tscn @@ -0,0 +1,67 @@ +[gd_scene load_steps=3 format=3 uid="uid://cvgj4rdc0mxxq"] + +[ext_resource type="Texture2D" uid="uid://bosx22dy64f11" path="res://addons/proton_scatter/icons/clear.svg" id="1"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_file.gd" id="2"] + +[node name="ParameterFile" type="VBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 31.0 +size_flags_vertical = 0 +theme_override_constants/separation = 0 +script = ExtResource("2") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Label" type="Label" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Parameter name" + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="FileButton" type="Button" parent="HBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Select a file" + +[node name="ClearButton" type="Button" parent="HBoxContainer/HBoxContainer"] +layout_mode = 2 +icon = ExtResource("1") + +[node name="PreviewRoot" type="HBoxContainer" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Control" type="Control" parent="PreviewRoot"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="TextureButton" type="Button" parent="PreviewRoot"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 +flat = true +expand_icon = true + +[node name="Control" type="Control" parent="."] +layout_mode = 2 + +[node name="FileDialog" type="FileDialog" parent="Control"] +unique_name_in_owner = true +title = "Open a File" +size = Vector2i(400, 600) +ok_button_text = "Open" +file_mode = 0 +filters = PackedStringArray("*.bmp", "*.dds", "*.exr", "*.hdr", "*.jpg", "*.jpeg", "*.png", "*.tga", "*.svg", "*.svgz", "*.webp") + +[connection signal="pressed" from="HBoxContainer/HBoxContainer/FileButton" to="." method="_on_select_button_pressed"] +[connection signal="pressed" from="HBoxContainer/HBoxContainer/ClearButton" to="." method="_on_clear_button_pressed"] +[connection signal="pressed" from="PreviewRoot/TextureButton" to="." method="_on_select_button_pressed"] +[connection signal="file_selected" from="Control/FileDialog" to="." method="_on_file_selected"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd new file mode 100644 index 0000000..842367f --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd @@ -0,0 +1,88 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $%Label +@onready var _select_button: Button = $%SelectButton +@onready var _popup: ConfirmationDialog = $%ConfirmationDialog +@onready var _tree: Tree = $%Tree + +var _full_path: NodePath +var _root: Node +var _selected: Node + + +func set_root(root) -> void: + _root = root + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func _set_value(val) -> void: + if val == null: + return + + _full_path = val + + if val.is_empty(): + return + + _select_button.text = val.get_name(val.get_name_count() - 1) + + if _root and _root.has_node(val): + _selected = _root.get_node(val) + + if val.is_empty(): + _select_button.text = "Select a node" + + +func get_value() -> NodePath: + #if _root and _selected: + # _full_path = String(_root.get_path_to(_selected)) + return _full_path + + +func _populate_tree() -> void: + _tree.clear() + var scene_root: Node = get_tree().get_edited_scene_root() + var editor_theme: Theme = get_editor_theme() + _create_items_recursive(scene_root, null, editor_theme) + + +func _create_items_recursive(node: Node, parent: TreeItem, editor_theme: Theme) -> void: + if parent and not node.owner: + return # Hidden node. + + var node_item = _tree.create_item(parent) + node_item.set_text(0, node.get_name()) + node_item.set_meta("node", node) + + var node_icon: Texture2D + var node_class := node.get_class() + if is_instance_valid(editor_theme): + if editor_theme.has_icon(node_class, "EditorIcons"): + node_icon = editor_theme.get_icon(node_class, "EditorIcons") + else: + node_icon = editor_theme.get_icon("Node", "EditorIcons") + node_item.set_icon(0, node_icon) + + for child in node.get_children(): + _create_items_recursive(child, node_item, editor_theme) + + +func _on_select_button_pressed() -> void: + _populate_tree() + _popup.popup_centered(Vector2i(400, 600)) + + +func _on_clear_button_pressed() -> void: + _select_button.text = "Select a node" + _full_path = NodePath() + + +func _on_node_selected(): + var node = _tree.get_selected().get_meta("node") + _set_value(_root.get_path_to(node)) + _on_value_changed(get_value()) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd.uid new file mode 100644 index 0000000..9bbed68 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd.uid @@ -0,0 +1 @@ +uid://cs41vh4rn1r1t diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.tscn new file mode 100644 index 0000000..baaff4b --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=3 format=3 uid="uid://bku7i3ct7ftui"] + +[ext_resource type="Texture2D" uid="uid://bosx22dy64f11" path="res://addons/proton_scatter/icons/clear.svg" id="1"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_node_selector.gd" id="2"] + +[node name="NodeSelector" type="MarginContainer"] +anchors_preset = 10 +anchor_right = 1.0 +script = ExtResource("2") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +offset_right = 1152.0 +offset_bottom = 31.0 + +[node name="Label" type="Label" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +offset_top = 2.0 +offset_right = 560.0 +offset_bottom = 28.0 +size_flags_horizontal = 3 +text = "Parameter name" + +[node name="SelectButton" type="Button" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +offset_left = 564.0 +offset_right = 1124.0 +offset_bottom = 31.0 +size_flags_horizontal = 3 +text = "Select Node" +flat = true + +[node name="ClearButton" type="Button" parent="HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +offset_left = 1128.0 +offset_right = 1152.0 +offset_bottom = 31.0 +icon = ExtResource("1") + +[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."] +unique_name_in_owner = true +size = Vector2i(400, 500) + +[node name="ScrollContainer" type="ScrollContainer" parent="ConfirmationDialog"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 8.0 +offset_top = 8.0 +offset_right = -960.0 +offset_bottom = -597.0 + +[node name="Tree" type="Tree" parent="ConfirmationDialog/ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 +offset_right = 184.0 +offset_bottom = 43.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[connection signal="pressed" from="HBoxContainer/SelectButton" to="." method="_on_select_button_pressed"] +[connection signal="pressed" from="HBoxContainer/ClearButton" to="." method="_on_clear_button_pressed"] +[connection signal="confirmed" from="ConfirmationDialog" to="." method="_on_node_selected"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd new file mode 100644 index 0000000..43bef14 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd @@ -0,0 +1,119 @@ +# warning-ignore-all:return_value_discarded + +@tool +extends "base_parameter.gd" + + +var _is_int := false +var _is_enum := false + +@onready var _label: Label = $Label +@onready var _spinbox: SpinBox = $%SpinBox +@onready var _option: OptionButton = $%OptionButton + + +func _ready() -> void: + _spinbox.value_changed.connect(_on_value_changed) + _option.item_selected.connect(_on_value_changed) + mark_as_int(_is_int) + + +func mark_as_int(val: bool) -> void: + _is_int = val + if _is_int and _spinbox: + _spinbox.step = 1 + + +func mark_as_enum(val: bool) -> void: + _is_enum = val + + +func toggle_option_item(idx: int, value := false) -> void: + _option.set_item_disabled(idx, not value) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func set_hint_string(hint: String) -> void: + # No hint provided, ignore. + if hint.is_empty(): + return + + if hint == "float": + _spinbox.step = 0.01 + return + + if hint == "int": + _spinbox.step = 1 + return + + # One integer provided + if hint.is_valid_int(): + _set_range(0, hint.to_int()) + return + + # Multiple items provided, check their types + var tokens = hint.split(",") + var all_int = true + var all_float = true + + for t in tokens: + if not t.is_valid_int(): + all_int = false + if not t.is_valid_float(): + all_float = false + + # All items are integer + if all_int and tokens.size() >= 2: + _set_range(tokens[0].to_int(), tokens[1].to_int()) + return + + # All items are float + if all_float: + if tokens.size() >= 2: + _set_range(tokens[0].to_float(), tokens[1].to_float()) + if tokens.size() >= 3: + _spinbox.step = tokens[2].to_float() + return + + # All items are strings, make it a dropdown + _spinbox.visible = false + _option.visible = true + _is_enum = true + _is_int = true + + for i in tokens.size(): + _option.add_item(_sanitize_option_name(tokens[i]), i) + + set_value(int(_spinbox.get_value())) + + +func get_value(): + if _is_enum: + return _option.get_selected_id() + if _is_int: + return int(_spinbox.get_value()) + return _spinbox.get_value() + + +func _set_value(val) -> void: + if _is_int: + val = int(val) + if _is_enum: + _option.select(val) + else: + _spinbox.set_value(val) + + +func _set_range(start, end) -> void: + if start < end: + _spinbox.min_value = start + _spinbox.max_value = end + _spinbox.allow_greater = false + _spinbox.allow_lesser = false + + +func _sanitize_option_name(token: String) -> String: + return token.left(token.find(":")) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd.uid new file mode 100644 index 0000000..7ee482d --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd.uid @@ -0,0 +1 @@ +uid://6cb5ngjq7n7v diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.tscn new file mode 100644 index 0000000..dce7fe4 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=2 format=3 uid="uid://bspbhkrpgak0e"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.gd" id="1"] + +[node name="ParameterScalar" type="HBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +script = ExtResource("1") + +[node name="Label" type="Label" parent="."] +layout_mode = 2 +offset_top = 2.0 +offset_right = 1833.0 +offset_bottom = 28.0 +size_flags_horizontal = 3 +text = "Parameter name" + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +offset_left = 1837.0 +offset_right = 1920.0 +offset_bottom = 31.0 +mouse_filter = 2 + +[node name="Panel" type="Panel" parent="MarginContainer"] +visible = false +layout_mode = 2 +offset_right = 83.0 +offset_bottom = 31.0 +mouse_filter = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +layout_mode = 2 +offset_right = 83.0 +offset_bottom = 31.0 +mouse_filter = 2 + +[node name="SpinBox" type="SpinBox" parent="MarginContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +offset_right = 83.0 +offset_bottom = 31.0 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="OptionButton" type="OptionButton" parent="MarginContainer/MarginContainer"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +offset_right = 83.0 +offset_bottom = 31.0 +focus_mode = 0 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd new file mode 100644 index 0000000..390d07d --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd @@ -0,0 +1,27 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $Label +@onready var _line_edit: LineEdit = $MarginContainer/MarginContainer/LineEdit + + +func _ready() -> void: + _line_edit.connect("text_entered", _on_value_changed) + _line_edit.connect("focus_exited", _on_focus_exited) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func _set_value(val: String) -> void: + _line_edit.text = val + + +func get_value() -> String: + return _line_edit.get_text() + + +func _on_focus_exited() -> void: + _on_value_changed(get_value()) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd.uid new file mode 100644 index 0000000..6ec164a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd.uid @@ -0,0 +1 @@ +uid://brjwi01afjavh diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.tscn new file mode 100644 index 0000000..00fbce5 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=4 format=3] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_string.gd" id="1"] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0, 0, 0, 0.392157 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[node name="ParameterString" type="HBoxContainer"] +anchor_right = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 2.0 +margin_right = 638.0 +margin_bottom = 16.0 +size_flags_horizontal = 3 +text = "Parameter name" +valign = 1 + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_left = 642.0 +margin_right = 1280.0 +margin_bottom = 18.0 +mouse_filter = 2 +size_flags_horizontal = 3 + +[node name="Panel" type="Panel" parent="MarginContainer"] +margin_right = 638.0 +margin_bottom = 18.0 +mouse_filter = 2 +custom_styles/panel = SubResource( 1 ) + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +margin_right = 638.0 +margin_bottom = 18.0 +mouse_filter = 2 +custom_constants/margin_right = 4 +custom_constants/margin_top = 2 +custom_constants/margin_left = 4 +custom_constants/margin_bottom = 2 + +[node name="LineEdit" type="LineEdit" parent="MarginContainer/MarginContainer"] +margin_left = 4.0 +margin_top = 2.0 +margin_right = 634.0 +margin_bottom = 16.0 +mouse_filter = 1 +custom_styles/focus = SubResource( 2 ) +custom_styles/normal = SubResource( 2 ) +clear_button_enabled = true diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd new file mode 100644 index 0000000..7a90a73 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd @@ -0,0 +1,47 @@ +# warning-ignore-all:return_value_discarded + +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $Label +@onready var _x: SpinBox = $%X +@onready var _y: SpinBox = $%Y +@onready var _link: Button = $%LinkButton + + +func _ready() -> void: + _x.value_changed.connect(_on_spinbox_value_changed) + _y.value_changed.connect(_on_spinbox_value_changed) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func get_value() -> Vector2: + var vec2 = Vector2.ZERO + vec2.x = _x.get_value() + vec2.y = _y.get_value() + return vec2 + + +func _set_value(val: Vector2) -> void: + _x.set_value(val.x) + _y.set_value(val.y) + + +func _on_clear_pressed(): + var old = get_value() + set_value(Vector2.ZERO) + _previous = old + _on_value_changed(Vector2.ZERO) + + +func _on_spinbox_value_changed(value: float) -> void: + if _link.button_pressed: + var old = get_value() + set_value(Vector2(value, value)) + _previous = old + + _on_value_changed(get_value()) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd.uid new file mode 100644 index 0000000..9946dc3 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd.uid @@ -0,0 +1 @@ +uid://ocup0g262grw diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.tscn new file mode 100644 index 0000000..e3872b7 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.tscn @@ -0,0 +1,108 @@ +[gd_scene load_steps=4 format=3 uid="uid://bjn8ydwp80y7q"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector2.gd" id="1"] +[ext_resource type="Texture2D" uid="uid://bosx22dy64f11" path="res://addons/proton_scatter/icons/clear.svg" id="2"] +[ext_resource type="Texture2D" uid="uid://gbrmse47gdxb" path="res://addons/proton_scatter/icons/link.svg" id="3_u2lry"] + +[node name="ParameterVector2" type="HBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +script = ExtResource("1") + +[node name="Label" type="Label" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 5 +text = "Parameter name" + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +mouse_filter = 2 + +[node name="Panel" type="Panel" parent="MarginContainer"] +layout_mode = 2 +mouse_filter = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 4 +mouse_filter = 2 +theme_override_constants/margin_left = 6 +theme_override_constants/margin_right = 6 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer"] +layout_mode = 2 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer"] +modulate = Color(1, 0.447059, 0.368627, 1) +layout_mode = 2 +text = "x" + +[node name="X" type="SpinBox" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer2"] +modulate = Color(0.564706, 0.992157, 0.298039, 1) +layout_mode = 2 +text = "y" + +[node name="Y" type="SpinBox" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="Control" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ClearButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 4 +focus_mode = 0 +mouse_filter = 1 +icon = ExtResource("2") +flat = true + +[node name="Control2" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="LinkButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 4 +focus_mode = 0 +mouse_filter = 1 +toggle_mode = true +icon = ExtResource("3_u2lry") +flat = true + +[node name="Control3" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer/ClearButton" to="." method="_on_clear_pressed"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd new file mode 100644 index 0000000..55678c9 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd @@ -0,0 +1,49 @@ +@tool +extends "base_parameter.gd" + + +@onready var _label: Label = $Label +@onready var _x: SpinBox = $%X +@onready var _y: SpinBox = $%Y +@onready var _z: SpinBox = $%Z +@onready var _link: Button = $%LinkButton + + +func _ready() -> void: + _x.value_changed.connect(_on_spinbox_value_changed) + _y.value_changed.connect(_on_spinbox_value_changed) + _z.value_changed.connect(_on_spinbox_value_changed) + + +func set_parameter_name(text: String) -> void: + _label.text = text + + +func get_value() -> Vector3: + var vec3 = Vector3.ZERO + vec3.x = _x.get_value() + vec3.y = _y.get_value() + vec3.z = _z.get_value() + return vec3 + + +func _set_value(val: Vector3) -> void: + _x.set_value(val.x) + _y.set_value(val.y) + _z.set_value(val.z) + + +func _on_clear_pressed(): + var old = get_value() + set_value(Vector3.ZERO) + _previous = old + _on_value_changed(Vector3.ZERO) + + +func _on_spinbox_value_changed(value: float) -> void: + if _link.button_pressed: + var old = get_value() + set_value(Vector3(value, value, value)) + _previous = old + + _on_value_changed(get_value()) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd.uid new file mode 100644 index 0000000..13eda6c --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd.uid @@ -0,0 +1 @@ +uid://tv0fg5jg2s56 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.tscn new file mode 100644 index 0000000..a5c922c --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.tscn @@ -0,0 +1,127 @@ +[gd_scene load_steps=4 format=3 uid="uid://cdpfgf0447ph4"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_vector3.gd" id="1"] +[ext_resource type="Texture2D" uid="uid://bosx22dy64f11" path="res://addons/proton_scatter/icons/clear.svg" id="2"] +[ext_resource type="Texture2D" uid="uid://gbrmse47gdxb" path="res://addons/proton_scatter/icons/link.svg" id="3_gq2ti"] + +[node name="ParameterVector3" type="HBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +script = ExtResource("1") + +[node name="Label" type="Label" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 5 +text = "Parameter name" + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 +mouse_filter = 2 + +[node name="Panel" type="Panel" parent="MarginContainer"] +layout_mode = 2 +mouse_filter = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_vertical = 4 +mouse_filter = 2 +theme_override_constants/margin_left = 6 +theme_override_constants/margin_right = 6 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer"] +layout_mode = 2 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer"] +modulate = Color(1, 0.447059, 0.368627, 1) +layout_mode = 2 +text = "x" + +[node name="X" type="SpinBox" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer2"] +modulate = Color(0.564706, 0.992157, 0.298039, 1) +layout_mode = 2 +text = "y" + +[node name="Y" type="SpinBox" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="HBoxContainer3" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer3"] +modulate = Color(0.14902, 0.8, 1, 1) +layout_mode = 2 +text = "z" + +[node name="Z" type="SpinBox" parent="MarginContainer/MarginContainer/HBoxContainer/GridContainer/HBoxContainer3"] +unique_name_in_owner = true +layout_mode = 2 +mouse_filter = 1 +min_value = -100.0 +step = 0.001 +allow_greater = true +allow_lesser = true + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +alignment = 1 + +[node name="Control3" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ClearButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 4 +focus_mode = 0 +mouse_filter = 1 +icon = ExtResource("2") +flat = true + +[node name="Control" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="LinkButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 4 +focus_mode = 0 +mouse_filter = 1 +toggle_mode = true +icon = ExtResource("3_gq2ti") +flat = true + +[node name="Control2" type="Control" parent="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/VBoxContainer/ClearButton" to="." method="_on_clear_pressed"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd new file mode 100644 index 0000000..1b46434 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd @@ -0,0 +1,96 @@ +@tool +extends Container + +# DragContainer +# Custom containner similar to a VBoxContainer, but the user can rearrange the +# children order via drag and drop. This is only used in the inspector plugin +# for the modifier stack and won't work with arbitrary control nodes. + + +signal child_moved(last_index: int, new_index: int) + + +var _separation: int = 0 +var _drag_offset = null +var _dragged_child = null +var _old_index: int +var _new_index: int +var _map := [] # Stores the y top position of each child in the stack + + +func _ready() -> void: + _separation = get_theme_constant("separation", "VBoxContainer") + + +func _notification(what): + if what == NOTIFICATION_SORT_CHILDREN or what == NOTIFICATION_RESIZED: + _update_layout() + + +func _can_drop_data(at_position, data) -> bool: + if data.get_parent() != self: + return false + + # Drag just started + if not _dragged_child: + _dragged_child = data + _drag_offset = at_position - data.position + _old_index = data.get_index() + _new_index = _old_index + + # Dragged control only follow the y mouse position + data.position.y = at_position.y - _drag_offset.y + + # Check if the children order should be changed + var computed_index = 0 + for pos_y in _map: + if pos_y > data.position.y - 16: + break + computed_index += 1 + + # Prevents edge case when dragging the last item below its current position + computed_index = clamp(computed_index, 0, get_child_count() - 1) + + if computed_index != data.get_index(): + move_child(data, computed_index) + _new_index = computed_index + + return true + + +# Called once at the end of the drag +func _drop_data(at_position, data) -> void: + _drag_offset = null + _dragged_child = null + _update_layout() + + if _old_index != _new_index: + child_moved.emit(_old_index, _new_index) + + +# Detects if the user drops the children outside the container and treats it +# as if the drop happened the moment the mouse left the container. +func _unhandled_input(event): + if not _dragged_child: + return + + if event is InputEventMouseButton and not event.pressed: + _drop_data(_dragged_child.position, _dragged_child) + + +func _update_layout() -> void: + _map.clear() + var offset := Vector2.ZERO + + for c in get_children(): + if c is Control: + _map.push_back(offset.y) + var child_min_size = c.get_combined_minimum_size() + var possible_space = Rect2(offset, Vector2(size.x, child_min_size.y)) + + if c != _dragged_child: + fit_child_in_rect(c, possible_space) + + offset.y += c.size.y + _separation + + custom_minimum_size.y = offset.y - _separation diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd.uid new file mode 100644 index 0000000..0b30bc0 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd.uid @@ -0,0 +1 @@ +uid://bqj1513tnv58i diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd new file mode 100644 index 0000000..3a5cd3d --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd @@ -0,0 +1,203 @@ +@tool +extends Control + + +signal value_changed +signal removed +signal documentation_requested +signal duplication_requested + + +const ParameterBool := preload("./components/parameter_bool.tscn") +const ParameterScalar := preload("./components/parameter_scalar.tscn") +const ParameterNodeSelector = preload("./components/parameter_node_selector.tscn") +const ParameterFile = preload("./components/parameter_file.tscn") +const ParameterCurve = preload("./components/parameter_curve.tscn") +const ParameterBitmask = preload("./components/parameter_bitmask.tscn") +const ParameterString = preload("./components/parameter_string.tscn") +const ParameterVector3 = preload("./components/parameter_vector3.tscn") +const ParameterVector2 = preload("./components/parameter_vector2.tscn") +const PARAMETER_IGNORE_LIST := [ + "enabled", + "override_global_seed", + "custom_seed", + "restrict_height", + "reference_frame", + ] + +var _scatter +var _modifier + +@onready var _parameters: Control = $%ParametersRoot +@onready var _name: Label = $%ModifierName +@onready var _expand: Button = $%Expand +@onready var _enabled: Button = $%Enabled +@onready var _remove: Button = $%Remove +@onready var _warning: Button = $%Warning +@onready var _warning_dialog: AcceptDialog = $WarningDialog +@onready var _drag_control: Control = $%DragControl +@onready var _override_ui = $%OverrideGlobalSeed +@onready var _custom_seed_ui = $%CustomSeed +@onready var _restrict_height_ui = $%RestrictHeight +@onready var _transform_space_ui = $%TransformSpace + + +func _ready() -> void: + _name.text = name + _enabled.toggled.connect(_on_enable_toggled) + _remove.pressed.connect(_on_remove_pressed) + _warning.pressed.connect(_on_warning_icon_pressed) + _expand.toggled.connect(_on_expand_toggled) + $%MenuButton.get_popup().id_pressed.connect(_on_menu_item_pressed) + + +func _get_drag_data(at_position: Vector2): + var drag_control_position = _drag_control.global_position - global_position + var drag_rect := Rect2(drag_control_position, _drag_control.size) + if drag_rect.has_point(at_position): + return self + + return null + + +func set_root(val) -> void: + _scatter = val + + +# Loops through all exposed parameters and create an UI component for each of +# them. For special properties (listed in PARAMATER_IGNORE_LIST), a special +# UI is created. +func create_ui_for(modifier) -> void: + _modifier = modifier + _modifier.warning_changed.connect(_on_warning_changed) + _on_warning_changed() + + _name.text = modifier.display_name + _enabled.button_pressed = modifier.enabled + + # Enable or disable irrelevant controls for this modifier + _override_ui.enable(modifier.can_override_seed) + _restrict_height_ui.enable(modifier.can_restrict_height) + _transform_space_ui.mark_as_enum(true) + _transform_space_ui.toggle_option_item(0, modifier.global_reference_frame_available) + _transform_space_ui.toggle_option_item(1, modifier.local_reference_frame_available) + _transform_space_ui.toggle_option_item(2, modifier.individual_instances_reference_frame_available) + if not modifier.global_reference_frame_available and \ + not modifier.local_reference_frame_available and \ + not modifier.individual_instances_reference_frame_available: + _transform_space_ui.visible = false + + # Setup header connections + _override_ui.value_changed.connect(_on_parameter_value_changed.bind("override_global_seed", _override_ui)) + _custom_seed_ui.value_changed.connect(_on_parameter_value_changed.bind("custom_seed", _custom_seed_ui)) + _restrict_height_ui.value_changed.connect(_on_parameter_value_changed.bind("restrict_height", _restrict_height_ui)) + _transform_space_ui.value_changed.connect(_on_parameter_value_changed.bind("reference_frame", _transform_space_ui)) + + # Restore header values + _override_ui.set_value(modifier.override_global_seed) + _custom_seed_ui.set_value(modifier.custom_seed) + _restrict_height_ui.set_value(modifier.restrict_height) + _transform_space_ui.set_value(modifier.reference_frame) + + # Loop over the other properties and create a ui component for each of them + for property in modifier.get_property_list(): + if property.usage != PROPERTY_USAGE_DEFAULT + PROPERTY_USAGE_SCRIPT_VARIABLE: + continue + + if property.name in PARAMETER_IGNORE_LIST: + continue + + var parameter_ui + match property.type: + TYPE_BOOL: + parameter_ui = ParameterBool.instantiate() + TYPE_FLOAT: + parameter_ui = ParameterScalar.instantiate() + TYPE_INT: + if property.hint == PROPERTY_HINT_LAYERS_3D_PHYSICS: + parameter_ui = ParameterBitmask.instantiate() + else: + parameter_ui = ParameterScalar.instantiate() + parameter_ui.mark_as_int(true) + TYPE_STRING: + if property.hint_string == "File" or property.hint_string == "Texture": + parameter_ui = ParameterFile.instantiate() + else: + parameter_ui = ParameterString.instantiate() + TYPE_VECTOR3: + parameter_ui = ParameterVector3.instantiate() + TYPE_VECTOR2: + parameter_ui = ParameterVector2.instantiate() + TYPE_NODE_PATH: + parameter_ui = ParameterNodeSelector.instantiate() + parameter_ui.set_root(_scatter) + TYPE_OBJECT: + if property.class_name == &"Curve": + parameter_ui = ParameterCurve.instantiate() + + if parameter_ui: + _parameters.add_child(parameter_ui) + parameter_ui.set_parameter_name(property.name.capitalize()) + parameter_ui.set_value(modifier.get(property.name)) + parameter_ui.set_hint_string(property.hint_string) + parameter_ui.set_scatter(_scatter) + parameter_ui.value_changed.connect(_on_parameter_value_changed.bind(property.name, parameter_ui)) + + _expand.button_pressed = _modifier.expanded + + +func _restore_value(name, val, ui) -> void: + _modifier.set(name, val) + ui.set_value(val) + value_changed.emit() + + +func _on_expand_toggled(toggled: bool) -> void: + $%ParametersContainer.visible = toggled + _modifier.expanded = toggled + + +func _on_remove_pressed() -> void: + removed.emit() + + +func _on_parameter_value_changed(value, previous, parameter_name, ui) -> void: + if _scatter.undo_redo: + _scatter.undo_redo.create_action("Change value " + parameter_name.capitalize()) + _scatter.undo_redo.add_undo_method(self, "_restore_value", parameter_name, previous, ui) + _scatter.undo_redo.add_do_method(self, "_restore_value", parameter_name, value, ui) + _scatter.undo_redo.commit_action() + else: + _modifier.set(parameter_name, value) + value_changed.emit() + + +func _on_enable_toggled(pressed: bool): + _modifier.enabled = pressed + value_changed.emit() + + +func _on_removed_pressed() -> void: + removed.emit() + + +func _on_warning_changed() -> void: + var warning = _modifier.get_warning() + _warning.visible = (warning != "") + _warning_dialog.dialog_text = warning + + +func _on_warning_icon_pressed() -> void: + _warning_dialog.popup_centered() + + +func _on_menu_item_pressed(id) -> void: + match id: + 0: + documentation_requested.emit() + 2: + duplication_requested.emit() + 3: + _on_remove_pressed() + _: + pass diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd.uid new file mode 100644 index 0000000..9e96273 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd.uid @@ -0,0 +1 @@ +uid://diedk22mlppvn diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.tscn new file mode 100644 index 0000000..48206e0 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.tscn @@ -0,0 +1,255 @@ +[gd_scene load_steps=21 format=3 uid="uid://blpobpd0eweog"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/modifier_panel.gd" id="1"] +[ext_resource type="Texture2D" uid="uid://cu2t8yylseggu" path="res://addons/proton_scatter/icons/arrow_right.svg" id="2_2djuo"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd" id="4"] +[ext_resource type="Texture2D" uid="uid://t8c6kjbvst0s" path="res://addons/proton_scatter/icons/arrow_down.svg" id="4_7nlfc"] +[ext_resource type="Texture2D" uid="uid://dahwdjl2er75o" path="res://addons/proton_scatter/icons/close.svg" id="5"] +[ext_resource type="Texture2D" uid="uid://n66mufjib4ds" path="res://addons/proton_scatter/icons/menu.svg" id="6_lmo8k"] +[ext_resource type="Texture2D" uid="uid://d2ajwyebaobjt" path="res://addons/proton_scatter/icons/duplicate.svg" id="7_f6nan"] +[ext_resource type="Texture2D" uid="uid://do8d3urxirjoa" path="res://addons/proton_scatter/icons/doc.svg" id="7_owhij"] +[ext_resource type="Texture2D" uid="uid://dj0y6peid681t" path="res://addons/proton_scatter/icons/warning.svg" id="9"] +[ext_resource type="Texture2D" uid="uid://ba6cx70dyeuhg" path="res://addons/proton_scatter/icons/drag_area.svg" id="9_t6pse"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd" id="10_ptukr"] +[ext_resource type="Texture2D" uid="uid://dmmefjvrdhf78" path="res://addons/proton_scatter/icons/dice.svg" id="11_qwhro"] +[ext_resource type="PackedScene" uid="uid://w6ycb4oveqhd" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_button.tscn" id="11_y7srw"] +[ext_resource type="Texture2D" uid="uid://cmvfdl1wnrw4" path="res://addons/proton_scatter/icons/restrict_volume.svg" id="12_lx60d"] +[ext_resource type="Texture2D" uid="uid://dt0ctlr32stnn" path="res://addons/proton_scatter/icons/local.svg" id="13_txjs8"] +[ext_resource type="PackedScene" uid="uid://c36gqn03pvlnr" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/header/parameter_spinbox.tscn" id="13_vhfch"] +[ext_resource type="Texture2D" uid="uid://p2v2cqm7k60o" path="res://addons/proton_scatter/icons/restrict_volume_lock.svg" id="15_0w0as"] +[ext_resource type="Texture2D" uid="uid://71efqwg3d70v" path="res://addons/proton_scatter/icons/global.svg" id="16_ocvvf"] +[ext_resource type="PackedScene" uid="uid://bspbhkrpgak0e" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/components/parameter_scalar.tscn" id="17_aoulv"] +[ext_resource type="Texture2D" uid="uid://vxd0iun0wq8i" path="res://addons/proton_scatter/icons/individual_instances.svg" id="19_ln8a3"] + +[node name="ModifierPanel" type="MarginContainer"] +anchors_preset = 10 +anchor_right = 1.0 +grow_horizontal = 2 +theme_type_variation = &"fg" +script = ExtResource("1") + +[node name="Panel" type="Panel" parent="."] +layout_mode = 2 +mouse_filter = 2 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +mouse_filter = 2 +theme_override_constants/margin_left = 4 +theme_override_constants/margin_top = 4 +theme_override_constants/margin_right = 4 +theme_override_constants/margin_bottom = 4 +metadata/_edit_layout_mode = 1 +metadata/_edit_use_custom_anchors = false + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 0 + +[node name="Expand" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Toggle the parameters view" +focus_mode = 0 +mouse_filter = 1 +toggle_mode = true +icon = ExtResource("2_2djuo") +flat = true +icon_alignment = 1 +script = ExtResource("4") +default_icon = ExtResource("2_2djuo") +pressed_icon = ExtResource("4_7nlfc") + +[node name="ModifierName" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "ModifierPanel" +vertical_alignment = 1 +clip_text = true + +[node name="Buttons" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 2 +alignment = 1 + +[node name="Warning" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +size_flags_horizontal = 0 +focus_mode = 0 +mouse_filter = 1 +icon = ExtResource("9") +flat = true + +[node name="MenuButton" type="MenuButton" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Show options" +icon = ExtResource("6_lmo8k") +item_count = 4 +popup/item_0/text = "Show documentation" +popup/item_0/icon = ExtResource("7_owhij") +popup/item_0/id = 0 +popup/item_1/text = "" +popup/item_1/id = 1 +popup/item_1/separator = true +popup/item_2/text = "Duplicate" +popup/item_2/icon = ExtResource("7_f6nan") +popup/item_2/id = 2 +popup/item_3/text = "Delete" +popup/item_3/icon = ExtResource("5") +popup/item_3/id = 3 + +[node name="Enabled" type="CheckBox" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Toggle the modifier. + +If the modifier is disabled, it will not contribute to the final result but will still remain in the stack. + +Use this feature to quickly see how the modifier affects the overall stack." +focus_mode = 0 +mouse_filter = 1 + +[node name="Remove" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 4 +tooltip_text = "Delete the modifier. +This will remove it from the stack." +focus_mode = 0 +mouse_filter = 1 +icon = ExtResource("5") +flat = true +icon_alignment = 1 + +[node name="VSeparator" type="VSeparator" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +modulate = Color(1, 1, 1, 0.54902) +layout_mode = 2 + +[node name="DragControl" type="TextureRect" parent="MarginContainer/VBoxContainer/HBoxContainer/Buttons"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Drag and move this button to change the stack order. + +Modifiers are processed from top to bottom." +mouse_default_cursor_shape = 6 +texture = ExtResource("9_t6pse") +stretch_mode = 3 + +[node name="ParametersContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +theme_override_constants/margin_left = 3 +theme_override_constants/margin_top = 3 +theme_override_constants/margin_right = 3 +theme_override_constants/margin_bottom = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ParametersContainer"] +layout_mode = 2 + +[node name="ParametersRoot" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer"] +layout_mode = 2 + +[node name="CommonHeader" type="HBoxContainer" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 4 +alignment = 1 + +[node name="ExpandButton" type="MarginContainer" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader"] +layout_mode = 2 +script = ExtResource("10_ptukr") + +[node name="OverrideGlobalSeed" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton" instance=ExtResource("11_y7srw")] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton/OverrideGlobalSeed" index="0"] +layout_mode = 2 +tooltip_text = "Random seed. + +Enable to force a custom seed on this modifier only. If this option is disabled, the Global Seed from the ProtonScatter node will be used instead." +icon = ExtResource("11_qwhro") +icon_alignment = 0 +default_icon = ExtResource("11_qwhro") +pressed_icon = ExtResource("11_qwhro") + +[node name="SpinBoxRoot" type="HBoxContainer" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton"] +visible = false +layout_mode = 2 +mouse_filter = 2 + +[node name="VSeparator" type="VSeparator" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton/SpinBoxRoot"] +modulate = Color(1, 1, 1, 0) +layout_mode = 2 +mouse_filter = 2 +theme_override_constants/separation = 28 + +[node name="CustomSeed" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton/SpinBoxRoot" instance=ExtResource("13_vhfch")] +unique_name_in_owner = true +layout_mode = 2 + +[node name="Control" type="Control" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="RestrictHeight" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader" instance=ExtResource("11_y7srw")] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 1 +size_flags_vertical = 3 + +[node name="Button" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/RestrictHeight" index="0"] +layout_mode = 2 +tooltip_text = "Restrict height. + +If enabled, the modifier will try to remain in the local XZ plane instead of using the full volume defined by the ScatterShapes." +icon = ExtResource("12_lx60d") +default_icon = ExtResource("12_lx60d") +pressed_icon = ExtResource("15_0w0as") + +[node name="TransformSpace" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader" instance=ExtResource("17_aoulv")] +unique_name_in_owner = true +layout_mode = 2 + +[node name="Label" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/TransformSpace" index="0"] +visible = false +text = "" + +[node name="SpinBox" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/TransformSpace/MarginContainer/MarginContainer" index="0"] +visible = false + +[node name="OptionButton" parent="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/TransformSpace/MarginContainer/MarginContainer" index="1"] +visible = true +item_count = 3 +fit_to_longest_item = false +popup/item_0/text = "Global" +popup/item_0/icon = ExtResource("16_ocvvf") +popup/item_0/id = 0 +popup/item_1/text = "Local" +popup/item_1/icon = ExtResource("13_txjs8") +popup/item_1/id = 1 +popup/item_2/text = "Individual" +popup/item_2/icon = ExtResource("19_ln8a3") +popup/item_2/id = 2 + +[node name="WarningDialog" type="AcceptDialog" parent="."] +title = "Warning" +unresizable = true +popup_window = true + +[editable path="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/ExpandButton/OverrideGlobalSeed"] +[editable path="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/RestrictHeight"] +[editable path="MarginContainer/VBoxContainer/ParametersContainer/VBoxContainer/CommonHeader/TransformSpace"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd new file mode 100644 index 0000000..1d89240 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd @@ -0,0 +1,14 @@ +@tool +extends Control + + +@onready var _button: Button = $OverrideGlobalSeed/Button +@onready var _spinbox_root: Control = $SpinBoxRoot + + +func _ready(): + _button.toggled.connect(_on_toggled) + + +func _on_toggled(enabled: bool) -> void: + _spinbox_root.visible = enabled diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd.uid new file mode 100644 index 0000000..174ae5d --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/override_seed_button.gd.uid @@ -0,0 +1 @@ +uid://d0rtsnnwp0m50 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd new file mode 100644 index 0000000..d02da8e --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd @@ -0,0 +1,18 @@ +@tool +extends Button + + +@export var default_icon: Texture +@export var pressed_icon: Texture + + +func _ready() -> void: + toggled.connect(_on_toggled) + _on_toggled(button_pressed) + + +func _on_toggled(pressed: bool) -> void: + if pressed: + icon = pressed_icon + else: + icon = default_icon diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd.uid new file mode 100644 index 0000000..a93c621 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/toggle_button.gd.uid @@ -0,0 +1 @@ +uid://b7db2i3p4tat4 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd new file mode 100644 index 0000000..2c73397 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd @@ -0,0 +1,9 @@ +@tool +extends VBoxContainer + + +@onready var label: Label = $Header/Label + + +func set_category_name(text) -> void: + label.text = text diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd.uid new file mode 100644 index 0000000..51d34ad --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd.uid @@ -0,0 +1 @@ +uid://57v4i7s46bn3 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.tscn new file mode 100644 index 0000000..690edec --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/category.gd" id="1"] + +[node name="VBoxContainer" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +rect_pivot_offset = Vector2( -591.851, -77.5574 ) +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Header" type="VBoxContainer" parent="."] +margin_right = 40.0 +margin_bottom = 22.0 + +[node name="Label" type="Label" parent="Header"] +margin_right = 40.0 +margin_bottom = 14.0 + +[node name="HSeparator" type="HSeparator" parent="Header"] +margin_top = 18.0 +margin_right = 40.0 +margin_bottom = 22.0 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd new file mode 100644 index 0000000..360c925 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd @@ -0,0 +1,113 @@ +@tool +extends PopupPanel + + +signal add_modifier + +var _modifiers := [] + +@onready var _category_root: Control = $MarginContainer/CategoryRoot + + +func _ready() -> void: + _rebuild_ui() + + +func _rebuild_ui(): + for c in _category_root.get_children(): + c.queue_free() + + _discover_modifiers() + for modifier in _modifiers: + var instance = modifier.new() + if instance.enabled: + var category = _get_or_create_category(instance.category) + var button = _create_button(instance.display_name) + category.add_child(button, true) + button.pressed.connect(_on_pressed.bind(modifier)) + + for category in _category_root.get_children(): + var header = category.get_child(0) + _sort_children_by_name(category) + category.move_child(header, 0) + + +func _create_button(display_name) -> Button: + var button = Button.new() + button.name = display_name + button.text = display_name + button.alignment = HORIZONTAL_ALIGNMENT_LEFT + return button + + +func _sort_children_by_name(node: Node) -> void: + var dict := {} + var names := [] + + for child in node.get_children(): + names.push_back(child.name) + dict[child.name] = child + + names.sort_custom(func(a, b): return String(a) < String(b)) + + for i in names.size(): + var n = names[i] + node.move_child(dict[n], i) + + +func _get_or_create_category(text: String) -> Control: + if _category_root.has_node(text): + return _category_root.get_node(text) as Control + + var c = preload("category.tscn").instantiate() + c.name = text + _category_root.add_child(c, true) + c.set_category_name(text) + return c + + +func _discover_modifiers() -> void: + if _modifiers.is_empty(): + var path = _get_root_folder() + "/src/modifiers/" + _discover_modifiers_recursive(path) + + +func _discover_modifiers_recursive(path) -> void: + var dir = DirAccess.open(path) + dir.list_dir_begin() + var path_root = dir.get_current_dir() + "/" + + while true: + var file = dir.get_next() + if file == "": + break + if file == "base_modifier.gd": + continue + if dir.current_is_dir(): + _discover_modifiers_recursive(path_root + file) + continue + if not file.ends_with(".gd") and not file.ends_with(".gdc"): + continue + + var full_path = path_root + file + var script = load(full_path) + if not script or not script.can_instantiate(): + print("Error: Failed to load script ", file) + continue + + _modifiers.push_back(script) + + dir.list_dir_end() + + +func _get_root_folder() -> String: + var script: Script = get_script() + var path: String = script.get_path().get_base_dir() + var folders = path.right(-6) # Remove the res:// + var tokens = folders.split('/') + return "res://" + tokens[0] + "/" + tokens[1] + + +func _on_pressed(modifier) -> void: + add_modifier.emit(modifier.new()) + visible = false diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd.uid new file mode 100644 index 0000000..7231728 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd.uid @@ -0,0 +1 @@ +uid://swih7hlafivy diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.tscn new file mode 100644 index 0000000..644d361 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=2 format=3 uid="uid://belutr5odecw2"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.gd" id="1"] + +[node name="ModifiersPopup" type="PopupPanel"] +size = Vector2i(597, 322) +visible = true +script = ExtResource("1") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -431.0 +offset_bottom = -282.0 + +[node name="CategoryRoot" type="HBoxContainer" parent="MarginContainer"] +offset_right = 589.0 +offset_bottom = 314.0 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd new file mode 100644 index 0000000..0c8306c --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd @@ -0,0 +1,87 @@ +@tool +extends Window + + +signal load_preset +signal delete_preset + + +@onready var _no_presets: Label = $MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/NoPresets +@onready var _root: VBoxContainer = $MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot +@onready var _confirmation_dialog: ConfirmationDialog = $ConfirmationDialog + +var _selected: String +var _selected_ui: Node + + +func _ready(): + _rebuild_ui() + about_to_popup.connect(_rebuild_ui) + + +func _rebuild_ui(): + for c in _root.get_children(): + c.queue_free() + _root.visible = false + + var presets = _find_all_presets() + if presets.empty(): + _no_presets.visible = true + return + + _no_presets.visible = false + _root.visible = true + for p in presets: + var ui = preload("./preset.tscn").instantiate() + _root.add_child(ui) + ui.set_preset_name(p) + ui.load_preset.connect(_on_load_preset.bind(p)) + ui.delete_preset.connect(_on_delete_preset.bind(p, ui)) + + +func _find_all_presets() -> Array: + var root := _get_root_folder() + "/presets/" + var res := [] + var dir = DirAccess.open(root) + if not dir: + return res + + dir.list_dir_begin() + while true: + var file = dir.get_next() + if file == "": + break + + if file.ends_with(".tscn"): + res.push_back(file.get_basename()) + + dir.list_dir_end() + res.sort() + return res + + +func _get_root_folder() -> String: + var path: String = get_script().get_path().get_base_dir() + var folders = path.right(6) # Remove the res:// + var tokens = folders.split('/') + return "res://" + tokens[0] + "/" + tokens[1] + + +func _on_load_preset(preset_name) -> void: + emit_signal("load_preset", preset_name) + visible = false + + +func _on_delete_preset(preset_name, ui) -> void: + _selected = preset_name + _selected_ui = ui + _confirmation_dialog.popup_centered() + + +func _on_delete_preset_confirmed(): + DirAccess.remove_absolute(_get_root_folder() + "/presets/" + _selected + ".tscn") + _selected_ui.queue_free() + + +func _on_cancel_pressed(): + visible = false diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd.uid new file mode 100644 index 0000000..1c33d00 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd.uid @@ -0,0 +1 @@ +uid://dal5rayqjuxx diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.tscn new file mode 100644 index 0000000..7016386 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/presets/load_preset.gd" id="1"] + +[node name="LoadPresetPopup" type="WindowDialog"] +visible = true +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -147.5 +margin_top = -156.5 +margin_right = 147.5 +margin_bottom = 156.5 +size_flags_horizontal = 5 +size_flags_vertical = 5 +window_title = "Load Presets" +resizable = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/margin_right = 8 +custom_constants/margin_top = 8 +custom_constants/margin_left = 8 +custom_constants/margin_bottom = 8 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_left = 8.0 +margin_top = 8.0 +margin_right = 287.0 +margin_bottom = 305.0 +custom_constants/separation = 6 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer"] +margin_right = 279.0 +margin_bottom = 271.0 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ScrollContainer"] +margin_right = 279.0 +margin_bottom = 271.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="NoPresets" type="Label" parent="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer"] +visible = false +margin_right = 247.0 +margin_bottom = 118.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "No presets found. + +Create new presets by pressing the \"Save Preset\" button first." +valign = 1 +autowrap = true + +[node name="PresetsRoot" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer"] +margin_right = 279.0 +margin_bottom = 271.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +margin_left = 112.0 +margin_top = 277.0 +margin_right = 166.0 +margin_bottom = 297.0 +size_flags_horizontal = 4 + +[node name="CancelButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +margin_right = 54.0 +margin_bottom = 20.0 +text = "Cancel" + +[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."] +visible = true +margin_left = -320.0 +margin_top = 37.0 +margin_right = -120.0 +margin_bottom = 112.0 +dialog_text = "Delete preset? +(This action can't be undone)" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset" to="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset" method="_on_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset2" to="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset2" method="_on_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset3" to="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset3" method="_on_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset4" to="MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer/PresetsRoot/Preset4" method="_on_pressed"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/CancelButton" to="." method="_on_cancel_pressed"] +[connection signal="confirmed" from="ConfirmationDialog" to="." method="_on_delete_preset_confirmed"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd new file mode 100644 index 0000000..26cc06a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd @@ -0,0 +1,21 @@ +@tool +extends Button + + +signal load_preset +signal delete_preset + + +@onready var _label: Label = $MarginContainer/HBoxContainer/Label + + +func set_preset_name(text) -> void: + _label.text = text + + +func _on_pressed() -> void: + load_preset.emit() + + +func _on_delete() -> void: + delete_preset.emit() diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd.uid new file mode 100644 index 0000000..56a6cee --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd.uid @@ -0,0 +1 @@ +uid://cld7m6sco0lwx diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.tscn new file mode 100644 index 0000000..967db9a --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=3 format=3] + +[ext_resource type="Texture" uid="uid://dahwdjl2er75o" path="res://addons/proton_scatter/icons/close.svg" id="1"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/presets/preset.gd" id="2"] + +[node name="Preset" type="Button"] +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_top = -10.0 +margin_bottom = 29.0 +rect_min_size = Vector2( 0, 40 ) +focus_mode = 0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 6 +custom_constants/margin_top = 6 +custom_constants/margin_left = 6 +custom_constants/margin_bottom = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +margin_left = 6.0 +margin_top = 6.0 +margin_right = 1274.0 +margin_bottom = 34.0 + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 1236.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +text = "Preset name" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Delete" type="Button" parent="MarginContainer/HBoxContainer"] +margin_left = 1240.0 +margin_right = 1268.0 +margin_bottom = 28.0 +icon = ExtResource( 1 ) + +[connection signal="pressed" from="." to="." method="_on_pressed"] +[connection signal="pressed" from="MarginContainer/HBoxContainer/Delete" to="." method="_on_delete"] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd new file mode 100644 index 0000000..91cfed0 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd @@ -0,0 +1,78 @@ +@tool +extends Window + + +signal save_preset + + +@onready var _line_edit: LineEdit = $MarginContainer/VBoxContainer/LineEdit +@onready var _cancel: Button = $MarginContainer/VBoxContainer/HBoxContainer/Cancel +@onready var _save: Button = $MarginContainer/VBoxContainer/HBoxContainer/Save +@onready var _warning: Label = $MarginContainer/VBoxContainer/Warning +@onready var _confirm_overwrite = $ConfirmationDialog + + +func _ready(): + _cancel.pressed.connect(_on_cancel_pressed) + _save.pressed.connect(_on_save_pressed) + _warning.text = "" + _confirm_overwrite.confirmed.connect(_save_preset) + + +func _on_cancel_pressed() -> void: + visible = false + _line_edit.text = "" + + +func _on_save_pressed() -> void: + var preset_name: String = _line_edit.text + if preset_name.is_empty(): + _warning.text = "Preset name can't be empty" + return + + if not preset_name.is_valid_filename(): + _warning.text = """Preset name must be a valid file name. + It cannot contain the following characters: + : / \\ ? * " | % < >""" + return + + _warning.text = "" + if _exists(preset_name): + _confirm_overwrite.dialog_text = "Preset \"" + preset_name + "\" already exists. Overwrite?" + _confirm_overwrite.popup_centered() + else: + _save_preset() + + +func _save_preset() -> void: + emit_signal("save_preset", _line_edit.text) + visible = false + _line_edit.text = "" + + +func _exists(preset: String) -> bool: + var dir = DirAccess.open(_get_root_folder() + "/presets/") + if not dir: + return false + + dir.list_dir_begin() + + while true: + var file = dir.get_next() + if file == "": + break + + if file == preset + ".tscn": + dir.list_dir_end() + return true + + dir.list_dir_end() + return false + + +func _get_root_folder() -> String: + var script: Script = get_script() + var path: String = script.get_path().get_base_dir() + var folders = path.right(6) # Remove the res:// + var tokens = folders.split('/') + return "res://" + tokens[0] + "/" + tokens[1] diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd.uid new file mode 100644 index 0000000..d81c42b --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd.uid @@ -0,0 +1 @@ +uid://dp421sg2xxg3i diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.tscn new file mode 100644 index 0000000..65e7922 --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/presets/save_preset.gd" id="1"] + +[node name="SavePresetPopup" type="WindowDialog"] +visible = true +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -180.0 +margin_top = -81.0 +margin_right = 180.0 +margin_bottom = 81.0 +size_flags_horizontal = 5 +size_flags_vertical = 5 +window_title = "Save Preset" +resizable = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/margin_right = 24 +custom_constants/margin_top = 4 +custom_constants/margin_left = 24 +custom_constants/margin_bottom = 24 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_left = 24.0 +margin_top = 4.0 +margin_right = 336.0 +margin_bottom = 120.0 +size_flags_vertical = 0 +custom_constants/separation = 12 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Warning" type="Label" parent="MarginContainer/VBoxContainer"] +modulate = Color( 1, 0.513726, 0.278431, 1 ) +margin_right = 312.0 +margin_bottom = 48.0 +text = "Preset name must be a valid file name. +It cannot contain the following characters: +: / \\\\ ? * \" | % < >" +valign = 2 +autowrap = true + +[node name="LineEdit" type="LineEdit" parent="MarginContainer/VBoxContainer"] +margin_top = 60.0 +margin_right = 312.0 +margin_bottom = 84.0 +placeholder_text = "Preset Name" +caret_blink = true + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 96.0 +margin_right = 312.0 +margin_bottom = 116.0 +custom_constants/separation = 24 +alignment = 1 + +[node name="Cancel" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +margin_left = 96.0 +margin_right = 150.0 +margin_bottom = 20.0 +text = "Cancel" + +[node name="Save" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +margin_left = 174.0 +margin_right = 215.0 +margin_bottom = 20.0 +text = "Save" + +[node name="ConfirmationDialog" type="ConfirmationDialog" parent="."] +visible = true +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -135.0 +margin_top = -44.0 +margin_right = 135.0 +margin_bottom = 44.0 +window_title = "Overwrite existing preset?" +dialog_autowrap = true +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd new file mode 100644 index 0000000..80b03fa --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd @@ -0,0 +1,159 @@ +@tool +extends Control + + +const ModifierPanel := preload("./modifier/modifier_panel.tscn") + + +@onready var _modifiers_container: Control = $%ModifiersContainer +@onready var _modifiers_popup: PopupPanel = $%ModifiersPopup + +var _scatter +var _modifier_stack +var _undo_redo +var _is_ready := false + + +func _ready(): + _modifiers_popup.add_modifier.connect(_on_modifier_added) + _modifiers_container.child_moved.connect(_on_modifier_moved) + %Rebuild.pressed.connect(_on_rebuild_pressed) + %DocumentationButton.pressed.connect(_on_documentation_requested.bind("ProtonScatter")) + %LoadPreset.pressed.connect(_on_load_preset_pressed) + %SavePreset.pressed.connect(_on_save_preset_pressed) + + _is_ready = true + rebuild_ui() + + +func set_node(node) -> void: + if not node: + return + + _scatter = node + _undo_redo = _scatter.undo_redo + %Documentation.set_editor_plugin(_scatter.editor_plugin) + %Presets.set_editor_plugin(_scatter.editor_plugin) + rebuild_ui() + + +func rebuild_ui() -> void: + if not _is_ready: + return + + _validate_stack_connections() + _clear() + for m in _modifier_stack.stack: + var ui = ModifierPanel.instantiate() + _modifiers_container.add_child(ui) + ui.set_root(_scatter) + ui.create_ui_for(m) + ui.removed.connect(_on_modifier_removed.bind(m)) + ui.value_changed.connect(_on_value_changed) + ui.documentation_requested.connect(_on_documentation_requested.bind(m.display_name)) + ui.duplication_requested.connect(_on_modifier_duplicated.bind(m)) + + +func _clear() -> void: + for c in _modifiers_container.get_children(): + _modifiers_container.remove_child(c) + c.queue_free() + + +func _validate_stack_connections() -> void: + if not _scatter: + return + + if _modifier_stack: + _modifier_stack.stack_changed.disconnect(_on_stack_changed) + + _modifier_stack = _scatter.modifier_stack + _modifier_stack.stack_changed.connect(_on_stack_changed) + + if _modifier_stack.just_created: + %Presets.load_default(_scatter) + _modifier_stack.just_created = false + rebuild_ui() + + +func _set_children_owner(new_owner: Node, node: Node): + for child in node.get_children(): + child.set_owner(new_owner) + if child.get_children().size() > 0: + _set_children_owner(new_owner, child) + + +func _get_root_folder() -> String: + var path: String = get_script().get_path().get_base_dir() + var folders = path.right(6) # Remove the res:// + var tokens = folders.split('/') + return "res://" + tokens[0] + "/" + tokens[1] + + +func _on_modifier_added(modifier) -> void: + if _undo_redo: + _undo_redo.create_action("Create modifier " + modifier.display_name) + _undo_redo.add_undo_method(_modifier_stack, "remove", modifier) + _undo_redo.add_do_method(_modifier_stack, "add", modifier) + _undo_redo.commit_action() + else: + _modifier_stack.add(modifier) + + +func _on_modifier_moved(old_index: int, new_index: int) -> void: + if _undo_redo: + _undo_redo.create_action("Move modifier") + _undo_redo.add_undo_method(_modifier_stack, "move", new_index, old_index) + _undo_redo.add_do_method(_modifier_stack, "move", old_index, new_index) + _undo_redo.commit_action() + else: + _modifier_stack.move(old_index, new_index) + + +func _on_modifier_removed(modifier) -> void: + if _undo_redo: + _undo_redo.create_action("Remove modifier " + modifier.display_name) + _undo_redo.add_undo_method(_modifier_stack, "add", modifier) + _undo_redo.add_do_method(_modifier_stack, "remove", modifier) + _undo_redo.commit_action() + else: + _modifier_stack.remove(modifier) + + +func _on_modifier_duplicated(modifier) -> void: + var index = _modifier_stack.get_index(modifier) + if index == -1: + return + + if _undo_redo: + _undo_redo.create_action("Duplicate modifier " + modifier.display_name) + _undo_redo.add_undo_method(_modifier_stack, "remove_at", index + 1) + _undo_redo.add_do_method(_modifier_stack, "duplicate_modifier", modifier) + _undo_redo.commit_action() + else: + _modifier_stack.duplicate_modifier(modifier) + + +func _on_stack_changed() -> void: + rebuild_ui() + + +func _on_value_changed() -> void: + _modifier_stack.value_changed.emit() + + +func _on_rebuild_pressed() -> void: + if _scatter: + _scatter.full_rebuild() + + +func _on_save_preset_pressed() -> void: + %Presets.save_preset(_scatter) + + +func _on_load_preset_pressed() -> void: + %Presets.load_preset(_scatter) + + +func _on_documentation_requested(page_name) -> void: + %Documentation.show_page(page_name) diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd.uid b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd.uid new file mode 100644 index 0000000..4b1a9cb --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd.uid @@ -0,0 +1 @@ +uid://e13t4t0hx870 diff --git a/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.tscn b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.tscn new file mode 100644 index 0000000..5d7578c --- /dev/null +++ b/addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.tscn @@ -0,0 +1,111 @@ +[gd_scene load_steps=12 format=3 uid="uid://dllpt2dven8vw"] + +[ext_resource type="Texture2D" uid="uid://cun73k8jdmr4e" path="res://addons/proton_scatter/icons/add.svg" id="1_4vwtj"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/stack_panel.gd" id="1_ga4or"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier/drag_container.gd" id="1_hg5ys"] +[ext_resource type="Texture2D" uid="uid://yqlpvcmb7mfi" path="res://addons/proton_scatter/icons/rebuild.svg" id="2_svid4"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/add_modifier_button.gd" id="3_01ldn"] +[ext_resource type="PackedScene" uid="uid://belutr5odecw2" path="res://addons/proton_scatter/src/stack/inspector_plugin/ui/modifier_list_popup/popup.tscn" id="3_pkswu"] +[ext_resource type="Texture2D" uid="uid://ddjrq1h4mkn6a" path="res://addons/proton_scatter/icons/load.svg" id="3_w72lv"] +[ext_resource type="Texture2D" uid="uid://b2omj2e03x72e" path="res://addons/proton_scatter/icons/save.svg" id="4_5l2cx"] +[ext_resource type="Texture2D" uid="uid://do8d3urxirjoa" path="res://addons/proton_scatter/icons/doc.svg" id="8_fgqhd"] +[ext_resource type="PackedScene" uid="uid://cfg8iqtuion8b" path="res://addons/proton_scatter/src/documentation/documentation.tscn" id="9_y57kc"] +[ext_resource type="PackedScene" uid="uid://bcsosdvstytoq" path="res://addons/proton_scatter/src/presets/presets.tscn" id="11_2ut8s"] + +[node name="StackPanel" type="MarginContainer"] +clip_children = 1 +clip_contents = true +offset_right = 456.0 +offset_bottom = 144.0 +theme_override_constants/margin_left = 4 +theme_override_constants/margin_top = 4 +theme_override_constants/margin_right = 4 +theme_override_constants/margin_bottom = 4 +script = ExtResource("1_ga4or") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Add" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 2 +focus_mode = 0 +toggle_mode = true +text = " Add modifier" +icon = ExtResource("1_4vwtj") +script = ExtResource("3_01ldn") + +[node name="ModifiersPopup" parent="VBoxContainer/HBoxContainer/Add" instance=ExtResource("3_pkswu")] +unique_name_in_owner = true +size = Vector2i(755, 322) +visible = false + +[node name="Rebuild" type="Button" parent="VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +tooltip_text = "Force rebuild. + +If the placed items does not look as expected, you can press this button to force it to regenerate the result. + +Usually, you shouldn't have to use it so please report it on Github if you found a case where it's necessary to click this. " +focus_mode = 0 +icon = ExtResource("2_svid4") +icon_alignment = 1 + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"] +modulate = Color(1, 1, 1, 0.54902) +layout_mode = 2 + +[node name="LoadPreset" type="Button" parent="VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Load a preset." +focus_mode = 0 +text = " +" +icon = ExtResource("3_w72lv") +icon_alignment = 1 + +[node name="SavePreset" type="Button" parent="VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Save a preset." +focus_mode = 0 +text = " +" +icon = ExtResource("4_5l2cx") +icon_alignment = 1 + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/HBoxContainer"] +modulate = Color(1, 1, 1, 0.54902) +layout_mode = 2 + +[node name="DocumentationButton" type="Button" parent="VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Open documentation" +focus_mode = 0 +text = " +" +icon = ExtResource("8_fgqhd") +icon_alignment = 1 + +[node name="ModifiersContainer" type="Container" parent="VBoxContainer"] +unique_name_in_owner = true +clip_children = 1 +custom_minimum_size = Vector2(0, -4) +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 0 +script = ExtResource("1_hg5ys") + +[node name="Documentation" parent="." instance=ExtResource("9_y57kc")] +unique_name_in_owner = true + +[node name="Presets" parent="." instance=ExtResource("11_2ut8s")] +unique_name_in_owner = true diff --git a/addons/proton_scatter/src/stack/modifier_stack.gd b/addons/proton_scatter/src/stack/modifier_stack.gd new file mode 100644 index 0000000..ac22174 --- /dev/null +++ b/addons/proton_scatter/src/stack/modifier_stack.gd @@ -0,0 +1,96 @@ +@tool +extends Resource + + +signal stack_changed +signal value_changed +signal transforms_ready + + +const ProtonScatter := preload("../scatter.gd") +const TransformList := preload("../common/transform_list.gd") + + +@export var stack: Array[ScatterBaseModifier] = [] + +var just_created := false + + +func start_update(scatter_node: ProtonScatter, domain): + var transforms = TransformList.new() + + for modifier in stack: + await modifier.process_transforms(transforms, domain, scatter_node.global_seed) + + transforms_ready.emit(transforms) + return transforms + + +func stop_update() -> void: + for modifier in stack: + modifier.interrupt() + + +func add(modifier: ScatterBaseModifier) -> void: + stack.push_back(modifier) + modifier.modifier_changed.connect(_on_modifier_changed) + stack_changed.emit() + + +func move(old_index: int, new_index: int) -> void: + var modifier = stack.pop_at(old_index) + stack.insert(new_index, modifier) + stack_changed.emit() + + +func remove(modifier: ScatterBaseModifier) -> void: + if stack.has(modifier): + stack.erase(modifier) + stack_changed.emit() + + +func remove_at(index: int) -> void: + if stack.size() > index: + stack.remove_at(index) + stack_changed.emit() + + +func duplicate_modifier(modifier: ScatterBaseModifier) -> void: + var index: int = stack.find(modifier) + if index != -1: + var copy = modifier.get_copy() + add(copy) + move(stack.size() - 1, index + 1) + + +func get_copy(): + var copy = get_script().new() + for modifier in stack: + copy.add(modifier.duplicate()) + return copy + + +func get_index(modifier: ScatterBaseModifier) -> int: + return stack.find(modifier) + + +func is_using_edge_data() -> bool: + for modifier in stack: + if modifier.use_edge_data: + return true + + return false + + +# Returns true if at least one modifier does not require shapes in order to work. +# (This is the case for the "Add single item" modifier for example) +func does_not_require_shapes() -> bool: + for modifier in stack: + if modifier.warning_ignore_no_shape: + return true + + return false + + +func _on_modifier_changed() -> void: + stack_changed.emit() diff --git a/addons/proton_scatter/src/stack/modifier_stack.gd.uid b/addons/proton_scatter/src/stack/modifier_stack.gd.uid new file mode 100644 index 0000000..78405ff --- /dev/null +++ b/addons/proton_scatter/src/stack/modifier_stack.gd.uid @@ -0,0 +1 @@ +uid://dr0q8wis1hmem diff --git a/addons/proton_scatter/tests/unit_testing.tscn b/addons/proton_scatter/tests/unit_testing.tscn new file mode 100644 index 0000000..bb677ef --- /dev/null +++ b/addons/proton_scatter/tests/unit_testing.tscn @@ -0,0 +1,2003 @@ +[gd_scene load_steps=205 format=3 uid="uid://chgskywnqfgv"] + +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter.gd" id="1_hld6g"] +[ext_resource type="Texture2D" uid="uid://6xc5b38d25gf" path="res://addons/proton_scatter/demos/assets/textures/grid.png" id="1_xpx1h"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/stack/modifier_stack.gd" id="2_y5xi5"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_random.gd" id="3_6h2s3"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_item.gd" id="4_w0gix"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/scatter_shape.gd" id="5_y7d7p"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/sphere_shape.gd" id="6_ma1h0"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_grid.gd" id="7_h0gb3"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_inside_poisson.gd" id="8_w8gx7"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_along_edge_random.gd" id="9_cbx3g"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_along_edge_even.gd" id="10_isy7v"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/box_shape.gd" id="11_36l2y"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/shapes/path_shape.gd" id="11_iwfud"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/create_along_edge_continuous.gd" id="13_x67hv"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/offset_scale.gd" id="14_tn7vn"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/single_item.gd" id="16_mv3jg"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/array.gd" id="16_u8nl4"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/randomize_transforms.gd" id="17_lon52"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/offset_position.gd" id="17_wnpjh"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/look_at.gd" id="19_ecgtl"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/offset_rotation.gd" id="19_iqrrv"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/clusterize.gd" id="19_kqhj3"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/project_on_geometry.gd" id="20_7q4m2"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/proxy.gd" id="21_5pgs0"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/relax.gd" id="21_h4uuj"] +[ext_resource type="Script" path="res://addons/proton_scatter/src/modifiers/remove_outside_shapes.gd" id="21_x4n8q"] +[ext_resource type="Shader" path="res://addons/proton_scatter/src/particles/example_random_motion.gdshader" id="27_vj2yt"] + +[sub_resource type="BoxMesh" id="BoxMesh_8ubhl"] +size = Vector3(50, 1, 50) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_sj82k"] +albedo_texture = ExtResource("1_xpx1h") +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true + +[sub_resource type="BoxShape3D" id="BoxShape3D_bii4q"] +size = Vector3(50, 1, 50) + +[sub_resource type="Resource" id="Resource_a0khl"] +script = ExtResource("3_6h2s3") +amount = 15 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_8vei7"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_a0khl")]) + +[sub_resource type="Resource" id="Resource_g8bsm"] +script = ExtResource("6_ma1h0") +radius = 1.08202 + +[sub_resource type="Resource" id="Resource_mdhrf"] +script = ExtResource("3_6h2s3") +amount = 15 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_wajph"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_mdhrf")]) + +[sub_resource type="Resource" id="Resource_nwd3r"] +script = ExtResource("6_ma1h0") +radius = 1.08202 + +[sub_resource type="Resource" id="Resource_rityo"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.5, 0.5, 0.5) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_axkfo"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_rityo")]) + +[sub_resource type="Resource" id="Resource_y8aw6"] +script = ExtResource("6_ma1h0") +radius = 1.11573 + +[sub_resource type="Resource" id="Resource_gfasn"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.5, 0.5, 0.5) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_4lehm"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_gfasn")]) + +[sub_resource type="Resource" id="Resource_fr8ni"] +script = ExtResource("6_ma1h0") +radius = 1.11573 + +[sub_resource type="Resource" id="Resource_dvb4u"] +script = ExtResource("8_w8gx7") +radius = 0.5 +samples_before_rejection = 15 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_rfrgg"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_dvb4u")]) + +[sub_resource type="Resource" id="Resource_ve5u2"] +script = ExtResource("6_ma1h0") +radius = 1.3139 + +[sub_resource type="Resource" id="Resource_f2e4b"] +script = ExtResource("8_w8gx7") +radius = 0.5 +samples_before_rejection = 15 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_j4x61"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_f2e4b")]) + +[sub_resource type="Resource" id="Resource_gywyd"] +script = ExtResource("6_ma1h0") +radius = 1.3139 + +[sub_resource type="Resource" id="Resource_1knwg"] +script = ExtResource("9_cbx3g") +instance_count = 10 +align_to_path = false +align_up_axis = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_syjiv"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_1knwg")]) + +[sub_resource type="Resource" id="Resource_eofyd"] +script = ExtResource("6_ma1h0") +radius = 0.943292 + +[sub_resource type="Resource" id="Resource_f8pmu"] +script = ExtResource("9_cbx3g") +instance_count = 10 +align_to_path = true +align_up_axis = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_rrmii"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_f8pmu")]) + +[sub_resource type="Resource" id="Resource_yleso"] +script = ExtResource("6_ma1h0") +radius = 0.943292 + +[sub_resource type="Resource" id="Resource_hrm74"] +script = ExtResource("10_isy7v") +spacing = 1.0 +offset = 0.0 +align_to_path = false +align_up_axis = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_b1fel"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_hrm74")]) + +[sub_resource type="Resource" id="Resource_1vjos"] +script = ExtResource("6_ma1h0") +radius = 1.16056 + +[sub_resource type="Resource" id="Resource_18q2p"] +script = ExtResource("10_isy7v") +spacing = 1.0 +offset = 0.01 +align_to_path = true +align_up_axis = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_i6uqa"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_18q2p")]) + +[sub_resource type="Curve3D" id="Curve3D_5o4l7"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -1.72569, 1.90735e-06, 1.38458, -1.14569, -0.489434, 0.0747547, 1.68253, 0.29301, 0.132956, 0.129681, 1.16573, -0.751579, 0, 0, 0, 0, 0, 0, 1.86491, -0.92083, 0.889172), +"tilts": PackedFloat32Array(0, 0, 0) +} +point_count = 3 + +[sub_resource type="Resource" id="Resource_jrwst"] +script = ExtResource("11_iwfud") +closed = false +thickness = 0.0 +curve = SubResource("Curve3D_5o4l7") + +[sub_resource type="Resource" id="Resource_42dco"] +script = ExtResource("13_x67hv") +item_length = 1.0 +ignore_slopes = false +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_877np"] +script = ExtResource("14_tn7vn") +operation = 1 +scale = Vector3(1, 1, 2.6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_uox5l"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_42dco"), SubResource("Resource_877np")]) + +[sub_resource type="Resource" id="Resource_1fk1d"] +script = ExtResource("6_ma1h0") +radius = 1.11462 + +[sub_resource type="Resource" id="Resource_07emv"] +script = ExtResource("11_36l2y") +size = Vector3(1, 1, 3.75316) + +[sub_resource type="Resource" id="Resource_nqb4l"] +script = ExtResource("16_mv3jg") +offset = Vector3(0, 0, 0) +rotation = Vector3(0, 0, 40) +scale = Vector3(1, 1, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_bw4o3"] +script = ExtResource("14_tn7vn") +operation = 1 +scale = Vector3(1, 2, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_3bvlc"] +script = ExtResource("16_u8nl4") +amount = 3 +min_amount = -1 +local_offset = true +offset = Vector3(0, 1, 0) +local_rotation = false +rotation = Vector3(0, 0, 0) +individual_rotation_pivots = true +rotation_pivot = Vector3(0, 0, 0) +local_scale = false +scale = Vector3(1, 1, 1) +randomize_indices = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_f6tel"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_nqb4l"), SubResource("Resource_bw4o3"), SubResource("Resource_3bvlc")]) + +[sub_resource type="Resource" id="Resource_02pho"] +script = ExtResource("16_mv3jg") +offset = Vector3(0, 1.187, 0) +rotation = Vector3(0, -31.942, 0) +scale = Vector3(1, 1, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_ec8t1"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_02pho")]) + +[sub_resource type="Resource" id="Resource_qtf2k"] +script = ExtResource("16_mv3jg") +offset = Vector3(0, 0, 0) +rotation = Vector3(45, 0, 0) +scale = Vector3(1, 2, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_mmyxv"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_qtf2k")]) + +[sub_resource type="Resource" id="Resource_73pjb"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.3, 0.4, 0.3) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_blv75"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_j0n8o"] +script = ExtResource("19_kqhj3") +mask = "res://addons/proton_scatter/masks/blinds.png" +mask_rotation = 0.0 +mask_offset = Vector2(0, 8.56) +mask_scale = Vector2(1, 1) +pixel_to_unit_ratio = 32.0 +remove_below = 0.1 +scale_transforms = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_1qaw8"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_73pjb"), SubResource("Resource_blv75"), SubResource("Resource_j0n8o")]) + +[sub_resource type="Resource" id="Resource_a5k4o"] +script = ExtResource("6_ma1h0") +radius = 2.02235 + +[sub_resource type="Resource" id="Resource_t8qwo"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.3, 0.4, 0.3) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_bbajx"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_mysoe"] +script = ExtResource("19_kqhj3") +mask = "res://addons/proton_scatter/masks/blinds.png" +mask_rotation = 0.0 +mask_offset = Vector2(0, 8.56) +mask_scale = Vector2(1, 1) +pixel_to_unit_ratio = 32.0 +remove_below = 0.4 +scale_transforms = false +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_lgfwt"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_t8qwo"), SubResource("Resource_bbajx"), SubResource("Resource_mysoe")]) + +[sub_resource type="Resource" id="Resource_y5kok"] +script = ExtResource("6_ma1h0") +radius = 2.02235 + +[sub_resource type="Resource" id="Resource_rvnu4"] +script = ExtResource("3_6h2s3") +amount = 20 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_1pc4a"] +script = ExtResource("17_lon52") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(0, 360, 0) +scale = Vector3(0, 0, 2) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_iv1l5"] +script = ExtResource("19_ecgtl") +target = Vector3(0, 1, 0) +up = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_1jtvd"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_rvnu4"), SubResource("Resource_1pc4a"), SubResource("Resource_iv1l5")]) + +[sub_resource type="Resource" id="Resource_cf36a"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[sub_resource type="Resource" id="Resource_lqllm"] +script = ExtResource("3_6h2s3") +amount = 20 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_utrbb"] +script = ExtResource("17_lon52") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(0, 360, 0) +scale = Vector3(0, 0, 2) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_lg2ny"] +script = ExtResource("19_ecgtl") +target = Vector3(0, 3, 0) +up = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_osg78"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_lqllm"), SubResource("Resource_utrbb"), SubResource("Resource_lg2ny")]) + +[sub_resource type="Resource" id="Resource_m5v8r"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[sub_resource type="Resource" id="Resource_lnjcs"] +script = ExtResource("3_6h2s3") +amount = 10 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_7rgdv"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(45, 30, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_2yqfv"] +script = ExtResource("17_wnpjh") +operation = 2 +position = Vector3(0, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ggowg"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_lnjcs"), SubResource("Resource_7rgdv"), SubResource("Resource_2yqfv")]) + +[sub_resource type="Resource" id="Resource_b0fis"] +script = ExtResource("6_ma1h0") +radius = 1.35585 + +[sub_resource type="Resource" id="Resource_kr5cl"] +script = ExtResource("3_6h2s3") +amount = 10 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_xhov2"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(45, 30, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_dpvhh"] +script = ExtResource("17_wnpjh") +operation = 0 +position = Vector3(-1, 1, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_4d70d"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_kr5cl"), SubResource("Resource_xhov2"), SubResource("Resource_dpvhh")]) + +[sub_resource type="Resource" id="Resource_kebi0"] +script = ExtResource("6_ma1h0") +radius = 0.948492 + +[sub_resource type="Resource" id="Resource_tj3qn"] +script = ExtResource("3_6h2s3") +amount = 10 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_culo7"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(45, 30, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_dcn1b"] +script = ExtResource("17_wnpjh") +operation = 1 +position = Vector3(1.158, 0.517, 1.055) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_j0g8b"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_tj3qn"), SubResource("Resource_culo7"), SubResource("Resource_dcn1b")]) + +[sub_resource type="Resource" id="Resource_f2qcq"] +script = ExtResource("6_ma1h0") +radius = 0.948492 + +[sub_resource type="Resource" id="Resource_5e2iu"] +script = ExtResource("3_6h2s3") +amount = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_5x3va"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(0, 360, 0) +scale = Vector3(0, 0, 0) +enabled = false +override_global_seed = true +custom_seed = 10 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_wxvdn"] +script = ExtResource("19_iqrrv") +operation = 1 +rotation = Vector3(0, 3.027, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ojwb1"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_5e2iu"), SubResource("Resource_5x3va"), SubResource("Resource_wxvdn")]) + +[sub_resource type="Resource" id="Resource_hp05y"] +script = ExtResource("6_ma1h0") +radius = 1.33379 + +[sub_resource type="Resource" id="Resource_eobi8"] +script = ExtResource("3_6h2s3") +amount = 10 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_drprl"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(40, 0, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_8bivh"] +script = ExtResource("14_tn7vn") +operation = 2 +scale = Vector3(1, 2.65, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ndd04"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_eobi8"), SubResource("Resource_drprl"), SubResource("Resource_8bivh")]) + +[sub_resource type="Resource" id="Resource_n0ty0"] +script = ExtResource("6_ma1h0") +radius = 1.44433 + +[sub_resource type="Resource" id="Resource_ufee4"] +script = ExtResource("3_6h2s3") +amount = 15 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_ghxnv"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = true +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_tml5i"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_ufee4"), SubResource("Resource_ghxnv")]) + +[sub_resource type="Resource" id="Resource_vq7kx"] +script = ExtResource("6_ma1h0") +radius = 1.42501 + +[sub_resource type="Resource" id="Resource_74wa8"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.6, 0.6, 0.6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_t2kop"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(0, 0, 0) +scale = Vector3(0, 2, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_gn4jn"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_5wv3k"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_74wa8"), SubResource("Resource_t2kop"), SubResource("Resource_gn4jn")]) + +[sub_resource type="Resource" id="Resource_nwkwt"] +script = ExtResource("6_ma1h0") +radius = 1.42501 + +[sub_resource type="Resource" id="Resource_itdfg"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.6, 1, 0.6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_3mnoc"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(0, 0, 0) +scale = Vector3(0, 3, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_sud0j"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = true +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_wcnr2"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_itdfg"), SubResource("Resource_3mnoc"), SubResource("Resource_sud0j")]) + +[sub_resource type="Resource" id="Resource_h12gh"] +script = ExtResource("6_ma1h0") +radius = 1.59874 + +[sub_resource type="Resource" id="Resource_sc6yw"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.6, 0.6, 0.6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_yfh80"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_p6kkt"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_sc6yw"), SubResource("Resource_yfh80")]) + +[sub_resource type="Resource" id="Resource_5ddch"] +script = ExtResource("6_ma1h0") +radius = 1.42501 + +[sub_resource type="Resource" id="Resource_mn02k"] +script = ExtResource("7_h0gb3") +spacing = Vector3(0.6, 0.6, 0.6) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_up1et"] +script = ExtResource("17_lon52") +position = Vector3(0, 0, 0) +rotation = Vector3(60, 360, 0) +scale = Vector3(0, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_eeqjr"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_66aqb"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_mn02k"), SubResource("Resource_up1et"), SubResource("Resource_eeqjr")]) + +[sub_resource type="Resource" id="Resource_phfha"] +script = ExtResource("6_ma1h0") +radius = 1.42501 + +[sub_resource type="Resource" id="Resource_0ovty"] +script = ExtResource("3_6h2s3") +amount = 20 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_hvbao"] +script = ExtResource("17_lon52") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_w1c4k"] +script = ExtResource("20_7q4m2") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_xxh5g"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_0ovty"), SubResource("Resource_hvbao"), SubResource("Resource_w1c4k")]) + +[sub_resource type="Resource" id="Resource_eifot"] +script = ExtResource("6_ma1h0") +radius = 1.6059 + +[sub_resource type="Resource" id="Resource_ycnav"] +script = ExtResource("21_5pgs0") +scatter_node = NodePath("../Source") +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_u7eis"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_ycnav")]) + +[sub_resource type="Resource" id="Resource_wowj4"] +script = ExtResource("6_ma1h0") +radius = 1.6059 + +[sub_resource type="Resource" id="Resource_se8q6"] +script = ExtResource("21_5pgs0") +scatter_node = NodePath("../Source") +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_18oia"] +script = ExtResource("21_h4uuj") +iterations = 3 +offset_step = 0.3 +consecutive_step_multiplier = 0.5 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_d7vu4"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_se8q6"), SubResource("Resource_18oia")]) + +[sub_resource type="Resource" id="Resource_82ud0"] +script = ExtResource("6_ma1h0") +radius = 1.6059 + +[sub_resource type="Resource" id="Resource_x2nmf"] +script = ExtResource("3_6h2s3") +amount = 30 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_4e7pm"] +script = ExtResource("17_lon52") +position = Vector3(0, 1, 0) +rotation = Vector3(0, 0, 40) +scale = Vector3(3, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_7up6y"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_x2nmf"), SubResource("Resource_4e7pm")]) + +[sub_resource type="Resource" id="Resource_7kw48"] +script = ExtResource("6_ma1h0") +radius = 1.62434 + +[sub_resource type="Resource" id="Resource_4grs6"] +script = ExtResource("3_6h2s3") +amount = 30 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_so4tv"] +script = ExtResource("17_lon52") +position = Vector3(0, 1.005, 0) +rotation = Vector3(0, 40, 0) +scale = Vector3(3, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_c2lcy"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_4grs6"), SubResource("Resource_so4tv")]) + +[sub_resource type="Resource" id="Resource_8al8a"] +script = ExtResource("6_ma1h0") +radius = 1.63711 + +[sub_resource type="Resource" id="Resource_2vim7"] +script = ExtResource("3_6h2s3") +amount = 30 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_jx3rx"] +script = ExtResource("17_lon52") +position = Vector3(0, 1.005, 0) +rotation = Vector3(0, 40, 100) +scale = Vector3(3, 0, 0) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_t34ex"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_2vim7"), SubResource("Resource_jx3rx")]) + +[sub_resource type="Resource" id="Resource_c5k2f"] +script = ExtResource("6_ma1h0") +radius = 1.74481 + +[sub_resource type="Resource" id="Resource_tlhxg"] +script = ExtResource("3_6h2s3") +amount = 30 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_cbe88"] +script = ExtResource("21_h4uuj") +iterations = 5 +offset_step = 0.3 +consecutive_step_multiplier = 0.6 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ncnfw"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_tlhxg"), SubResource("Resource_cbe88")]) + +[sub_resource type="Resource" id="Resource_pnh7s"] +script = ExtResource("6_ma1h0") +radius = 1.51674 + +[sub_resource type="Resource" id="Resource_68u82"] +script = ExtResource("3_6h2s3") +amount = 40 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_2fbms"] +script = ExtResource("21_h4uuj") +iterations = 5 +offset_step = 0.3 +consecutive_step_multiplier = 0.6 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_1wqmj"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_68u82"), SubResource("Resource_2fbms")]) + +[sub_resource type="Resource" id="Resource_lsc8o"] +script = ExtResource("6_ma1h0") +radius = 1.19268 + +[sub_resource type="Resource" id="Resource_cvv4j"] +script = ExtResource("3_6h2s3") +amount = 75 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_bcg1s"] +script = ExtResource("17_lon52") +position = Vector3(3, 1, 3) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_ditx6"] +script = ExtResource("21_x4n8q") +negative_shapes_only = false +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_rh222"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_cvv4j"), SubResource("Resource_bcg1s"), SubResource("Resource_ditx6")]) + +[sub_resource type="Resource" id="Resource_nnf16"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[sub_resource type="Resource" id="Resource_rq4m2"] +script = ExtResource("3_6h2s3") +amount = 50 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_hjmp1"] +script = ExtResource("17_lon52") +position = Vector3(2, 1, 2) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_14l50"] +script = ExtResource("21_x4n8q") +negative_shapes_only = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_thdr8"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_rq4m2"), SubResource("Resource_hjmp1"), SubResource("Resource_14l50")]) + +[sub_resource type="Resource" id="Resource_t87ux"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[sub_resource type="Resource" id="Resource_hu6l0"] +script = ExtResource("11_36l2y") +size = Vector3(8.28605, 3.84222, 3.07433) + +[sub_resource type="Resource" id="Resource_hcorr"] +script = ExtResource("3_6h2s3") +amount = 20 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_nvyeo"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_hcorr")]) + +[sub_resource type="Resource" id="Resource_t1kde"] +script = ExtResource("6_ma1h0") +radius = 1.38138 + +[sub_resource type="Resource" id="Resource_behou"] +script = ExtResource("3_6h2s3") +amount = 40 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_cidgu"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_behou")]) + +[sub_resource type="Resource" id="Resource_4qlye"] +script = ExtResource("11_36l2y") +size = Vector3(2.92705, 1, 2.59448) + +[sub_resource type="Resource" id="Resource_qsibf"] +script = ExtResource("3_6h2s3") +amount = 40 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_ywyj6"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_qsibf")]) + +[sub_resource type="Curve3D" id="Curve3D_mco2w"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -1.0424, -7.15256e-07, 1.36102, 0, 0, 0, 0, 0, 0, -1.10198, -5.36442e-07, -1.0533, 0, 0, 0, 0, 0, 0, 1.9308, -4.17233e-07, -1.00552, 0, 0, 0, 0, 0, 0, 1.95377, -5.96046e-07, 1.38943, 0, 0, 0, 0, 0, 0, 0.818293, -0.042784, 1.50129, 0, 0, 0, 0, 0, 0, 0.752959, -1.19209e-07, -0.200405, 0, 0, 0, 0, 0, 0, -0.140599, -6.55651e-07, -0.126677, 0, 0, 0, 0, 0, 0, -0.0283718, -5.36442e-07, 1.38879), +"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0) +} +point_count = 8 + +[sub_resource type="Resource" id="Resource_acfig"] +script = ExtResource("11_iwfud") +closed = true +thickness = 0.0 +curve = SubResource("Curve3D_mco2w") + +[sub_resource type="Resource" id="Resource_e8esq"] +script = ExtResource("3_6h2s3") +amount = 75 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_p3662"] +script = ExtResource("17_lon52") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_yl5xk"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_e8esq"), SubResource("Resource_p3662")]) + +[sub_resource type="Resource" id="Resource_x5d01"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[sub_resource type="Resource" id="Resource_g6tkw"] +script = ExtResource("3_6h2s3") +amount = 75 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_4jaem"] +script = ExtResource("17_lon52") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_gavpu"] +script = ExtResource("2_y5xi5") +stack = Array[Resource]([SubResource("Resource_g6tkw"), SubResource("Resource_4jaem")]) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_7sbin"] +shader = ExtResource("27_vj2yt") + +[sub_resource type="Resource" id="Resource_o7cnt"] +script = ExtResource("6_ma1h0") +radius = 2.0 + +[node name="UnitTesting" type="Node3D"] +editor_description = "This scene checks for regressions. + +Every modifier are used in different Scatter nodes in different configuration. The generated transforms are then compared to the expected results, and throw an error if they don't match." + +[node name="Label3D" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.64562, -24.3968) +pixel_size = 0.1 +modulate = Color(0, 0, 0, 1) +outline_modulate = Color(1, 1, 1, 1) +text = "Unit testing scene" +font_size = 46 +outline_size = 6 +uppercase = true + +[node name="Floor" type="StaticBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0) +metadata/_edit_lock_ = true +metadata/_edit_group_ = true + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor"] +mesh = SubResource("BoxMesh_8ubhl") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_sj82k") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor"] +shape = SubResource("BoxShape3D_bii4q") + +[node name="CreateInside" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -20) + +[node name="Random" type="Marker3D" parent="CreateInside"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, 0) + +[node name="RandomFullHeight" type="Node3D" parent="CreateInside/Random"] +transform = Transform3D(0.933968, 0.297336, -0.198231, -0.357358, 0.7771, -0.518085, 0, 0.554714, 0.832041, 0, 1, -3) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_8vei7") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Random/RandomFullHeight"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Random/RandomFullHeight"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_g8bsm") + +[node name="RandomFlat" type="Node3D" parent="CreateInside/Random"] +transform = Transform3D(0.963584, 0.267407, 0, -0.267407, 0.963584, 0, 0, 0, 1, 0, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_wajph") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Random/RandomFlat"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Random/RandomFlat"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_nwd3r") + +[node name="Grid" type="Marker3D" parent="CreateInside"] + +[node name="GridFullHeight" type="Node3D" parent="CreateInside/Grid"] +transform = Transform3D(0.840179, 0.54231, 0, -0.54231, 0.840179, 0, 0, 0, 1, -0.169834, 1.0354, -3) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_axkfo") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Grid/GridFullHeight"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Grid/GridFullHeight"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_y8aw6") + +[node name="GridFlat" type="Node3D" parent="CreateInside/Grid"] +transform = Transform3D(0.660834, 0.16392, -0.732412, -0.240753, 0.970586, 7.45058e-09, 0.710869, 0.176331, 0.680861, -0.0824013, -0.118199, -0.518734) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_4lehm") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Grid/GridFlat"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Grid/GridFlat"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_fr8ni") + +[node name="Poisson" type="Marker3D" parent="CreateInside"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0) + +[node name="PoissonFullHeight" type="Node3D" parent="CreateInside/Poisson"] +transform = Transform3D(0.886341, 0.433591, 0.162475, -0.463033, 0.829983, 0.311012, 0, -0.350894, 0.936415, 0, 1, -3) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_rfrgg") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Poisson/PoissonFullHeight"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Poisson/PoissonFullHeight"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_ve5u2") + +[node name="PoissonFlat" type="Node3D" parent="CreateInside/Poisson"] +transform = Transform3D(0.763511, 0.223726, -0.605803, -0.17526, 0.974652, 0.139059, 0.621558, 0, 0.783368, 0, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_j4x61") + +[node name="ScatterItem" type="Node3D" parent="CreateInside/Poisson/PoissonFlat"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateInside/Poisson/PoissonFlat"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_gywyd") + +[node name="CreateAlongEdge" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -20) + +[node name="Random" type="Marker3D" parent="CreateAlongEdge"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, 0) + +[node name="EdgeRandom" type="Node3D" parent="CreateAlongEdge/Random"] +transform = Transform3D(0.980584, 0.1961, 0, -0.193582, 0.967992, -0.159743, -0.0313257, 0.156642, 0.987159, 0, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_syjiv") + +[node name="ScatterItem" type="Node3D" parent="CreateAlongEdge/Random/EdgeRandom"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape4" type="Node3D" parent="CreateAlongEdge/Random/EdgeRandom"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_eofyd") + +[node name="EdgeRandomAligned" type="Node3D" parent="CreateAlongEdge/Random"] +transform = Transform3D(0.980584, 0.1961, -4.76072e-09, -0.109104, 0.545565, -0.830936, -0.162947, 0.814802, 0.556368, 0, 0.876154, -3.21482) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_rrmii") + +[node name="ScatterItem" type="Node3D" parent="CreateAlongEdge/Random/EdgeRandomAligned"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape4" type="Node3D" parent="CreateAlongEdge/Random/EdgeRandomAligned"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_yleso") + +[node name="Even" type="Marker3D" parent="CreateAlongEdge"] + +[node name="EdgeEvenGlobal" type="Node3D" parent="CreateAlongEdge/Even"] +transform = Transform3D(0.813345, -0.581783, 0, 0.572633, 0.800553, -0.176655, 0.102775, 0.143682, 0.984273, 0, 0.434273, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_b1fel") + +[node name="ScatterItem" type="Node3D" parent="CreateAlongEdge/Even/EdgeEvenGlobal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateAlongEdge/Even/EdgeEvenGlobal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_1vjos") + +[node name="EdgeEvenAligned" type="Node3D" parent="CreateAlongEdge/Even"] +transform = Transform3D(0.9507, -0.310112, 0, 0.310112, 0.950699, 0, 0, 0, 0.999999, 0.72711, 0.89757, -3.66937) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_i6uqa") + +[node name="ScatterItem" type="Node3D" parent="CreateAlongEdge/Even/EdgeEvenAligned"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateAlongEdge/Even/EdgeEvenAligned"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_jrwst") + +[node name="Continuous" type="Marker3D" parent="CreateAlongEdge"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0) + +[node name="EdgeContinuous" type="Node3D" parent="CreateAlongEdge/Continuous"] +transform = Transform3D(0.983496, 0.180931, 0, -0.180931, 0.983496, 0, 0, 0, 1, 0.864534, 0.35345, -0.100313) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_uox5l") + +[node name="ScatterItem" type="Node3D" parent="CreateAlongEdge/Continuous/EdgeContinuous"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="CreateAlongEdge/Continuous/EdgeContinuous"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_1fk1d") + +[node name="ScatterShape2" type="Node3D" parent="CreateAlongEdge/Continuous/EdgeContinuous"] +transform = Transform3D(0.154969, 0, 0.987919, 0, 1, 0, -0.987919, 0, 0.154969, -0.0216227, -7.15256e-07, -1.22508) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_07emv") + +[node name="Array" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -6) + +[node name="ProtonScatter" type="Node3D" parent="Array"] +transform = Transform3D(0.86654, 0.499108, 0, -0.499108, 0.86654, 0, 0, 0, 1, -0.499108, 0.32282, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_f6tel") + +[node name="ScatterItem" type="Node3D" parent="Array/ProtonScatter"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="SingleItem" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, -20) + +[node name="SingleLocal" type="Node3D" parent="SingleItem"] +transform = Transform3D(0.379283, -0.0572998, -0.923505, 0.892876, 0.284492, 0.349051, 0.24273, -0.956965, 0.159065, 0, 0, -2) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ec8t1") + +[node name="ScatterItem" type="Node3D" parent="SingleItem/SingleLocal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="SingleGlobal" type="Node3D" parent="SingleItem"] +transform = Transform3D(0.837785, -0.49706, 0.225938, 0.429222, 0.855328, 0.290142, -0.337469, -0.146099, 0.92993, 0, 1.46238, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_mmyxv") + +[node name="ScatterItem" type="Node3D" parent="SingleItem/SingleGlobal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="Clusterize" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, -4) + +[node name="ClustertizeScale" type="Node3D" parent="Clusterize"] +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_1qaw8") + +[node name="ScatterItem" type="Node3D" parent="Clusterize/ClustertizeScale"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Clusterize/ClustertizeScale"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_a5k4o") + +[node name="ClustertizeFilterOnly" type="Node3D" parent="Clusterize"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_lgfwt") + +[node name="ScatterItem" type="Node3D" parent="Clusterize/ClustertizeFilterOnly"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Clusterize/ClustertizeFilterOnly"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_y5kok") + +[node name="LookAt" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19, 0, -3) + +[node name="LookAtGlobal" type="Node3D" parent="LookAt"] +transform = Transform3D(0.633165, 0.774017, 0, -0.774017, 0.633165, 0, 0, 0, 1, 0, 1, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_1jtvd") + +[node name="ScatterItem" type="Node3D" parent="LookAt/LookAtGlobal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="LookAt/LookAtGlobal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_cf36a") + +[node name="LookAtLocal" type="Node3D" parent="LookAt"] +transform = Transform3D(0.633165, 0.774017, 0, -0.774017, 0.633165, 0, 0, 0, 1, 3, 1, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_osg78") + +[node name="ScatterItem" type="Node3D" parent="LookAt/LookAtLocal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="LookAt/LookAtLocal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_m5v8r") + +[node name="Edit" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 0, -14) + +[node name="Position" type="Marker3D" parent="Edit"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, 0) + +[node name="PositionOverride" type="Node3D" parent="Edit/Position"] +transform = Transform3D(0.991119, 0.132978, -0.000208908, -0.129832, 0.967331, -0.217751, -0.0287538, 0.215845, 0.976004, 0, 0.776395, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ggowg") + +[node name="ScatterItem" type="Node3D" parent="Edit/Position/PositionOverride"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Edit/Position/PositionOverride"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_b0fis") + +[node name="PositionOffset" type="Node3D" parent="Edit/Position"] +transform = Transform3D(0.600074, 0.784618, -0.15584, -0.799427, 0.581195, -0.152084, -0.0287538, 0.215845, 0.976004, 0, 0.776395, 2) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_4d70d") + +[node name="ScatterItem" type="Node3D" parent="Edit/Position/PositionOffset"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Edit/Position/PositionOffset"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_kebi0") + +[node name="PositionMultiply" type="Node3D" parent="Edit/Position"] +transform = Transform3D(0.0734645, 0.937927, -0.338966, 0.698269, 0.194297, 0.688962, 0.712055, -0.287305, -0.64065, 0, 0.776395, -2.26686) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_j0g8b") + +[node name="ScatterItem" type="Node3D" parent="Edit/Position/PositionMultiply"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Edit/Position/PositionMultiply"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_f2qcq") + +[node name="Rotation" type="Marker3D" parent="Edit"] + +[node name="ProtonScatter" type="Node3D" parent="Edit/Rotation"] +transform = Transform3D(0.914149, 0.234926, 0.330366, -0.15162, 0.953952, -0.258819, -0.375957, 0.186509, 0.907673, 0, 1.44124, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ojwb1") + +[node name="ScatterItem" type="Node3D" parent="Edit/Rotation/ProtonScatter"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Edit/Rotation/ProtonScatter"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_hp05y") + +[node name="Scale" type="Marker3D" parent="Edit"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0) + +[node name="EditScale" type="Node3D" parent="Edit/Scale"] +transform = Transform3D(-0.542174, -0.339362, 0.768688, 0.430169, -0.897943, -0.093017, 0.721805, 0.280235, 0.632824, 0, 1.60134, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ndd04") + +[node name="ScatterItem" type="Node3D" parent="Edit/Scale/EditScale"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Edit/Scale/EditScale"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_n0ty0") + +[node name="ProjectOnCollider" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -11) + +[node name="CSGSphere3D" type="CSGSphere3D" parent="ProjectOnCollider"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.990063, 0) +use_collision = true +radius = 1.85822 +radial_segments = 20 +rings = 12 + +[node name="ProjectAlign" type="Node3D" parent="ProjectOnCollider"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.07597, 0.67288, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_tml5i") + +[node name="ScatterItem" type="Node3D" parent="ProjectOnCollider/ProjectAlign"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="ProjectOnCollider/ProjectAlign"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_vq7kx") + +[node name="ProjectKeepOnMiss" type="Node3D" parent="ProjectOnCollider"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.70408, 0.67288, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_5wv3k") + +[node name="ScatterItem" type="Node3D" parent="ProjectOnCollider/ProjectKeepOnMiss"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="ProjectOnCollider/ProjectKeepOnMiss"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_nwkwt") + +[node name="ProjectRemoveOnMiss" type="Node3D" parent="ProjectOnCollider"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.01292, 0.67288, 3.00432) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_wcnr2") + +[node name="ScatterItem" type="Node3D" parent="ProjectOnCollider/ProjectRemoveOnMiss"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="ProjectOnCollider/ProjectRemoveOnMiss"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_h12gh") + +[node name="ProjectLocal" type="Node3D" parent="ProjectOnCollider"] +transform = Transform3D(0.959531, 0.281605, 0, -0.139156, 0.474156, -0.869374, -0.24482, 0.834191, 0.494154, -0.592215, 0.580088, 3.27421) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_p6kkt") + +[node name="ScatterItem" type="Node3D" parent="ProjectOnCollider/ProjectLocal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="ProjectOnCollider/ProjectLocal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_5ddch") + +[node name="ProjectIndividual" type="Node3D" parent="ProjectOnCollider"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.58267, 0.580088, 4.82817) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_66aqb") + +[node name="ScatterItem" type="Node3D" parent="ProjectOnCollider/ProjectIndividual"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="ProjectOnCollider/ProjectIndividual"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_phfha") + +[node name="Proxy" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, -9) + +[node name="Source" type="Node3D" parent="Proxy"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_xxh5g") + +[node name="ScatterItem" type="Node3D" parent="Proxy/Source"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Proxy/Source"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_eifot") + +[node name="Proxy" type="Node3D" parent="Proxy"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_u7eis") + +[node name="ScatterItem" type="Node3D" parent="Proxy/Proxy"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Proxy/Proxy"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_wowj4") + +[node name="ProxyWithExtras" type="Node3D" parent="Proxy"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_d7vu4") + +[node name="ScatterItem" type="Node3D" parent="Proxy/ProxyWithExtras"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Proxy/ProxyWithExtras"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_82ud0") + +[node name="RandomizeTransforms" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18, 0, -8) + +[node name="RandomizeGlobal" type="Node3D" parent="RandomizeTransforms"] +transform = Transform3D(0.966007, 0.230774, 0.116509, -0.204648, 0.958019, -0.200794, -0.157955, 0.170125, 0.972681, -4, 1.33719, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_7up6y") + +[node name="ScatterItem" type="Node3D" parent="RandomizeTransforms/RandomizeGlobal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="RandomizeTransforms/RandomizeGlobal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_7kw48") + +[node name="RandomizeLocal" type="Node3D" parent="RandomizeTransforms"] +transform = Transform3D(0.834487, -0.503621, 0.223599, 0.527903, 0.847008, -0.0624175, -0.157955, 0.170125, 0.972681, 1, 1.97163, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_c2lcy") + +[node name="ScatterItem" type="Node3D" parent="RandomizeTransforms/RandomizeLocal"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="RandomizeTransforms/RandomizeLocal"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_8al8a") + +[node name="RandomizeIndividual" type="Node3D" parent="RandomizeTransforms"] +transform = Transform3D(0.706801, 0.707356, -0.00893999, -0.689552, 0.68608, -0.231976, -0.157955, 0.170125, 0.972681, 5, 0.945867, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_t34ex") + +[node name="ScatterItem" type="Node3D" parent="RandomizeTransforms/RandomizeIndividual"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="RandomizeTransforms/RandomizeIndividual"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_c5k2f") + +[node name="Snap" type="Marker3D" parent="."] + +[node name="Relax" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 0, -14) + +[node name="RelaxRestrict" type="Node3D" parent="Relax"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.374658, 1.02338, 0.424611) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ncnfw") + +[node name="ScatterItem" type="Node3D" parent="Relax/RelaxRestrict"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Relax/RelaxRestrict"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_pnh7s") + +[node name="RelaxFull" type="Node3D" parent="Relax"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 1.02338, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_1wqmj") + +[node name="ScatterItem" type="Node3D" parent="Relax/RelaxFull"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Relax/RelaxFull"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_lsc8o") + +[node name="RemoveOutside" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11, 0, -20) + +[node name="RemoveOutside" type="Node3D" parent="RemoveOutside"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.58539, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_rh222") + +[node name="ScatterItem" type="Node3D" parent="RemoveOutside/RemoveOutside"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="RemoveOutside/RemoveOutside"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_nnf16") + +[node name="RemoveNegativeOnly" type="Node3D" parent="RemoveOutside"] +transform = Transform3D(0.906404, 0, 0.422413, 0, 1, 0, -0.422413, 0, 0.906404, -6, 1.58539, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_thdr8") + +[node name="ScatterItem" type="Node3D" parent="RemoveOutside/RemoveNegativeOnly"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="RemoveOutside/RemoveNegativeOnly"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_t87ux") + +[node name="NegativeShape" type="Node3D" parent="RemoveOutside/RemoveNegativeOnly"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, -0.328114, 0, -1.96997) +script = ExtResource("5_y7d7p") +negative = true +shape = SubResource("Resource_hu6l0") + +[node name="Shapes" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 19, 0, -22) + +[node name="Sphere" type="Node3D" parent="Shapes"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0.996649, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_nvyeo") + +[node name="ScatterItem" type="Node3D" parent="Shapes/Sphere"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Shapes/Sphere"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_t1kde") + +[node name="Box" type="Node3D" parent="Shapes"] +transform = Transform3D(1, 0, 0, 0, 0.849488, -0.527608, 0, 0.527608, 0.849488, 0, 0.946816, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_cidgu") + +[node name="ScatterItem" type="Node3D" parent="Shapes/Box"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Shapes/Box"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_4qlye") + +[node name="Path" type="Node3D" parent="Shapes"] +transform = Transform3D(1, 0, 0, 0, 0.849488, -0.527608, 0, 0.527608, 0.849488, 3.41702, 0.946816, 0) +script = ExtResource("1_hld6g") +modifier_stack = SubResource("Resource_ywyj6") + +[node name="ScatterItem" type="Node3D" parent="Shapes/Path"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Shapes/Path"] +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_acfig") + +[node name="Particles" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 2) + +[node name="Standard" type="Node3D" parent="Particles"] +script = ExtResource("1_hld6g") +render_mode = 2 +modifier_stack = SubResource("Resource_yl5xk") + +[node name="ScatterItem" type="Node3D" parent="Particles/Standard"] +script = ExtResource("4_w0gix") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Particles/Standard"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_x5d01") + +[node name="OverrideProcess" type="Node3D" parent="Particles"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5, 0, 0) +script = ExtResource("1_hld6g") +render_mode = 2 +modifier_stack = SubResource("Resource_gavpu") + +[node name="ScatterItem" type="Node3D" parent="Particles/OverrideProcess"] +script = ExtResource("4_w0gix") +override_process_material = SubResource("ShaderMaterial_7sbin") +path = "res://addons/proton_scatter/demos/assets/brick.tscn" + +[node name="ScatterShape" type="Node3D" parent="Particles/OverrideProcess"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +script = ExtResource("5_y7d7p") +shape = SubResource("Resource_o7cnt") diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..db911e4 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvhc8oppa2g5y" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/meshes/village/Balcony_Cross_Corner.bin b/meshes/village/Balcony_Cross_Corner.bin new file mode 100644 index 0000000..aabfcee Binary files /dev/null and b/meshes/village/Balcony_Cross_Corner.bin differ diff --git a/meshes/village/Balcony_Cross_Corner.gltf b/meshes/village/Balcony_Cross_Corner.gltf new file mode 100644 index 0000000..8903152 --- /dev/null +++ b/meshes/village/Balcony_Cross_Corner.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Balcony_Cross_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.106", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":504, + "max":[ + 1.1042536497116089, + 1.1247994899749756, + 1.0000007152557373 + ], + "min":[ + -1.0000001192092896, + -0.10508715361356735, + -1.1042532920837402 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":504, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":504, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":792, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6048, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6048, + "byteOffset":6048, + "target":34962 + }, + { + "buffer":0, + "byteLength":4032, + "byteOffset":12096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1584, + "byteOffset":16128, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17712, + "uri":"Balcony_Cross_Corner.bin" + } + ] +} diff --git a/meshes/village/Balcony_Cross_Corner.gltf.import b/meshes/village/Balcony_Cross_Corner.gltf.import new file mode 100644 index 0000000..f661ba6 --- /dev/null +++ b/meshes/village/Balcony_Cross_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://benrhdffgfyan" +path="res://.godot/imported/Balcony_Cross_Corner.gltf-9a522bfb208ca12c58ce08a99b2f4fe1.scn" + +[deps] + +source_file="res://meshes/village/Balcony_Cross_Corner.gltf" +dest_files=["res://.godot/imported/Balcony_Cross_Corner.gltf-9a522bfb208ca12c58ce08a99b2f4fe1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Balcony_Cross_Straight.bin b/meshes/village/Balcony_Cross_Straight.bin new file mode 100644 index 0000000..ff618ef Binary files /dev/null and b/meshes/village/Balcony_Cross_Straight.bin differ diff --git a/meshes/village/Balcony_Cross_Straight.gltf b/meshes/village/Balcony_Cross_Straight.gltf new file mode 100644 index 0000000..26bd75d --- /dev/null +++ b/meshes/village/Balcony_Cross_Straight.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Balcony_Cross_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.111", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":252, + "max":[ + 1.0000003576278687, + 1.1247994899749756, + 1.1042530536651611 + ], + "min":[ + -1.0000003576278687, + -0.10508717596530914, + 0.8979700207710266 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":252, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":252, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":396, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3024, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3024, + "byteOffset":3024, + "target":34962 + }, + { + "buffer":0, + "byteLength":2016, + "byteOffset":6048, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":8064, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8856, + "uri":"Balcony_Cross_Straight.bin" + } + ] +} diff --git a/meshes/village/Balcony_Cross_Straight.gltf.import b/meshes/village/Balcony_Cross_Straight.gltf.import new file mode 100644 index 0000000..a40ba3e --- /dev/null +++ b/meshes/village/Balcony_Cross_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bpmkk8h5ckfu3" +path="res://.godot/imported/Balcony_Cross_Straight.gltf-90cd07a2ad8bf0ef856063518a8a3c0b.scn" + +[deps] + +source_file="res://meshes/village/Balcony_Cross_Straight.gltf" +dest_files=["res://.godot/imported/Balcony_Cross_Straight.gltf-90cd07a2ad8bf0ef856063518a8a3c0b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Balcony_Simple_Corner.bin b/meshes/village/Balcony_Simple_Corner.bin new file mode 100644 index 0000000..a0dba28 Binary files /dev/null and b/meshes/village/Balcony_Simple_Corner.bin differ diff --git a/meshes/village/Balcony_Simple_Corner.gltf b/meshes/village/Balcony_Simple_Corner.gltf new file mode 100644 index 0000000..20a727e --- /dev/null +++ b/meshes/village/Balcony_Simple_Corner.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Balcony_Simple_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.113", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":3456, + "max":[ + 1.1042536497116089, + 1.1247994899749756, + 1.0000005960464478 + ], + "min":[ + -0.9999997615814209, + -0.10508715361356735, + -1.1042532920837402 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":3456, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":3456, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":6720, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":41472, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":41472, + "byteOffset":41472, + "target":34962 + }, + { + "buffer":0, + "byteLength":27648, + "byteOffset":82944, + "target":34962 + }, + { + "buffer":0, + "byteLength":13440, + "byteOffset":110592, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":124032, + "uri":"Balcony_Simple_Corner.bin" + } + ] +} diff --git a/meshes/village/Balcony_Simple_Corner.gltf.import b/meshes/village/Balcony_Simple_Corner.gltf.import new file mode 100644 index 0000000..9f38f89 --- /dev/null +++ b/meshes/village/Balcony_Simple_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bc80opcydx0fs" +path="res://.godot/imported/Balcony_Simple_Corner.gltf-ffaf4b55165010ceb521b94d4580dce6.scn" + +[deps] + +source_file="res://meshes/village/Balcony_Simple_Corner.gltf" +dest_files=["res://.godot/imported/Balcony_Simple_Corner.gltf-ffaf4b55165010ceb521b94d4580dce6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Balcony_Simple_Straight.bin b/meshes/village/Balcony_Simple_Straight.bin new file mode 100644 index 0000000..ec9a086 Binary files /dev/null and b/meshes/village/Balcony_Simple_Straight.bin differ diff --git a/meshes/village/Balcony_Simple_Straight.gltf b/meshes/village/Balcony_Simple_Straight.gltf new file mode 100644 index 0000000..0a14c42 --- /dev/null +++ b/meshes/village/Balcony_Simple_Straight.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Balcony_Simple_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.076", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1728, + "max":[ + 1, + 1.1247994899749756, + 1.1042530536651611 + ], + "min":[ + -1.0000001192092896, + -0.10508717596530914, + 0.8979700207710266 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1728, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1728, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":3360, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":20736, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":20736, + "byteOffset":20736, + "target":34962 + }, + { + "buffer":0, + "byteLength":13824, + "byteOffset":41472, + "target":34962 + }, + { + "buffer":0, + "byteLength":6720, + "byteOffset":55296, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":62016, + "uri":"Balcony_Simple_Straight.bin" + } + ] +} diff --git a/meshes/village/Balcony_Simple_Straight.gltf.import b/meshes/village/Balcony_Simple_Straight.gltf.import new file mode 100644 index 0000000..0d4f1f3 --- /dev/null +++ b/meshes/village/Balcony_Simple_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cehdhfocv3rxc" +path="res://.godot/imported/Balcony_Simple_Straight.gltf-44e1c7a921535c2735a1c17b38e3fbac.scn" + +[deps] + +source_file="res://meshes/village/Balcony_Simple_Straight.gltf" +dest_files=["res://.godot/imported/Balcony_Simple_Straight.gltf-44e1c7a921535c2735a1c17b38e3fbac.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_ExteriorWide_Brick.bin b/meshes/village/Corner_ExteriorWide_Brick.bin new file mode 100644 index 0000000..1f5f5cf Binary files /dev/null and b/meshes/village/Corner_ExteriorWide_Brick.bin differ diff --git a/meshes/village/Corner_ExteriorWide_Brick.gltf b/meshes/village/Corner_ExteriorWide_Brick.gltf new file mode 100644 index 0000000..cc53a0b --- /dev/null +++ b/meshes/village/Corner_ExteriorWide_Brick.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_ExteriorWide_Brick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.018", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":2249, + "max":[ + 0.2224901169538498, + 3.0242919921875, + 0.5342104434967041 + ], + "min":[ + -0.4898150563240051, + -0.01851489581167698, + -0.22221100330352783 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":2249, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":2249, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":8646, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":26988, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":26988, + "byteOffset":26988, + "target":34962 + }, + { + "buffer":0, + "byteLength":17992, + "byteOffset":53976, + "target":34962 + }, + { + "buffer":0, + "byteLength":17292, + "byteOffset":71968, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":89260, + "uri":"Corner_ExteriorWide_Brick.bin" + } + ] +} diff --git a/meshes/village/Corner_ExteriorWide_Brick.gltf.import b/meshes/village/Corner_ExteriorWide_Brick.gltf.import new file mode 100644 index 0000000..612baf2 --- /dev/null +++ b/meshes/village/Corner_ExteriorWide_Brick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dkwbu6g2s2ey6" +path="res://.godot/imported/Corner_ExteriorWide_Brick.gltf-f698dd3a42469796447efd1526af99a1.scn" + +[deps] + +source_file="res://meshes/village/Corner_ExteriorWide_Brick.gltf" +dest_files=["res://.godot/imported/Corner_ExteriorWide_Brick.gltf-f698dd3a42469796447efd1526af99a1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_ExteriorWide_Wood.bin b/meshes/village/Corner_ExteriorWide_Wood.bin new file mode 100644 index 0000000..ac5b073 Binary files /dev/null and b/meshes/village/Corner_ExteriorWide_Wood.bin differ diff --git a/meshes/village/Corner_ExteriorWide_Wood.gltf b/meshes/village/Corner_ExteriorWide_Wood.gltf new file mode 100644 index 0000000..8c80de5 --- /dev/null +++ b/meshes/village/Corner_ExteriorWide_Wood.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_ExteriorWide_Wood" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.028", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":48, + "max":[ + 0.1452266424894333, + 2.999999761581421, + 0.16558900475502014 + ], + "min":[ + -0.14522837102413177, + -1.6249023815362307e-07, + -0.16558872163295746 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":48, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":48, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":108, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":576, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":1536, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1752, + "uri":"Corner_ExteriorWide_Wood.bin" + } + ] +} diff --git a/meshes/village/Corner_ExteriorWide_Wood.gltf.import b/meshes/village/Corner_ExteriorWide_Wood.gltf.import new file mode 100644 index 0000000..b108d9b --- /dev/null +++ b/meshes/village/Corner_ExteriorWide_Wood.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dl5gfap1imb6t" +path="res://.godot/imported/Corner_ExteriorWide_Wood.gltf-c37febbbeae6bc21aeb256524b55cabd.scn" + +[deps] + +source_file="res://meshes/village/Corner_ExteriorWide_Wood.gltf" +dest_files=["res://.godot/imported/Corner_ExteriorWide_Wood.gltf-c37febbbeae6bc21aeb256524b55cabd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Exterior_Brick.bin b/meshes/village/Corner_Exterior_Brick.bin new file mode 100644 index 0000000..93118d8 Binary files /dev/null and b/meshes/village/Corner_Exterior_Brick.bin differ diff --git a/meshes/village/Corner_Exterior_Brick.gltf b/meshes/village/Corner_Exterior_Brick.gltf new file mode 100644 index 0000000..5c763bb --- /dev/null +++ b/meshes/village/Corner_Exterior_Brick.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Exterior_Brick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.059", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":2424, + "max":[ + 0.17772896587848663, + 3.008535861968994, + 0.37669962644577026 + ], + "min":[ + -0.35294169187545776, + -0.007091104984283447, + -0.19913415610790253 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":2424, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":2424, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":9306, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":29088, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":29088, + "byteOffset":29088, + "target":34962 + }, + { + "buffer":0, + "byteLength":19392, + "byteOffset":58176, + "target":34962 + }, + { + "buffer":0, + "byteLength":18612, + "byteOffset":77568, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":96180, + "uri":"Corner_Exterior_Brick.bin" + } + ] +} diff --git a/meshes/village/Corner_Exterior_Brick.gltf.import b/meshes/village/Corner_Exterior_Brick.gltf.import new file mode 100644 index 0000000..3a21d76 --- /dev/null +++ b/meshes/village/Corner_Exterior_Brick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bn0v2shtv7m3l" +path="res://.godot/imported/Corner_Exterior_Brick.gltf-ac639a5726502d980bcfea1ea4b899ae.scn" + +[deps] + +source_file="res://meshes/village/Corner_Exterior_Brick.gltf" +dest_files=["res://.godot/imported/Corner_Exterior_Brick.gltf-ac639a5726502d980bcfea1ea4b899ae.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Exterior_TopDown.bin b/meshes/village/Corner_Exterior_TopDown.bin new file mode 100644 index 0000000..d382b68 Binary files /dev/null and b/meshes/village/Corner_Exterior_TopDown.bin differ diff --git a/meshes/village/Corner_Exterior_TopDown.gltf b/meshes/village/Corner_Exterior_TopDown.gltf new file mode 100644 index 0000000..1840e30 --- /dev/null +++ b/meshes/village/Corner_Exterior_TopDown.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Exterior_TopDown" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.012", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":34, + "max":[ + 0.0005377127090469003, + 3.11676287651062, + 0.0924467146396637 + ], + "min":[ + -0.0924462080001831, + 0.6495780944824219, + -0.0005376457702368498 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":34, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":408, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":408, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1088, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1184, + "uri":"Corner_Exterior_TopDown.bin" + } + ] +} diff --git a/meshes/village/Corner_Exterior_TopDown.gltf.import b/meshes/village/Corner_Exterior_TopDown.gltf.import new file mode 100644 index 0000000..5582b06 --- /dev/null +++ b/meshes/village/Corner_Exterior_TopDown.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dob2hxv2s68ok" +path="res://.godot/imported/Corner_Exterior_TopDown.gltf-84738f72a14acd1f29943388715f8af6.scn" + +[deps] + +source_file="res://meshes/village/Corner_Exterior_TopDown.gltf" +dest_files=["res://.godot/imported/Corner_Exterior_TopDown.gltf-84738f72a14acd1f29943388715f8af6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Exterior_TopOnly.bin b/meshes/village/Corner_Exterior_TopOnly.bin new file mode 100644 index 0000000..feb167d Binary files /dev/null and b/meshes/village/Corner_Exterior_TopOnly.bin differ diff --git a/meshes/village/Corner_Exterior_TopOnly.gltf b/meshes/village/Corner_Exterior_TopOnly.gltf new file mode 100644 index 0000000..1bd7f45 --- /dev/null +++ b/meshes/village/Corner_Exterior_TopOnly.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Exterior_TopOnly" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.022", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":18, + "max":[ + 0.0005377127090469003, + 3.116762638092041, + 0.09224539250135422 + ], + "min":[ + -0.09224499017000198, + 2.883235454559326, + -0.0005376457702368498 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":18, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":18, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":24, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":216, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":216, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":576, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":624, + "uri":"Corner_Exterior_TopOnly.bin" + } + ] +} diff --git a/meshes/village/Corner_Exterior_TopOnly.gltf.import b/meshes/village/Corner_Exterior_TopOnly.gltf.import new file mode 100644 index 0000000..0604134 --- /dev/null +++ b/meshes/village/Corner_Exterior_TopOnly.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://drlrtfh84ncmg" +path="res://.godot/imported/Corner_Exterior_TopOnly.gltf-b249bfcf194d14848a0907ebf27dd359.scn" + +[deps] + +source_file="res://meshes/village/Corner_Exterior_TopOnly.gltf" +dest_files=["res://.godot/imported/Corner_Exterior_TopOnly.gltf-b249bfcf194d14848a0907ebf27dd359.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Exterior_Wood.bin b/meshes/village/Corner_Exterior_Wood.bin new file mode 100644 index 0000000..2b8dd2d Binary files /dev/null and b/meshes/village/Corner_Exterior_Wood.bin differ diff --git a/meshes/village/Corner_Exterior_Wood.gltf b/meshes/village/Corner_Exterior_Wood.gltf new file mode 100644 index 0000000..05a024f --- /dev/null +++ b/meshes/village/Corner_Exterior_Wood.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Exterior_Wood" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.023", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 0.10508709400892258, + 2.999999761581421, + 0.11982007324695587 + ], + "min":[ + -0.10508733242750168, + -1.5052728485898115e-07, + -0.11982005089521408 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"Corner_Exterior_Wood.bin" + } + ] +} diff --git a/meshes/village/Corner_Exterior_Wood.gltf.import b/meshes/village/Corner_Exterior_Wood.gltf.import new file mode 100644 index 0000000..e0b6fe6 --- /dev/null +++ b/meshes/village/Corner_Exterior_Wood.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ctoe5bqll4gii" +path="res://.godot/imported/Corner_Exterior_Wood.gltf-7fc7a161acc1791828e5b7c9946e1a02.scn" + +[deps] + +source_file="res://meshes/village/Corner_Exterior_Wood.gltf" +dest_files=["res://.godot/imported/Corner_Exterior_Wood.gltf-7fc7a161acc1791828e5b7c9946e1a02.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Interior_Big.bin b/meshes/village/Corner_Interior_Big.bin new file mode 100644 index 0000000..886d061 Binary files /dev/null and b/meshes/village/Corner_Interior_Big.bin differ diff --git a/meshes/village/Corner_Interior_Big.gltf b/meshes/village/Corner_Interior_Big.gltf new file mode 100644 index 0000000..870c3a1 --- /dev/null +++ b/meshes/village/Corner_Interior_Big.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Interior_Big" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.087", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 0.323878675699234, + 2.999999761581421, + 0.044233668595552444 + ], + "min":[ + -0.009263996034860611, + -1.1920928955078125e-07, + -0.32389143109321594 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":72, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":1152, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1296, + "uri":"Corner_Interior_Big.bin" + } + ] +} diff --git a/meshes/village/Corner_Interior_Big.gltf.import b/meshes/village/Corner_Interior_Big.gltf.import new file mode 100644 index 0000000..ebb470c --- /dev/null +++ b/meshes/village/Corner_Interior_Big.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cke025vkbmf02" +path="res://.godot/imported/Corner_Interior_Big.gltf-fbbf830e8ffb735fc3ab7f149e304ca4.scn" + +[deps] + +source_file="res://meshes/village/Corner_Interior_Big.gltf" +dest_files=["res://.godot/imported/Corner_Interior_Big.gltf-fbbf830e8ffb735fc3ab7f149e304ca4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Corner_Interior_Small.bin b/meshes/village/Corner_Interior_Small.bin new file mode 100644 index 0000000..d48bf39 Binary files /dev/null and b/meshes/village/Corner_Interior_Small.bin differ diff --git a/meshes/village/Corner_Interior_Small.gltf b/meshes/village/Corner_Interior_Small.gltf new file mode 100644 index 0000000..35bdc19 --- /dev/null +++ b/meshes/village/Corner_Interior_Small.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Corner_Interior_Small" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.091", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 0.40508711338043213, + 2.999999761581421, + -0.18017993867397308 + ], + "min":[ + 0.19491267204284668, + -1.5052728485898115e-07, + -0.41982007026672363 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"Corner_Interior_Small.bin" + } + ] +} diff --git a/meshes/village/Corner_Interior_Small.gltf.import b/meshes/village/Corner_Interior_Small.gltf.import new file mode 100644 index 0000000..737e5d8 --- /dev/null +++ b/meshes/village/Corner_Interior_Small.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://di0splvet24bj" +path="res://.godot/imported/Corner_Interior_Small.gltf-2e90e656711b0f27ba9adb6846263746.scn" + +[deps] + +source_file="res://meshes/village/Corner_Interior_Small.gltf" +dest_files=["res://.godot/imported/Corner_Interior_Small.gltf-2e90e656711b0f27ba9adb6846263746.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/DoorFrame_Flat_Brick.bin b/meshes/village/DoorFrame_Flat_Brick.bin new file mode 100644 index 0000000..9df31f0 Binary files /dev/null and b/meshes/village/DoorFrame_Flat_Brick.bin differ diff --git a/meshes/village/DoorFrame_Flat_Brick.gltf b/meshes/village/DoorFrame_Flat_Brick.gltf new file mode 100644 index 0000000..1561dba --- /dev/null +++ b/meshes/village/DoorFrame_Flat_Brick.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"DoorFrame_Flat_Brick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.014", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1489, + "max":[ + 0.7864019870758057, + 2.3739662170410156, + 0.19919343292713165 + ], + "min":[ + -0.7882055044174194, + -0.0016925190575420856, + -0.2951337397098541 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1489, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1489, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":5640, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":17868, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":17868, + "byteOffset":17868, + "target":34962 + }, + { + "buffer":0, + "byteLength":11912, + "byteOffset":35736, + "target":34962 + }, + { + "buffer":0, + "byteLength":11280, + "byteOffset":47648, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":58928, + "uri":"DoorFrame_Flat_Brick.bin" + } + ] +} diff --git a/meshes/village/DoorFrame_Flat_Brick.gltf.import b/meshes/village/DoorFrame_Flat_Brick.gltf.import new file mode 100644 index 0000000..389ebff --- /dev/null +++ b/meshes/village/DoorFrame_Flat_Brick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cf6uaket4a45o" +path="res://.godot/imported/DoorFrame_Flat_Brick.gltf-246a3af3d345ac2294df49b3d74a65f0.scn" + +[deps] + +source_file="res://meshes/village/DoorFrame_Flat_Brick.gltf" +dest_files=["res://.godot/imported/DoorFrame_Flat_Brick.gltf-246a3af3d345ac2294df49b3d74a65f0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/DoorFrame_Flat_WoodDark.bin b/meshes/village/DoorFrame_Flat_WoodDark.bin new file mode 100644 index 0000000..0b5bcd1 Binary files /dev/null and b/meshes/village/DoorFrame_Flat_WoodDark.bin differ diff --git a/meshes/village/DoorFrame_Flat_WoodDark.gltf b/meshes/village/DoorFrame_Flat_WoodDark.gltf new file mode 100644 index 0000000..ac8f44a --- /dev/null +++ b/meshes/village/DoorFrame_Flat_WoodDark.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"DoorFrame_Flat_WoodDark" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.034", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":108, + "max":[ + 0.7877825498580933, + 2.3037145137786865, + 0.14516234397888184 + ], + "min":[ + -0.7862095236778259, + -0.008544828742742538, + -0.24328981339931488 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":108, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":108, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1296, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1296, + "byteOffset":1296, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":2592, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":3456, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3792, + "uri":"DoorFrame_Flat_WoodDark.bin" + } + ] +} diff --git a/meshes/village/DoorFrame_Flat_WoodDark.gltf.import b/meshes/village/DoorFrame_Flat_WoodDark.gltf.import new file mode 100644 index 0000000..c6473cc --- /dev/null +++ b/meshes/village/DoorFrame_Flat_WoodDark.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bx6wi4ctmugb7" +path="res://.godot/imported/DoorFrame_Flat_WoodDark.gltf-08d72b3f31f5f054a91245676831d9e9.scn" + +[deps] + +source_file="res://meshes/village/DoorFrame_Flat_WoodDark.gltf" +dest_files=["res://.godot/imported/DoorFrame_Flat_WoodDark.gltf-08d72b3f31f5f054a91245676831d9e9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/DoorFrame_Round_Brick.bin b/meshes/village/DoorFrame_Round_Brick.bin new file mode 100644 index 0000000..7fd2257 Binary files /dev/null and b/meshes/village/DoorFrame_Round_Brick.bin differ diff --git a/meshes/village/DoorFrame_Round_Brick.gltf b/meshes/village/DoorFrame_Round_Brick.gltf new file mode 100644 index 0000000..b6d9f5f --- /dev/null +++ b/meshes/village/DoorFrame_Round_Brick.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"DoorFrame_Round_Brick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.007", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1616, + "max":[ + 0.7990041375160217, + 2.5844788551330566, + 0.18203623592853546 + ], + "min":[ + -0.804115891456604, + -0.0016925190575420856, + -0.2951337397098541 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1616, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1616, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":6138, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19392, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19392, + "byteOffset":19392, + "target":34962 + }, + { + "buffer":0, + "byteLength":12928, + "byteOffset":38784, + "target":34962 + }, + { + "buffer":0, + "byteLength":12276, + "byteOffset":51712, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":63988, + "uri":"DoorFrame_Round_Brick.bin" + } + ] +} diff --git a/meshes/village/DoorFrame_Round_Brick.gltf.import b/meshes/village/DoorFrame_Round_Brick.gltf.import new file mode 100644 index 0000000..72a9e2a --- /dev/null +++ b/meshes/village/DoorFrame_Round_Brick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://crhyu1e64jrrl" +path="res://.godot/imported/DoorFrame_Round_Brick.gltf-48386e8386c3cace8541e8f74b53d7d8.scn" + +[deps] + +source_file="res://meshes/village/DoorFrame_Round_Brick.gltf" +dest_files=["res://.godot/imported/DoorFrame_Round_Brick.gltf-48386e8386c3cace8541e8f74b53d7d8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/DoorFrame_Round_WoodDark.bin b/meshes/village/DoorFrame_Round_WoodDark.bin new file mode 100644 index 0000000..6bce6ae Binary files /dev/null and b/meshes/village/DoorFrame_Round_WoodDark.bin differ diff --git a/meshes/village/DoorFrame_Round_WoodDark.gltf b/meshes/village/DoorFrame_Round_WoodDark.gltf new file mode 100644 index 0000000..fa15b3c --- /dev/null +++ b/meshes/village/DoorFrame_Round_WoodDark.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"DoorFrame_Round_WoodDark" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.251", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":364, + "max":[ + 0.7034913897514343, + 2.5548486709594727, + 0.29893577098846436 + ], + "min":[ + -0.7034929394721985, + -0.008544921875, + -0.24002820253372192 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":364, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":364, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":960, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4368, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4368, + "byteOffset":4368, + "target":34962 + }, + { + "buffer":0, + "byteLength":2912, + "byteOffset":8736, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":11648, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13568, + "uri":"DoorFrame_Round_WoodDark.bin" + } + ] +} diff --git a/meshes/village/DoorFrame_Round_WoodDark.gltf.import b/meshes/village/DoorFrame_Round_WoodDark.gltf.import new file mode 100644 index 0000000..191e6ff --- /dev/null +++ b/meshes/village/DoorFrame_Round_WoodDark.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://berkexxyn3lq4" +path="res://.godot/imported/DoorFrame_Round_WoodDark.gltf-faa921da196a4f23ed0bb6158578b159.scn" + +[deps] + +source_file="res://meshes/village/DoorFrame_Round_WoodDark.gltf" +dest_files=["res://.godot/imported/DoorFrame_Round_WoodDark.gltf-faa921da196a4f23ed0bb6158578b159.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_1_Flat.bin b/meshes/village/Door_1_Flat.bin new file mode 100644 index 0000000..cffc206 Binary files /dev/null and b/meshes/village/Door_1_Flat.bin differ diff --git a/meshes/village/Door_1_Flat.gltf b/meshes/village/Door_1_Flat.gltf new file mode 100644 index 0000000..58911a2 --- /dev/null +++ b/meshes/village/Door_1_Flat.gltf @@ -0,0 +1,268 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_1_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.054", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":548, + "max":[ + 1.0716030597686768, + 2.1349449157714844, + 0.06314271688461304 + ], + "min":[ + -0.04626310616731644, + 0.0352252721786499, + -0.05755755677819252 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":548, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":548, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":548, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":894, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "max":[ + 0.8667700886726379, + 1.7645375728607178, + 0.0312458835542202 + ], + "min":[ + 0.1617247760295868, + 1.313861608505249, + 0.031245503574609756 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6576, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6576, + "byteOffset":6576, + "target":34962 + }, + { + "buffer":0, + "byteLength":4384, + "byteOffset":13152, + "target":34962 + }, + { + "buffer":0, + "byteLength":4384, + "byteOffset":17536, + "target":34962 + }, + { + "buffer":0, + "byteLength":1788, + "byteOffset":21920, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":23708, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":24044, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":24380, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":24604, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":24828, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":24924, + "uri":"Door_1_Flat.bin" + } + ] +} diff --git a/meshes/village/Door_1_Flat.gltf.import b/meshes/village/Door_1_Flat.gltf.import new file mode 100644 index 0000000..7d6fa12 --- /dev/null +++ b/meshes/village/Door_1_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://xtehtts6s6q6" +path="res://.godot/imported/Door_1_Flat.gltf-999211f2449ac5d99eb35879d6fe7ee1.scn" + +[deps] + +source_file="res://meshes/village/Door_1_Flat.gltf" +dest_files=["res://.godot/imported/Door_1_Flat.gltf-999211f2449ac5d99eb35879d6fe7ee1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_1_Round.bin b/meshes/village/Door_1_Round.bin new file mode 100644 index 0000000..25034a8 Binary files /dev/null and b/meshes/village/Door_1_Round.bin differ diff --git a/meshes/village/Door_1_Round.gltf b/meshes/village/Door_1_Round.gltf new file mode 100644 index 0000000..7802542 --- /dev/null +++ b/meshes/village/Door_1_Round.gltf @@ -0,0 +1,268 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_1_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.235", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":744, + "max":[ + 1.0737497806549072, + 2.3513262271881104, + 0.06314271688461304 + ], + "min":[ + -0.04626310616731644, + 0.033089637756347656, + -0.05755755677819252 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":744, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":744, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":744, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1362, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "max":[ + 0.8667700886726379, + 1.7624019384384155, + 0.0312458835542202 + ], + "min":[ + 0.1617247760295868, + 1.3117259740829468, + 0.031245503574609756 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":8928, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":8928, + "byteOffset":8928, + "target":34962 + }, + { + "buffer":0, + "byteLength":5952, + "byteOffset":17856, + "target":34962 + }, + { + "buffer":0, + "byteLength":5952, + "byteOffset":23808, + "target":34962 + }, + { + "buffer":0, + "byteLength":2724, + "byteOffset":29760, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":32484, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":32820, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":33156, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":33380, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":33604, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":33700, + "uri":"Door_1_Round.bin" + } + ] +} diff --git a/meshes/village/Door_1_Round.gltf.import b/meshes/village/Door_1_Round.gltf.import new file mode 100644 index 0000000..6191a3b --- /dev/null +++ b/meshes/village/Door_1_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cbdh0kc0cwtal" +path="res://.godot/imported/Door_1_Round.gltf-76c14ba85a982cbba89397e8fb0b7602.scn" + +[deps] + +source_file="res://meshes/village/Door_1_Round.gltf" +dest_files=["res://.godot/imported/Door_1_Round.gltf-76c14ba85a982cbba89397e8fb0b7602.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_2_Flat.bin b/meshes/village/Door_2_Flat.bin new file mode 100644 index 0000000..d0bb437 Binary files /dev/null and b/meshes/village/Door_2_Flat.bin differ diff --git a/meshes/village/Door_2_Flat.gltf b/meshes/village/Door_2_Flat.gltf new file mode 100644 index 0000000..f0c2679 --- /dev/null +++ b/meshes/village/Door_2_Flat.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_2_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.149", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":590, + "max":[ + 1.0711547136306763, + 2.1400604248046875, + 0.04973819851875305 + ], + "min":[ + -0.04266441613435745, + 0.03962576389312744, + -0.04973819851875305 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":590, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":590, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":590, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1404, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":3414, + "max":[ + 1.0376418828964233, + 2.0529885292053223, + 0.12721848487854004 + ], + "min":[ + 0.022681348025798798, + 0.3381759226322174, + -0.13368189334869385 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":3414, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":3414, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":3414, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":16692, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":7080, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":7080, + "byteOffset":7080, + "target":34962 + }, + { + "buffer":0, + "byteLength":4720, + "byteOffset":14160, + "target":34962 + }, + { + "buffer":0, + "byteLength":4720, + "byteOffset":18880, + "target":34962 + }, + { + "buffer":0, + "byteLength":2808, + "byteOffset":23600, + "target":34963 + }, + { + "buffer":0, + "byteLength":40968, + "byteOffset":26408, + "target":34962 + }, + { + "buffer":0, + "byteLength":40968, + "byteOffset":67376, + "target":34962 + }, + { + "buffer":0, + "byteLength":27312, + "byteOffset":108344, + "target":34962 + }, + { + "buffer":0, + "byteLength":27312, + "byteOffset":135656, + "target":34962 + }, + { + "buffer":0, + "byteLength":33384, + "byteOffset":162968, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":196352, + "uri":"Door_2_Flat.bin" + } + ] +} diff --git a/meshes/village/Door_2_Flat.gltf.import b/meshes/village/Door_2_Flat.gltf.import new file mode 100644 index 0000000..e35ef23 --- /dev/null +++ b/meshes/village/Door_2_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ba3qpi7bao7p2" +path="res://.godot/imported/Door_2_Flat.gltf-b28d8fc312246418b2369c6b9771edfc.scn" + +[deps] + +source_file="res://meshes/village/Door_2_Flat.gltf" +dest_files=["res://.godot/imported/Door_2_Flat.gltf-b28d8fc312246418b2369c6b9771edfc.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_2_Round.bin b/meshes/village/Door_2_Round.bin new file mode 100644 index 0000000..4d8369a Binary files /dev/null and b/meshes/village/Door_2_Round.bin differ diff --git a/meshes/village/Door_2_Round.gltf b/meshes/village/Door_2_Round.gltf new file mode 100644 index 0000000..98011c0 --- /dev/null +++ b/meshes/village/Door_2_Round.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_2_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.237", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":790, + "max":[ + 1.072784423828125, + 2.3558285236358643, + 0.04973819851875305 + ], + "min":[ + -0.04266441613435745, + 0.028338909149169922, + -0.04973819851875305 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":790, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":790, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":790, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1872, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":3546, + "max":[ + 1.0376418828964233, + 2.038383722305298, + 0.12721848487854004 + ], + "min":[ + 0.022681348025798798, + 0.3268890678882599, + -0.13368189334869385 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":3546, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":3546, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":3546, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":16692, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":9480, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":9480, + "byteOffset":9480, + "target":34962 + }, + { + "buffer":0, + "byteLength":6320, + "byteOffset":18960, + "target":34962 + }, + { + "buffer":0, + "byteLength":6320, + "byteOffset":25280, + "target":34962 + }, + { + "buffer":0, + "byteLength":3744, + "byteOffset":31600, + "target":34963 + }, + { + "buffer":0, + "byteLength":42552, + "byteOffset":35344, + "target":34962 + }, + { + "buffer":0, + "byteLength":42552, + "byteOffset":77896, + "target":34962 + }, + { + "buffer":0, + "byteLength":28368, + "byteOffset":120448, + "target":34962 + }, + { + "buffer":0, + "byteLength":28368, + "byteOffset":148816, + "target":34962 + }, + { + "buffer":0, + "byteLength":33384, + "byteOffset":177184, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":210568, + "uri":"Door_2_Round.bin" + } + ] +} diff --git a/meshes/village/Door_2_Round.gltf.import b/meshes/village/Door_2_Round.gltf.import new file mode 100644 index 0000000..a2ce5b5 --- /dev/null +++ b/meshes/village/Door_2_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cyw2lc8fqyejy" +path="res://.godot/imported/Door_2_Round.gltf-5208935ff653f1b070da8af43d70ed3f.scn" + +[deps] + +source_file="res://meshes/village/Door_2_Round.gltf" +dest_files=["res://.godot/imported/Door_2_Round.gltf-5208935ff653f1b070da8af43d70ed3f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_4_Flat.bin b/meshes/village/Door_4_Flat.bin new file mode 100644 index 0000000..e998036 Binary files /dev/null and b/meshes/village/Door_4_Flat.bin differ diff --git a/meshes/village/Door_4_Flat.gltf b/meshes/village/Door_4_Flat.gltf new file mode 100644 index 0000000..cd25ff2 --- /dev/null +++ b/meshes/village/Door_4_Flat.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_4_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.194", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":599, + "max":[ + 1.0716030597686768, + 2.127084732055664, + 0.06528931111097336 + ], + "min":[ + -0.04626310616731644, + 0.0352252721786499, + -0.06549837440252304 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":599, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":599, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":599, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1128, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":949, + "max":[ + 1.009713888168335, + 2.1072897911071777, + 0.09175863862037659 + ], + "min":[ + 0.0035822317004203796, + 0.1239590048789978, + -0.11758767068386078 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":949, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":949, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":949, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":2004, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":7188, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":7188, + "byteOffset":7188, + "target":34962 + }, + { + "buffer":0, + "byteLength":4792, + "byteOffset":14376, + "target":34962 + }, + { + "buffer":0, + "byteLength":4792, + "byteOffset":19168, + "target":34962 + }, + { + "buffer":0, + "byteLength":2256, + "byteOffset":23960, + "target":34963 + }, + { + "buffer":0, + "byteLength":11388, + "byteOffset":26216, + "target":34962 + }, + { + "buffer":0, + "byteLength":11388, + "byteOffset":37604, + "target":34962 + }, + { + "buffer":0, + "byteLength":7592, + "byteOffset":48992, + "target":34962 + }, + { + "buffer":0, + "byteLength":7592, + "byteOffset":56584, + "target":34962 + }, + { + "buffer":0, + "byteLength":4008, + "byteOffset":64176, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":68184, + "uri":"Door_4_Flat.bin" + } + ] +} diff --git a/meshes/village/Door_4_Flat.gltf.import b/meshes/village/Door_4_Flat.gltf.import new file mode 100644 index 0000000..0d029b1 --- /dev/null +++ b/meshes/village/Door_4_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b5v5ow5h8qeus" +path="res://.godot/imported/Door_4_Flat.gltf-1c77a1f59d3c51bb4c26515fa887d740.scn" + +[deps] + +source_file="res://meshes/village/Door_4_Flat.gltf" +dest_files=["res://.godot/imported/Door_4_Flat.gltf-1c77a1f59d3c51bb4c26515fa887d740.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_4_Round.bin b/meshes/village/Door_4_Round.bin new file mode 100644 index 0000000..37ec650 Binary files /dev/null and b/meshes/village/Door_4_Round.bin differ diff --git a/meshes/village/Door_4_Round.gltf b/meshes/village/Door_4_Round.gltf new file mode 100644 index 0000000..75b9780 --- /dev/null +++ b/meshes/village/Door_4_Round.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_4_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.195", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":788, + "max":[ + 1.0716030597686768, + 2.3558475971221924, + 0.06528931111097336 + ], + "min":[ + -0.043106503784656525, + 0.033089637756347656, + -0.06549837440252304 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":788, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":788, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":788, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1680, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":949, + "max":[ + 1.009713888168335, + 2.2858057022094727, + 0.09175863862037659 + ], + "min":[ + 0.0035822317004203796, + 0.1197616457939148, + -0.11758767068386078 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":949, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":949, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":949, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":2004, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":9456, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":9456, + "byteOffset":9456, + "target":34962 + }, + { + "buffer":0, + "byteLength":6304, + "byteOffset":18912, + "target":34962 + }, + { + "buffer":0, + "byteLength":6304, + "byteOffset":25216, + "target":34962 + }, + { + "buffer":0, + "byteLength":3360, + "byteOffset":31520, + "target":34963 + }, + { + "buffer":0, + "byteLength":11388, + "byteOffset":34880, + "target":34962 + }, + { + "buffer":0, + "byteLength":11388, + "byteOffset":46268, + "target":34962 + }, + { + "buffer":0, + "byteLength":7592, + "byteOffset":57656, + "target":34962 + }, + { + "buffer":0, + "byteLength":7592, + "byteOffset":65248, + "target":34962 + }, + { + "buffer":0, + "byteLength":4008, + "byteOffset":72840, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":76848, + "uri":"Door_4_Round.bin" + } + ] +} diff --git a/meshes/village/Door_4_Round.gltf.import b/meshes/village/Door_4_Round.gltf.import new file mode 100644 index 0000000..9cb8a76 --- /dev/null +++ b/meshes/village/Door_4_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://deham3mtk4wsp" +path="res://.godot/imported/Door_4_Round.gltf-ce1728c1cfe0a1e55160d2bdd99717ee.scn" + +[deps] + +source_file="res://meshes/village/Door_4_Round.gltf" +dest_files=["res://.godot/imported/Door_4_Round.gltf-ce1728c1cfe0a1e55160d2bdd99717ee.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_8_Flat.bin b/meshes/village/Door_8_Flat.bin new file mode 100644 index 0000000..25451b9 Binary files /dev/null and b/meshes/village/Door_8_Flat.bin differ diff --git a/meshes/village/Door_8_Flat.gltf b/meshes/village/Door_8_Flat.gltf new file mode 100644 index 0000000..c4a5edc --- /dev/null +++ b/meshes/village/Door_8_Flat.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_8_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.223", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":652, + "max":[ + 1.0716030597686768, + 2.134512424468994, + 0.05755815654993057 + ], + "min":[ + -0.04626310616731644, + 0.0352252721786499, + -0.05755755677819252 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":652, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":652, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":652, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":996, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":601, + "max":[ + 1.0157819986343384, + 1.2524888515472412, + 0.0917586237192154 + ], + "min":[ + 0.027867160737514496, + 0.07330965995788574, + -0.10770562291145325 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":601, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":601, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":601, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":1962, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":7824, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":7824, + "byteOffset":7824, + "target":34962 + }, + { + "buffer":0, + "byteLength":5216, + "byteOffset":15648, + "target":34962 + }, + { + "buffer":0, + "byteLength":5216, + "byteOffset":20864, + "target":34962 + }, + { + "buffer":0, + "byteLength":1992, + "byteOffset":26080, + "target":34963 + }, + { + "buffer":0, + "byteLength":7212, + "byteOffset":28072, + "target":34962 + }, + { + "buffer":0, + "byteLength":7212, + "byteOffset":35284, + "target":34962 + }, + { + "buffer":0, + "byteLength":4808, + "byteOffset":42496, + "target":34962 + }, + { + "buffer":0, + "byteLength":4808, + "byteOffset":47304, + "target":34962 + }, + { + "buffer":0, + "byteLength":3924, + "byteOffset":52112, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":56036, + "uri":"Door_8_Flat.bin" + } + ] +} diff --git a/meshes/village/Door_8_Flat.gltf.import b/meshes/village/Door_8_Flat.gltf.import new file mode 100644 index 0000000..81b3cec --- /dev/null +++ b/meshes/village/Door_8_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bxsqa5cgivbox" +path="res://.godot/imported/Door_8_Flat.gltf-9765541542553042cd860d68527fe406.scn" + +[deps] + +source_file="res://meshes/village/Door_8_Flat.gltf" +dest_files=["res://.godot/imported/Door_8_Flat.gltf-9765541542553042cd860d68527fe406.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Door_8_Round.bin b/meshes/village/Door_8_Round.bin new file mode 100644 index 0000000..772ddde Binary files /dev/null and b/meshes/village/Door_8_Round.bin differ diff --git a/meshes/village/Door_8_Round.gltf b/meshes/village/Door_8_Round.gltf new file mode 100644 index 0000000..3cdcea1 --- /dev/null +++ b/meshes/village/Door_8_Round.gltf @@ -0,0 +1,283 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Door_8_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":3 + }, + "metallicRoughnessTexture":{ + "index":4 + } + } + } + ], + "meshes":[ + { + "name":"Cube.250", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":848, + "max":[ + 1.0884466171264648, + 2.3571219444274902, + 0.05755815654993057 + ], + "min":[ + -0.06319592148065567, + 0.033089637756347656, + -0.05755755677819252 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":848, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":848, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":848, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1464, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":703, + "max":[ + 1.0157819986343384, + 1.250353217124939, + 0.0917586237192154 + ], + "min":[ + 0.027867160737514496, + 0.0711740255355835, + -0.10770562291145325 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":703, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":703, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":703, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":1962, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":10176, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":10176, + "byteOffset":10176, + "target":34962 + }, + { + "buffer":0, + "byteLength":6784, + "byteOffset":20352, + "target":34962 + }, + { + "buffer":0, + "byteLength":6784, + "byteOffset":27136, + "target":34962 + }, + { + "buffer":0, + "byteLength":2928, + "byteOffset":33920, + "target":34963 + }, + { + "buffer":0, + "byteLength":8436, + "byteOffset":36848, + "target":34962 + }, + { + "buffer":0, + "byteLength":8436, + "byteOffset":45284, + "target":34962 + }, + { + "buffer":0, + "byteLength":5624, + "byteOffset":53720, + "target":34962 + }, + { + "buffer":0, + "byteLength":5624, + "byteOffset":59344, + "target":34962 + }, + { + "buffer":0, + "byteLength":3924, + "byteOffset":64968, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":68892, + "uri":"Door_8_Round.bin" + } + ] +} diff --git a/meshes/village/Door_8_Round.gltf.import b/meshes/village/Door_8_Round.gltf.import new file mode 100644 index 0000000..ef5624c --- /dev/null +++ b/meshes/village/Door_8_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://db427w7dfyhno" +path="res://.godot/imported/Door_8_Round.gltf-f2589d42a858a3719bf3991c6d4073f3.scn" + +[deps] + +source_file="res://meshes/village/Door_8_Round.gltf" +dest_files=["res://.godot/imported/Door_8_Round.gltf-f2589d42a858a3719bf3991c6d4073f3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_Brick.bin b/meshes/village/Floor_Brick.bin new file mode 100644 index 0000000..3877a94 Binary files /dev/null and b/meshes/village/Floor_Brick.bin differ diff --git a/meshes/village/Floor_Brick.gltf b/meshes/village/Floor_Brick.gltf new file mode 100644 index 0000000..3116976 --- /dev/null +++ b/meshes/village/Floor_Brick.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_Brick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.004", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":96, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":256, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":280, + "uri":"Floor_Brick.bin" + } + ] +} diff --git a/meshes/village/Floor_Brick.gltf.import b/meshes/village/Floor_Brick.gltf.import new file mode 100644 index 0000000..061a772 --- /dev/null +++ b/meshes/village/Floor_Brick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://biwrs0ucyabsq" +path="res://.godot/imported/Floor_Brick.gltf-af0c4a1be514342d9dcae5d8671012c9.scn" + +[deps] + +source_file="res://meshes/village/Floor_Brick.gltf" +dest_files=["res://.godot/imported/Floor_Brick.gltf-af0c4a1be514342d9dcae5d8671012c9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_RedBrick.bin b/meshes/village/Floor_RedBrick.bin new file mode 100644 index 0000000..3877a94 Binary files /dev/null and b/meshes/village/Floor_RedBrick.bin differ diff --git a/meshes/village/Floor_RedBrick.gltf b/meshes/village/Floor_RedBrick.gltf new file mode 100644 index 0000000..35a1a17 --- /dev/null +++ b/meshes/village/Floor_RedBrick.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_RedBrick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RedBrick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RedBrick_BaseColor", + "uri":"T_RedBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":96, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":256, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":280, + "uri":"Floor_RedBrick.bin" + } + ] +} diff --git a/meshes/village/Floor_RedBrick.gltf.import b/meshes/village/Floor_RedBrick.gltf.import new file mode 100644 index 0000000..bb32c36 --- /dev/null +++ b/meshes/village/Floor_RedBrick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cbbmpao6rrin1" +path="res://.godot/imported/Floor_RedBrick.gltf-02d4ad7ad01ea05278fd882e74520fbd.scn" + +[deps] + +source_file="res://meshes/village/Floor_RedBrick.gltf" +dest_files=["res://.godot/imported/Floor_RedBrick.gltf-02d4ad7ad01ea05278fd882e74520fbd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_UnevenBrick.bin b/meshes/village/Floor_UnevenBrick.bin new file mode 100644 index 0000000..3877a94 Binary files /dev/null and b/meshes/village/Floor_UnevenBrick.bin differ diff --git a/meshes/village/Floor_UnevenBrick.gltf b/meshes/village/Floor_UnevenBrick.gltf new file mode 100644 index 0000000..7027051 --- /dev/null +++ b/meshes/village/Floor_UnevenBrick.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_UnevenBrick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.013", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":96, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":256, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":280, + "uri":"Floor_UnevenBrick.bin" + } + ] +} diff --git a/meshes/village/Floor_UnevenBrick.gltf.import b/meshes/village/Floor_UnevenBrick.gltf.import new file mode 100644 index 0000000..c71a8ae --- /dev/null +++ b/meshes/village/Floor_UnevenBrick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6cbgumvlxgq3" +path="res://.godot/imported/Floor_UnevenBrick.gltf-2e0b6ed28191d170bb0d864d1ecb7f6b.scn" + +[deps] + +source_file="res://meshes/village/Floor_UnevenBrick.gltf" +dest_files=["res://.godot/imported/Floor_UnevenBrick.gltf-2e0b6ed28191d170bb0d864d1ecb7f6b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark.bin b/meshes/village/Floor_WoodDark.bin new file mode 100644 index 0000000..8a86650 Binary files /dev/null and b/meshes/village/Floor_WoodDark.bin differ diff --git a/meshes/village/Floor_WoodDark.gltf b/meshes/village/Floor_WoodDark.gltf new file mode 100644 index 0000000..a8e842e --- /dev/null +++ b/meshes/village/Floor_WoodDark.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.032", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2048, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2240, + "uri":"Floor_WoodDark.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark.gltf.import b/meshes/village/Floor_WoodDark.gltf.import new file mode 100644 index 0000000..9223738 --- /dev/null +++ b/meshes/village/Floor_WoodDark.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6l5coaffjoia" +path="res://.godot/imported/Floor_WoodDark.gltf-bd40d71393f3cf3b34360ffeb2a760c2.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark.gltf-bd40d71393f3cf3b34360ffeb2a760c2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark_Half1.bin b/meshes/village/Floor_WoodDark_Half1.bin new file mode 100644 index 0000000..2cbc2b3 Binary files /dev/null and b/meshes/village/Floor_WoodDark_Half1.bin differ diff --git a/meshes/village/Floor_WoodDark_Half1.gltf b/meshes/village/Floor_WoodDark_Half1.gltf new file mode 100644 index 0000000..61b2370 --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half1.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark_Half1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.025", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":62, + "max":[ + 0, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":62, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":62, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":744, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":744, + "target":34962 + }, + { + "buffer":0, + "byteLength":496, + "byteOffset":1488, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1984, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2176, + "uri":"Floor_WoodDark_Half1.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark_Half1.gltf.import b/meshes/village/Floor_WoodDark_Half1.gltf.import new file mode 100644 index 0000000..67c84e1 --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://yigs5ai8ujll" +path="res://.godot/imported/Floor_WoodDark_Half1.gltf-c80cb9931d8dcd4a12413c7d10fdb717.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark_Half1.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark_Half1.gltf-c80cb9931d8dcd4a12413c7d10fdb717.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark_Half2.bin b/meshes/village/Floor_WoodDark_Half2.bin new file mode 100644 index 0000000..ad64283 Binary files /dev/null and b/meshes/village/Floor_WoodDark_Half2.bin differ diff --git a/meshes/village/Floor_WoodDark_Half2.gltf b/meshes/village/Floor_WoodDark_Half2.gltf new file mode 100644 index 0000000..13b8245 --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark_Half2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.036", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":62, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + 0, + -0.010000059381127357, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":62, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":62, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":744, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":744, + "target":34962 + }, + { + "buffer":0, + "byteLength":496, + "byteOffset":1488, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1984, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2176, + "uri":"Floor_WoodDark_Half2.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark_Half2.gltf.import b/meshes/village/Floor_WoodDark_Half2.gltf.import new file mode 100644 index 0000000..2afc3de --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://vnm68kbbowi0" +path="res://.godot/imported/Floor_WoodDark_Half2.gltf-c1295e152efdbfb3b08eb660b911ff95.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark_Half2.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark_Half2.gltf-c1295e152efdbfb3b08eb660b911ff95.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark_Half3.bin b/meshes/village/Floor_WoodDark_Half3.bin new file mode 100644 index 0000000..5948856 Binary files /dev/null and b/meshes/village/Floor_WoodDark_Half3.bin differ diff --git a/meshes/village/Floor_WoodDark_Half3.gltf b/meshes/village/Floor_WoodDark_Half3.gltf new file mode 100644 index 0000000..8fb23b9 --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half3.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark_Half3" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.037", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 1, + 0.009999990463256836, + 2.9976021664879227e-15 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"Floor_WoodDark_Half3.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark_Half3.gltf.import b/meshes/village/Floor_WoodDark_Half3.gltf.import new file mode 100644 index 0000000..4bebf98 --- /dev/null +++ b/meshes/village/Floor_WoodDark_Half3.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b3612u35hpe0i" +path="res://.godot/imported/Floor_WoodDark_Half3.gltf-182e9a810922f13bba433a3dab1ad3eb.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark_Half3.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark_Half3.gltf-182e9a810922f13bba433a3dab1ad3eb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark_OverhangCorner.bin b/meshes/village/Floor_WoodDark_OverhangCorner.bin new file mode 100644 index 0000000..36083b9 Binary files /dev/null and b/meshes/village/Floor_WoodDark_OverhangCorner.bin differ diff --git a/meshes/village/Floor_WoodDark_OverhangCorner.gltf b/meshes/village/Floor_WoodDark_OverhangCorner.gltf new file mode 100644 index 0000000..e937f9f --- /dev/null +++ b/meshes/village/Floor_WoodDark_OverhangCorner.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark_OverhangCorner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.069", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + -1.2709909569252886e-08, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000168345868587, + -0.7564597725868225 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"Floor_WoodDark_OverhangCorner.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark_OverhangCorner.gltf.import b/meshes/village/Floor_WoodDark_OverhangCorner.gltf.import new file mode 100644 index 0000000..55c09c5 --- /dev/null +++ b/meshes/village/Floor_WoodDark_OverhangCorner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://blb12by74hw5v" +path="res://.godot/imported/Floor_WoodDark_OverhangCorner.gltf-36c550e477a5c3984c4aaf88f51258a2.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark_OverhangCorner.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark_OverhangCorner.gltf-36c550e477a5c3984c4aaf88f51258a2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodDark_OverhangCorner2.bin b/meshes/village/Floor_WoodDark_OverhangCorner2.bin new file mode 100644 index 0000000..ec71735 Binary files /dev/null and b/meshes/village/Floor_WoodDark_OverhangCorner2.bin differ diff --git a/meshes/village/Floor_WoodDark_OverhangCorner2.gltf b/meshes/village/Floor_WoodDark_OverhangCorner2.gltf new file mode 100644 index 0000000..fae2382 --- /dev/null +++ b/meshes/village/Floor_WoodDark_OverhangCorner2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodDark_OverhangCorner2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.067", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":54, + "max":[ + -0.043352365493774414, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000367648899555, + -0.75 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":54, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":54, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":78, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":648, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":648, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1296, + "target":34962 + }, + { + "buffer":0, + "byteLength":156, + "byteOffset":1728, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1884, + "uri":"Floor_WoodDark_OverhangCorner2.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodDark_OverhangCorner2.gltf.import b/meshes/village/Floor_WoodDark_OverhangCorner2.gltf.import new file mode 100644 index 0000000..621882a --- /dev/null +++ b/meshes/village/Floor_WoodDark_OverhangCorner2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://wlfevqlecuab" +path="res://.godot/imported/Floor_WoodDark_OverhangCorner2.gltf-0f62445ce7e4517fbc35ea3f4f5c4cf0.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodDark_OverhangCorner2.gltf" +dest_files=["res://.godot/imported/Floor_WoodDark_OverhangCorner2.gltf-0f62445ce7e4517fbc35ea3f4f5c4cf0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodLight.bin b/meshes/village/Floor_WoodLight.bin new file mode 100644 index 0000000..bc6b980 Binary files /dev/null and b/meshes/village/Floor_WoodLight.bin differ diff --git a/meshes/village/Floor_WoodLight.gltf b/meshes/village/Floor_WoodLight.gltf new file mode 100644 index 0000000..eb02260 --- /dev/null +++ b/meshes/village/Floor_WoodLight.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodLight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.024", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000384412705898, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2048, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2240, + "uri":"Floor_WoodLight.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodLight.gltf.import b/meshes/village/Floor_WoodLight.gltf.import new file mode 100644 index 0000000..1382a0f --- /dev/null +++ b/meshes/village/Floor_WoodLight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c3fv7wek4rjjt" +path="res://.godot/imported/Floor_WoodLight.gltf-8445c1234a50a7238801b758d4222e31.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodLight.gltf" +dest_files=["res://.godot/imported/Floor_WoodLight.gltf-8445c1234a50a7238801b758d4222e31.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodLight_OverhangCorner.bin b/meshes/village/Floor_WoodLight_OverhangCorner.bin new file mode 100644 index 0000000..4deab0c Binary files /dev/null and b/meshes/village/Floor_WoodLight_OverhangCorner.bin differ diff --git a/meshes/village/Floor_WoodLight_OverhangCorner.gltf b/meshes/village/Floor_WoodLight_OverhangCorner.gltf new file mode 100644 index 0000000..11b5219 --- /dev/null +++ b/meshes/village/Floor_WoodLight_OverhangCorner.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodLight_OverhangCorner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.070", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + -1.2709909569252886e-08, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000168345868587, + -0.7564597725868225 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"Floor_WoodLight_OverhangCorner.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodLight_OverhangCorner.gltf.import b/meshes/village/Floor_WoodLight_OverhangCorner.gltf.import new file mode 100644 index 0000000..952f31c --- /dev/null +++ b/meshes/village/Floor_WoodLight_OverhangCorner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bstgdxo3vdcvd" +path="res://.godot/imported/Floor_WoodLight_OverhangCorner.gltf-3df02dc9afda829cc7a1da93e4b116de.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodLight_OverhangCorner.gltf" +dest_files=["res://.godot/imported/Floor_WoodLight_OverhangCorner.gltf-3df02dc9afda829cc7a1da93e4b116de.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Floor_WoodLight_OverhangCorner2.bin b/meshes/village/Floor_WoodLight_OverhangCorner2.bin new file mode 100644 index 0000000..17a4309 Binary files /dev/null and b/meshes/village/Floor_WoodLight_OverhangCorner2.bin differ diff --git a/meshes/village/Floor_WoodLight_OverhangCorner2.gltf b/meshes/village/Floor_WoodLight_OverhangCorner2.gltf new file mode 100644 index 0000000..7cb1f65 --- /dev/null +++ b/meshes/village/Floor_WoodLight_OverhangCorner2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Floor_WoodLight_OverhangCorner2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.068", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":54, + "max":[ + -0.043352365493774414, + 0.009999990463256836, + 1 + ], + "min":[ + -1, + -0.010000367648899555, + -0.75 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":54, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":54, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":78, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":648, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":648, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":1296, + "target":34962 + }, + { + "buffer":0, + "byteLength":156, + "byteOffset":1728, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1884, + "uri":"Floor_WoodLight_OverhangCorner2.bin" + } + ] +} diff --git a/meshes/village/Floor_WoodLight_OverhangCorner2.gltf.import b/meshes/village/Floor_WoodLight_OverhangCorner2.gltf.import new file mode 100644 index 0000000..71277a9 --- /dev/null +++ b/meshes/village/Floor_WoodLight_OverhangCorner2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c45w20kxwqm4j" +path="res://.godot/imported/Floor_WoodLight_OverhangCorner2.gltf-019683c72aa9b2ff67ef6bd4065deb7d.scn" + +[deps] + +source_file="res://meshes/village/Floor_WoodLight_OverhangCorner2.gltf" +dest_files=["res://.godot/imported/Floor_WoodLight_OverhangCorner2.gltf-019683c72aa9b2ff67ef6bd4065deb7d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/HoleCover_90Angle.bin b/meshes/village/HoleCover_90Angle.bin new file mode 100644 index 0000000..87e7d0d Binary files /dev/null and b/meshes/village/HoleCover_90Angle.bin differ diff --git a/meshes/village/HoleCover_90Angle.gltf b/meshes/village/HoleCover_90Angle.gltf new file mode 100644 index 0000000..29fb94c --- /dev/null +++ b/meshes/village/HoleCover_90Angle.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"HoleCover_90Angle" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.068", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":40, + "max":[ + 1.119820475578308, + 0.10508774220943451, + 1.0000001192092896 + ], + "min":[ + -1.0000001192092896, + -0.10508690029382706, + -1.119820475578308 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":40, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":40, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":60, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":480, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":480, + "target":34962 + }, + { + "buffer":0, + "byteLength":320, + "byteOffset":960, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":1280, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1400, + "uri":"HoleCover_90Angle.bin" + } + ] +} diff --git a/meshes/village/HoleCover_90Angle.gltf.import b/meshes/village/HoleCover_90Angle.gltf.import new file mode 100644 index 0000000..348d3f9 --- /dev/null +++ b/meshes/village/HoleCover_90Angle.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://g0p782042em5" +path="res://.godot/imported/HoleCover_90Angle.gltf-a1d7653328181609b8cfd0f43f522e7a.scn" + +[deps] + +source_file="res://meshes/village/HoleCover_90Angle.gltf" +dest_files=["res://.godot/imported/HoleCover_90Angle.gltf-a1d7653328181609b8cfd0f43f522e7a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/HoleCover_90Half.bin b/meshes/village/HoleCover_90Half.bin new file mode 100644 index 0000000..5a37b5d Binary files /dev/null and b/meshes/village/HoleCover_90Half.bin differ diff --git a/meshes/village/HoleCover_90Half.gltf b/meshes/village/HoleCover_90Half.gltf new file mode 100644 index 0000000..d2a54c7 --- /dev/null +++ b/meshes/village/HoleCover_90Half.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"HoleCover_90Half" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.071", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 1.1198203563690186, + 0.10508774220943451, + 3.466522002781858e-08 + ], + "min":[ + -2.901283266965038e-07, + -0.10508651286363602, + -1.119820475578308 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"HoleCover_90Half.bin" + } + ] +} diff --git a/meshes/village/HoleCover_90Half.gltf.import b/meshes/village/HoleCover_90Half.gltf.import new file mode 100644 index 0000000..3ae5f14 --- /dev/null +++ b/meshes/village/HoleCover_90Half.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bpybnwlxwmpi3" +path="res://.godot/imported/HoleCover_90Half.gltf-00ab770383fa8e2fa94336a168c2135b.scn" + +[deps] + +source_file="res://meshes/village/HoleCover_90Half.gltf" +dest_files=["res://.godot/imported/HoleCover_90Half.gltf-00ab770383fa8e2fa94336a168c2135b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/HoleCover_90Stairs.bin b/meshes/village/HoleCover_90Stairs.bin new file mode 100644 index 0000000..ca58ec3 Binary files /dev/null and b/meshes/village/HoleCover_90Stairs.bin differ diff --git a/meshes/village/HoleCover_90Stairs.gltf b/meshes/village/HoleCover_90Stairs.gltf new file mode 100644 index 0000000..4204855 --- /dev/null +++ b/meshes/village/HoleCover_90Stairs.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"HoleCover_90Stairs" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.082", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 1.119820475578308, + 0.10508774220943451, + 1.0000001192092896 + ], + "min":[ + 0.7956310510635376, + -0.10508690029382706, + -1.119820475578308 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1152, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1260, + "uri":"HoleCover_90Stairs.bin" + } + ] +} diff --git a/meshes/village/HoleCover_90Stairs.gltf.import b/meshes/village/HoleCover_90Stairs.gltf.import new file mode 100644 index 0000000..d21ea42 --- /dev/null +++ b/meshes/village/HoleCover_90Stairs.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bdy02h7ywfl37" +path="res://.godot/imported/HoleCover_90Stairs.gltf-5e60930b7712f2c2c6b493c15a42014f.scn" + +[deps] + +source_file="res://meshes/village/HoleCover_90Stairs.gltf" +dest_files=["res://.godot/imported/HoleCover_90Stairs.gltf-5e60930b7712f2c2c6b493c15a42014f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/HoleCover_Straight.bin b/meshes/village/HoleCover_Straight.bin new file mode 100644 index 0000000..adfcf78 Binary files /dev/null and b/meshes/village/HoleCover_Straight.bin differ diff --git a/meshes/village/HoleCover_Straight.gltf b/meshes/village/HoleCover_Straight.gltf new file mode 100644 index 0000000..abae54e --- /dev/null +++ b/meshes/village/HoleCover_Straight.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"HoleCover_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.065", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 0.10508733242750168, + -0.8801799416542053 + ], + "min":[ + -1.0000001192092896, + -0.10508651286363602, + -1.119820475578308 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"HoleCover_Straight.bin" + } + ] +} diff --git a/meshes/village/HoleCover_Straight.gltf.import b/meshes/village/HoleCover_Straight.gltf.import new file mode 100644 index 0000000..df78a2d --- /dev/null +++ b/meshes/village/HoleCover_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cjkr8tvoejid3" +path="res://.godot/imported/HoleCover_Straight.gltf-26bd18b4566c4afee9f9143e9919724d.scn" + +[deps] + +source_file="res://meshes/village/HoleCover_Straight.gltf" +dest_files=["res://.godot/imported/HoleCover_Straight.gltf-26bd18b4566c4afee9f9143e9919724d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/HoleCover_StraightHalf.bin b/meshes/village/HoleCover_StraightHalf.bin new file mode 100644 index 0000000..5c7d41b Binary files /dev/null and b/meshes/village/HoleCover_StraightHalf.bin differ diff --git a/meshes/village/HoleCover_StraightHalf.gltf b/meshes/village/HoleCover_StraightHalf.gltf new file mode 100644 index 0000000..a71b723 --- /dev/null +++ b/meshes/village/HoleCover_StraightHalf.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"HoleCover_StraightHalf" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.081", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":20, + "max":[ + 0.5, + 0.10508764535188675, + -0.8801799416542053 + ], + "min":[ + -0.5, + -0.10508604347705841, + -1.11981999874115 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":20, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":20, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":30, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":240, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":240, + "target":34962 + }, + { + "buffer":0, + "byteLength":160, + "byteOffset":480, + "target":34962 + }, + { + "buffer":0, + "byteLength":60, + "byteOffset":640, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":700, + "uri":"HoleCover_StraightHalf.bin" + } + ] +} diff --git a/meshes/village/HoleCover_StraightHalf.gltf.import b/meshes/village/HoleCover_StraightHalf.gltf.import new file mode 100644 index 0000000..bd5dfbe --- /dev/null +++ b/meshes/village/HoleCover_StraightHalf.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://hrjvjw03b305" +path="res://.godot/imported/HoleCover_StraightHalf.gltf-8130642ccb5e3f8a5be0464b6d6174d9.scn" + +[deps] + +source_file="res://meshes/village/HoleCover_StraightHalf.gltf" +dest_files=["res://.godot/imported/HoleCover_StraightHalf.gltf-8130642ccb5e3f8a5be0464b6d6174d9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Plaster_Corner.bin b/meshes/village/Overhang_Plaster_Corner.bin new file mode 100644 index 0000000..2ca4e84 Binary files /dev/null and b/meshes/village/Overhang_Plaster_Corner.bin differ diff --git a/meshes/village/Overhang_Plaster_Corner.gltf b/meshes/village/Overhang_Plaster_Corner.gltf new file mode 100644 index 0000000..531f0e6 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Corner.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Plaster_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Plane.042", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":176, + "max":[ + 1.0948179960250854, + 2.91355037689209, + 2 + ], + "min":[ + -2, + 0, + -1.094817876815796 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":176, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":176, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":474, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":360, + "max":[ + 1.100797176361084, + 3.116764545440674, + 2 + ], + "min":[ + -2, + 0.41332197189331055, + -1.1007977724075317 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":360, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":360, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":846, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2112, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2112, + "byteOffset":2112, + "target":34962 + }, + { + "buffer":0, + "byteLength":1408, + "byteOffset":4224, + "target":34962 + }, + { + "buffer":0, + "byteLength":948, + "byteOffset":5632, + "target":34963 + }, + { + "buffer":0, + "byteLength":4320, + "byteOffset":6580, + "target":34962 + }, + { + "buffer":0, + "byteLength":4320, + "byteOffset":10900, + "target":34962 + }, + { + "buffer":0, + "byteLength":2880, + "byteOffset":15220, + "target":34962 + }, + { + "buffer":0, + "byteLength":1692, + "byteOffset":18100, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":19792, + "uri":"Overhang_Plaster_Corner.bin" + } + ] +} diff --git a/meshes/village/Overhang_Plaster_Corner.gltf.import b/meshes/village/Overhang_Plaster_Corner.gltf.import new file mode 100644 index 0000000..1a83775 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c8l7bna0ixwji" +path="res://.godot/imported/Overhang_Plaster_Corner.gltf-7dbe12602c7f1bc61671d4a2aff2e8b3.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Plaster_Corner.gltf" +dest_files=["res://.godot/imported/Overhang_Plaster_Corner.gltf-7dbe12602c7f1bc61671d4a2aff2e8b3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Plaster_Corner_Front.bin b/meshes/village/Overhang_Plaster_Corner_Front.bin new file mode 100644 index 0000000..eff820c Binary files /dev/null and b/meshes/village/Overhang_Plaster_Corner_Front.bin differ diff --git a/meshes/village/Overhang_Plaster_Corner_Front.gltf b/meshes/village/Overhang_Plaster_Corner_Front.gltf new file mode 100644 index 0000000..2d7342b --- /dev/null +++ b/meshes/village/Overhang_Plaster_Corner_Front.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Plaster_Corner_Front" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.051", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":218, + "max":[ + 1.1175693273544312, + 3.116764545440674, + 2.0000011920928955 + ], + "min":[ + -2, + -0.023045778274536133, + -1.1175700426101685 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":218, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":218, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":372, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":36, + "max":[ + 1, + 3, + 2.000000476837158 + ], + "min":[ + -2, + 0, + -1.0000007152557373 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2616, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2616, + "byteOffset":2616, + "target":34962 + }, + { + "buffer":0, + "byteLength":1744, + "byteOffset":5232, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":6976, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":7720, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":8152, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":8584, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":8872, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8980, + "uri":"Overhang_Plaster_Corner_Front.bin" + } + ] +} diff --git a/meshes/village/Overhang_Plaster_Corner_Front.gltf.import b/meshes/village/Overhang_Plaster_Corner_Front.gltf.import new file mode 100644 index 0000000..4d1a7d5 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Corner_Front.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cepe02vlp75dj" +path="res://.godot/imported/Overhang_Plaster_Corner_Front.gltf-88a2e4330445f4713ed03c3949594651.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Plaster_Corner_Front.gltf" +dest_files=["res://.godot/imported/Overhang_Plaster_Corner_Front.gltf-88a2e4330445f4713ed03c3949594651.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Plaster_Long.bin b/meshes/village/Overhang_Plaster_Long.bin new file mode 100644 index 0000000..bdb0324 Binary files /dev/null and b/meshes/village/Overhang_Plaster_Long.bin differ diff --git a/meshes/village/Overhang_Plaster_Long.gltf b/meshes/village/Overhang_Plaster_Long.gltf new file mode 100644 index 0000000..fd15271 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Long.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Plaster_Long" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.011", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":196, + "max":[ + 1, + 3.028010368347168, + 2 + ], + "min":[ + -1.0000001192092896, + 0.41332197189331055, + -0.012515849433839321 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":196, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":196, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":196, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":438, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":66, + "max":[ + 1, + 2.924532651901245, + 2 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":66, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":66, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":66, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":174, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2352, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2352, + "byteOffset":2352, + "target":34962 + }, + { + "buffer":0, + "byteLength":1568, + "byteOffset":4704, + "target":34962 + }, + { + "buffer":0, + "byteLength":1568, + "byteOffset":6272, + "target":34962 + }, + { + "buffer":0, + "byteLength":876, + "byteOffset":7840, + "target":34963 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":8716, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":9508, + "target":34962 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":10300, + "target":34962 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":10828, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":11356, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11704, + "uri":"Overhang_Plaster_Long.bin" + } + ] +} diff --git a/meshes/village/Overhang_Plaster_Long.gltf.import b/meshes/village/Overhang_Plaster_Long.gltf.import new file mode 100644 index 0000000..fc9c0c2 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Long.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ywhi4k8w5ut3" +path="res://.godot/imported/Overhang_Plaster_Long.gltf-b90c80d40b6a8f67960d27434ba9ebc2.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Plaster_Long.gltf" +dest_files=["res://.godot/imported/Overhang_Plaster_Long.gltf-b90c80d40b6a8f67960d27434ba9ebc2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Plaster_Short.bin b/meshes/village/Overhang_Plaster_Short.bin new file mode 100644 index 0000000..4b323c4 Binary files /dev/null and b/meshes/village/Overhang_Plaster_Short.bin differ diff --git a/meshes/village/Overhang_Plaster_Short.gltf b/meshes/village/Overhang_Plaster_Short.gltf new file mode 100644 index 0000000..65ffc60 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Short.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Plaster_Short" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.232", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":200, + "max":[ + 1, + 3.1226887702941895, + 1.1228350400924683 + ], + "min":[ + -1.0000001192092896, + 0.41332197189331055, + -0.012515849433839321 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":200, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":200, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":200, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":498, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":62, + "max":[ + 1, + 2.91355037689209, + 1.0948179960250854 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":62, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":62, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":62, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2400, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2400, + "byteOffset":2400, + "target":34962 + }, + { + "buffer":0, + "byteLength":1600, + "byteOffset":4800, + "target":34962 + }, + { + "buffer":0, + "byteLength":1600, + "byteOffset":6400, + "target":34962 + }, + { + "buffer":0, + "byteLength":996, + "byteOffset":8000, + "target":34963 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":8996, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":9740, + "target":34962 + }, + { + "buffer":0, + "byteLength":496, + "byteOffset":10484, + "target":34962 + }, + { + "buffer":0, + "byteLength":496, + "byteOffset":10980, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":11476, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11812, + "uri":"Overhang_Plaster_Short.bin" + } + ] +} diff --git a/meshes/village/Overhang_Plaster_Short.gltf.import b/meshes/village/Overhang_Plaster_Short.gltf.import new file mode 100644 index 0000000..7e8ecd3 --- /dev/null +++ b/meshes/village/Overhang_Plaster_Short.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c50fcfwpqy2ix" +path="res://.godot/imported/Overhang_Plaster_Short.gltf-5d42b72fd835ad6267411fcc3c3fc9e9.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Plaster_Short.gltf" +dest_files=["res://.godot/imported/Overhang_Plaster_Short.gltf-5d42b72fd835ad6267411fcc3c3fc9e9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_RoofIncline_Plaster.bin b/meshes/village/Overhang_RoofIncline_Plaster.bin new file mode 100644 index 0000000..d0a37fb Binary files /dev/null and b/meshes/village/Overhang_RoofIncline_Plaster.bin differ diff --git a/meshes/village/Overhang_RoofIncline_Plaster.gltf b/meshes/village/Overhang_RoofIncline_Plaster.gltf new file mode 100644 index 0000000..88f603a --- /dev/null +++ b/meshes/village/Overhang_RoofIncline_Plaster.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_RoofIncline_Plaster" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.100", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":68, + "max":[ + 1, + -0.0585668720304966, + 0.4079211950302124 + ], + "min":[ + -1, + -0.3244321346282959, + -1.0216120481491089 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":102, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 1, + -0.07546736299991608, + 0.21131420135498047 + ], + "min":[ + -1, + -0.07546810060739517, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":816, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":1632, + "target":34962 + }, + { + "buffer":0, + "byteLength":204, + "byteOffset":2176, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2380, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2428, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":2476, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":2508, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2520, + "uri":"Overhang_RoofIncline_Plaster.bin" + } + ] +} diff --git a/meshes/village/Overhang_RoofIncline_Plaster.gltf.import b/meshes/village/Overhang_RoofIncline_Plaster.gltf.import new file mode 100644 index 0000000..c585f4c --- /dev/null +++ b/meshes/village/Overhang_RoofIncline_Plaster.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bppt1vgglnc8l" +path="res://.godot/imported/Overhang_RoofIncline_Plaster.gltf-41df95172b4ece77200e695649f5f234.scn" + +[deps] + +source_file="res://meshes/village/Overhang_RoofIncline_Plaster.gltf" +dest_files=["res://.godot/imported/Overhang_RoofIncline_Plaster.gltf-41df95172b4ece77200e695649f5f234.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_RoofIncline_UnevenBricks.bin b/meshes/village/Overhang_RoofIncline_UnevenBricks.bin new file mode 100644 index 0000000..d0a37fb Binary files /dev/null and b/meshes/village/Overhang_RoofIncline_UnevenBricks.bin differ diff --git a/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf b/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf new file mode 100644 index 0000000..ed60929 --- /dev/null +++ b/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf @@ -0,0 +1,270 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_RoofIncline_UnevenBricks" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.136", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":68, + "max":[ + 1, + -0.0585668720304966, + 0.4079211950302124 + ], + "min":[ + -1, + -0.3244321346282959, + -1.0216120481491089 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":102, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 1, + -0.07546736299991608, + 0.21131420135498047 + ], + "min":[ + -1, + -0.07546810060739517, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":816, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":1632, + "target":34962 + }, + { + "buffer":0, + "byteLength":204, + "byteOffset":2176, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2380, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2428, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":2476, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":2508, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2520, + "uri":"Overhang_RoofIncline_UnevenBricks.bin" + } + ] +} diff --git a/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf.import b/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf.import new file mode 100644 index 0000000..115aa95 --- /dev/null +++ b/meshes/village/Overhang_RoofIncline_UnevenBricks.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://by50f5ffhqtes" +path="res://.godot/imported/Overhang_RoofIncline_UnevenBricks.gltf-3b79e2e239b344e2a6c5fefc17b5c78a.scn" + +[deps] + +source_file="res://meshes/village/Overhang_RoofIncline_UnevenBricks.gltf" +dest_files=["res://.godot/imported/Overhang_RoofIncline_UnevenBricks.gltf-3b79e2e239b344e2a6c5fefc17b5c78a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Roof_Plaster.bin b/meshes/village/Overhang_Roof_Plaster.bin new file mode 100644 index 0000000..1cb29f9 Binary files /dev/null and b/meshes/village/Overhang_Roof_Plaster.bin differ diff --git a/meshes/village/Overhang_Roof_Plaster.gltf b/meshes/village/Overhang_Roof_Plaster.gltf new file mode 100644 index 0000000..8594a38 --- /dev/null +++ b/meshes/village/Overhang_Roof_Plaster.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Roof_Plaster" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.067", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 1, + -0.0585668720304966, + 1 + ], + "min":[ + -1, + -0.3244321346282959, + -1.0216120481491089 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":108, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 1, + -0.0754673108458519, + 1 + ], + "min":[ + -1, + -0.07546810060739517, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":2304, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2520, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2568, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":2616, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":2648, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2660, + "uri":"Overhang_Roof_Plaster.bin" + } + ] +} diff --git a/meshes/village/Overhang_Roof_Plaster.gltf.import b/meshes/village/Overhang_Roof_Plaster.gltf.import new file mode 100644 index 0000000..b53425d --- /dev/null +++ b/meshes/village/Overhang_Roof_Plaster.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b8vugvjbf8em1" +path="res://.godot/imported/Overhang_Roof_Plaster.gltf-1bff093d24d415abda325da6c881860f.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Roof_Plaster.gltf" +dest_files=["res://.godot/imported/Overhang_Roof_Plaster.gltf-1bff093d24d415abda325da6c881860f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Roof_UnevenBricks.bin b/meshes/village/Overhang_Roof_UnevenBricks.bin new file mode 100644 index 0000000..1cb29f9 Binary files /dev/null and b/meshes/village/Overhang_Roof_UnevenBricks.bin differ diff --git a/meshes/village/Overhang_Roof_UnevenBricks.gltf b/meshes/village/Overhang_Roof_UnevenBricks.gltf new file mode 100644 index 0000000..039336a --- /dev/null +++ b/meshes/village/Overhang_Roof_UnevenBricks.gltf @@ -0,0 +1,270 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Roof_UnevenBricks" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.102", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 1, + -0.0585668720304966, + 1 + ], + "min":[ + -1, + -0.3244321346282959, + -1.0216120481491089 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":108, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 1, + -0.0754673108458519, + 1 + ], + "min":[ + -1, + -0.07546810060739517, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":2304, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2520, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2568, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":2616, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":2648, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2660, + "uri":"Overhang_Roof_UnevenBricks.bin" + } + ] +} diff --git a/meshes/village/Overhang_Roof_UnevenBricks.gltf.import b/meshes/village/Overhang_Roof_UnevenBricks.gltf.import new file mode 100644 index 0000000..d3c6990 --- /dev/null +++ b/meshes/village/Overhang_Roof_UnevenBricks.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cxre624p8bj4b" +path="res://.godot/imported/Overhang_Roof_UnevenBricks.gltf-d8c1bf502700ea30fb84a7435dc5fef7.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Roof_UnevenBricks.gltf" +dest_files=["res://.godot/imported/Overhang_Roof_UnevenBricks.gltf-d8c1bf502700ea30fb84a7435dc5fef7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_Plaster_Long_L.bin b/meshes/village/Overhang_Side_Plaster_Long_L.bin new file mode 100644 index 0000000..77ae6dc Binary files /dev/null and b/meshes/village/Overhang_Side_Plaster_Long_L.bin differ diff --git a/meshes/village/Overhang_Side_Plaster_Long_L.gltf b/meshes/village/Overhang_Side_Plaster_Long_L.gltf new file mode 100644 index 0000000..5b32db3 --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Long_L.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_Plaster_Long_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.080", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":378, + "max":[ + -0.6859644055366516, + 6.116764545440674, + 2 + ], + "min":[ + -1.1652966737747192, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":378, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":378, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":378, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":768, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":68, + "max":[ + -0.7999998331069946, + 6, + 2.000000476837158 + ], + "min":[ + -1.000000238418579, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":174, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4536, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4536, + "byteOffset":4536, + "target":34962 + }, + { + "buffer":0, + "byteLength":3024, + "byteOffset":9072, + "target":34962 + }, + { + "buffer":0, + "byteLength":3024, + "byteOffset":12096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":15120, + "target":34963 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":16656, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":17472, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":18288, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":18832, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":19376, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":19724, + "uri":"Overhang_Side_Plaster_Long_L.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_Plaster_Long_L.gltf.import b/meshes/village/Overhang_Side_Plaster_Long_L.gltf.import new file mode 100644 index 0000000..a569673 --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Long_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d23uli3en0ql" +path="res://.godot/imported/Overhang_Side_Plaster_Long_L.gltf-0ef0d96e7fe89500850d986aa56dc471.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_Plaster_Long_L.gltf" +dest_files=["res://.godot/imported/Overhang_Side_Plaster_Long_L.gltf-0ef0d96e7fe89500850d986aa56dc471.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_Plaster_Long_R.bin b/meshes/village/Overhang_Side_Plaster_Long_R.bin new file mode 100644 index 0000000..b5f48c5 Binary files /dev/null and b/meshes/village/Overhang_Side_Plaster_Long_R.bin differ diff --git a/meshes/village/Overhang_Side_Plaster_Long_R.gltf b/meshes/village/Overhang_Side_Plaster_Long_R.gltf new file mode 100644 index 0000000..086c957 --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Long_R.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_Plaster_Long_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1685", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":378, + "max":[ + 1.1652966737747192, + 6.116764545440674, + 2 + ], + "min":[ + 0.6859644055366516, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":378, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":378, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":378, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":768, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":68, + "max":[ + 1.000000238418579, + 6, + 2.000000476837158 + ], + "min":[ + 0.7999998331069946, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":174, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4536, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4536, + "byteOffset":4536, + "target":34962 + }, + { + "buffer":0, + "byteLength":3024, + "byteOffset":9072, + "target":34962 + }, + { + "buffer":0, + "byteLength":3024, + "byteOffset":12096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":15120, + "target":34963 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":16656, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":17472, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":18288, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":18832, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":19376, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":19724, + "uri":"Overhang_Side_Plaster_Long_R.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_Plaster_Long_R.gltf.import b/meshes/village/Overhang_Side_Plaster_Long_R.gltf.import new file mode 100644 index 0000000..9c2350d --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Long_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://csbxbbwvkd6af" +path="res://.godot/imported/Overhang_Side_Plaster_Long_R.gltf-408454fe8ea6274f35f42ef03f45bd5a.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_Plaster_Long_R.gltf" +dest_files=["res://.godot/imported/Overhang_Side_Plaster_Long_R.gltf-408454fe8ea6274f35f42ef03f45bd5a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_Plaster_Short_L.bin b/meshes/village/Overhang_Side_Plaster_Short_L.bin new file mode 100644 index 0000000..edba946 Binary files /dev/null and b/meshes/village/Overhang_Side_Plaster_Short_L.bin differ diff --git a/meshes/village/Overhang_Side_Plaster_Short_L.gltf b/meshes/village/Overhang_Side_Plaster_Short_L.gltf new file mode 100644 index 0000000..de9161a --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Short_L.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_Plaster_Short_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.031", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":358, + "max":[ + -0.6859644055366516, + 6.116764545440674, + 1.1228351593017578 + ], + "min":[ + -1.1652966737747192, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":358, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":358, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":358, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":738, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":60, + "max":[ + -0.7999998331069946, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + -1, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":60, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4296, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4296, + "byteOffset":4296, + "target":34962 + }, + { + "buffer":0, + "byteLength":2864, + "byteOffset":8592, + "target":34962 + }, + { + "buffer":0, + "byteLength":2864, + "byteOffset":11456, + "target":34962 + }, + { + "buffer":0, + "byteLength":1476, + "byteOffset":14320, + "target":34963 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":15796, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":16516, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":17236, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":17716, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":18196, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":18532, + "uri":"Overhang_Side_Plaster_Short_L.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_Plaster_Short_L.gltf.import b/meshes/village/Overhang_Side_Plaster_Short_L.gltf.import new file mode 100644 index 0000000..ad3d2f7 --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Short_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bbx60hyr01tn5" +path="res://.godot/imported/Overhang_Side_Plaster_Short_L.gltf-2cb206c4f92f22c60a9ed1a5691bf63b.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_Plaster_Short_L.gltf" +dest_files=["res://.godot/imported/Overhang_Side_Plaster_Short_L.gltf-2cb206c4f92f22c60a9ed1a5691bf63b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_Plaster_Short_R.bin b/meshes/village/Overhang_Side_Plaster_Short_R.bin new file mode 100644 index 0000000..fdbc03d Binary files /dev/null and b/meshes/village/Overhang_Side_Plaster_Short_R.bin differ diff --git a/meshes/village/Overhang_Side_Plaster_Short_R.gltf b/meshes/village/Overhang_Side_Plaster_Short_R.gltf new file mode 100644 index 0000000..bd80f82 --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Short_R.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_Plaster_Short_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1678", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":358, + "max":[ + 1.1652966737747192, + 6.116764545440674, + 1.1228351593017578 + ], + "min":[ + 0.6859644055366516, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":358, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":358, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":358, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":738, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":60, + "max":[ + 1, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + 0.7999998331069946, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":60, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4296, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4296, + "byteOffset":4296, + "target":34962 + }, + { + "buffer":0, + "byteLength":2864, + "byteOffset":8592, + "target":34962 + }, + { + "buffer":0, + "byteLength":2864, + "byteOffset":11456, + "target":34962 + }, + { + "buffer":0, + "byteLength":1476, + "byteOffset":14320, + "target":34963 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":15796, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":16516, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":17236, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":17716, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":18196, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":18532, + "uri":"Overhang_Side_Plaster_Short_R.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_Plaster_Short_R.gltf.import b/meshes/village/Overhang_Side_Plaster_Short_R.gltf.import new file mode 100644 index 0000000..a4066ac --- /dev/null +++ b/meshes/village/Overhang_Side_Plaster_Short_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cph6p5ysnhwf5" +path="res://.godot/imported/Overhang_Side_Plaster_Short_R.gltf-c36edc0929537c0b074ad5094ea44371.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_Plaster_Short_R.gltf" +dest_files=["res://.godot/imported/Overhang_Side_Plaster_Short_R.gltf-c36edc0929537c0b074ad5094ea44371.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_L.bin b/meshes/village/Overhang_Side_UnevenBrick_Long_L.bin new file mode 100644 index 0000000..ebcf320 Binary files /dev/null and b/meshes/village/Overhang_Side_UnevenBrick_Long_L.bin differ diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf b/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf new file mode 100644 index 0000000..3bb7b4a --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_UnevenBrick_Long_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1666", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":336, + "max":[ + -0.6859644055366516, + 6.116764545440674, + 2 + ], + "min":[ + -1.1652966737747192, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":336, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":336, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":336, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":702, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":32, + "max":[ + -0.7999998331069946, + 6, + 2.000000476837158 + ], + "min":[ + -0.8000000715255737, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":84, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":36, + "max":[ + -0.9999998807907104, + 6, + 2 + ], + "min":[ + -1.0000001192092896, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":90, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4032, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4032, + "byteOffset":4032, + "target":34962 + }, + { + "buffer":0, + "byteLength":2688, + "byteOffset":8064, + "target":34962 + }, + { + "buffer":0, + "byteLength":2688, + "byteOffset":10752, + "target":34962 + }, + { + "buffer":0, + "byteLength":1404, + "byteOffset":13440, + "target":34963 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":14844, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":15228, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":15612, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":15868, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":16124, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":16292, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":16724, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":17156, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":17444, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":17732, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17912, + "uri":"Overhang_Side_UnevenBrick_Long_L.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf.import b/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf.import new file mode 100644 index 0000000..03d2294 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bsirplw0lmf43" +path="res://.godot/imported/Overhang_Side_UnevenBrick_Long_L.gltf-11f90b2167c147d33a8a77b9e05781f5.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_UnevenBrick_Long_L.gltf" +dest_files=["res://.godot/imported/Overhang_Side_UnevenBrick_Long_L.gltf-11f90b2167c147d33a8a77b9e05781f5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_R.bin b/meshes/village/Overhang_Side_UnevenBrick_Long_R.bin new file mode 100644 index 0000000..385bec5 Binary files /dev/null and b/meshes/village/Overhang_Side_UnevenBrick_Long_R.bin differ diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf b/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf new file mode 100644 index 0000000..16d8f91 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_UnevenBrick_Long_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.130", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":336, + "max":[ + 1.1652966737747192, + 6.116764545440674, + 2 + ], + "min":[ + 0.6859644055366516, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":336, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":336, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":336, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":702, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":32, + "max":[ + 0.8000000715255737, + 6, + 2.000000476837158 + ], + "min":[ + 0.7999998331069946, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":84, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":36, + "max":[ + 1.0000001192092896, + 6, + 2 + ], + "min":[ + 0.9999998807907104, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":90, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4032, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4032, + "byteOffset":4032, + "target":34962 + }, + { + "buffer":0, + "byteLength":2688, + "byteOffset":8064, + "target":34962 + }, + { + "buffer":0, + "byteLength":2688, + "byteOffset":10752, + "target":34962 + }, + { + "buffer":0, + "byteLength":1404, + "byteOffset":13440, + "target":34963 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":14844, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":15228, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":15612, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":15868, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":16124, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":16292, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":16724, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":17156, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":17444, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":17732, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17912, + "uri":"Overhang_Side_UnevenBrick_Long_R.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf.import b/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf.import new file mode 100644 index 0000000..c76d600 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bu6ipl6mtds85" +path="res://.godot/imported/Overhang_Side_UnevenBrick_Long_R.gltf-be8f688fb6730f0752aeb3679db170f2.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_UnevenBrick_Long_R.gltf" +dest_files=["res://.godot/imported/Overhang_Side_UnevenBrick_Long_R.gltf-be8f688fb6730f0752aeb3679db170f2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_L.bin b/meshes/village/Overhang_Side_UnevenBrick_Short_L.bin new file mode 100644 index 0000000..ea310b7 Binary files /dev/null and b/meshes/village/Overhang_Side_UnevenBrick_Short_L.bin differ diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf b/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf new file mode 100644 index 0000000..410f0c8 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_UnevenBrick_Short_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.134", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":342, + "max":[ + -0.6859644055366516, + 6.116764545440674, + 1.1228351593017578 + ], + "min":[ + -1.1652966737747192, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":342, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":714, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":30, + "max":[ + -0.7999998331069946, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + -0.7999998331069946, + 1.9063254594802856, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":30, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":84, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":30, + "max":[ + -1, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + -1, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":30, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":84, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4104, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4104, + "byteOffset":4104, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":8208, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":10944, + "target":34962 + }, + { + "buffer":0, + "byteLength":1428, + "byteOffset":13680, + "target":34963 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":15108, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":15468, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":15828, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":16068, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":16308, + "target":34963 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":16476, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":16836, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":17196, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":17436, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":17676, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17844, + "uri":"Overhang_Side_UnevenBrick_Short_L.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf.import b/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf.import new file mode 100644 index 0000000..553d217 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dwywxa1i7dv8d" +path="res://.godot/imported/Overhang_Side_UnevenBrick_Short_L.gltf-aa1e305b0fa78f96357626dc22363dd5.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_UnevenBrick_Short_L.gltf" +dest_files=["res://.godot/imported/Overhang_Side_UnevenBrick_Short_L.gltf-aa1e305b0fa78f96357626dc22363dd5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_R.bin b/meshes/village/Overhang_Side_UnevenBrick_Short_R.bin new file mode 100644 index 0000000..f15e530 Binary files /dev/null and b/meshes/village/Overhang_Side_UnevenBrick_Short_R.bin differ diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf b/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf new file mode 100644 index 0000000..f820a54 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_Side_UnevenBrick_Short_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1672", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":342, + "max":[ + 1.1652966737747192, + 6.116764545440674, + 1.1228351593017578 + ], + "min":[ + 0.6859644055366516, + -2.384185791015625e-07, + -0.3140338957309723 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":342, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":714, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":30, + "max":[ + 0.7999998331069946, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + 0.7999998331069946, + 1.9063254594802856, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":30, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":84, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":30, + "max":[ + 1, + 6.000000476837158, + 1.0000004768371582 + ], + "min":[ + 1, + 1.906325340270996, + -0.0009438991546630859 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":30, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":84, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4104, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4104, + "byteOffset":4104, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":8208, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":10944, + "target":34962 + }, + { + "buffer":0, + "byteLength":1428, + "byteOffset":13680, + "target":34963 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":15108, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":15468, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":15828, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":16068, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":16308, + "target":34963 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":16476, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":16836, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":17196, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":17436, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":17676, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17844, + "uri":"Overhang_Side_UnevenBrick_Short_R.bin" + } + ] +} diff --git a/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf.import b/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf.import new file mode 100644 index 0000000..d9953b0 --- /dev/null +++ b/meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ca01ep8687mji" +path="res://.godot/imported/Overhang_Side_UnevenBrick_Short_R.gltf-3f124a7683123730926664219ea68eb7.scn" + +[deps] + +source_file="res://meshes/village/Overhang_Side_UnevenBrick_Short_R.gltf" +dest_files=["res://.godot/imported/Overhang_Side_UnevenBrick_Short_R.gltf-3f124a7683123730926664219ea68eb7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_UnevenBrick_Corner.bin b/meshes/village/Overhang_UnevenBrick_Corner.bin new file mode 100644 index 0000000..4ea6cc6 Binary files /dev/null and b/meshes/village/Overhang_UnevenBrick_Corner.bin differ diff --git a/meshes/village/Overhang_UnevenBrick_Corner.gltf b/meshes/village/Overhang_UnevenBrick_Corner.gltf new file mode 100644 index 0000000..06529fb --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Corner.gltf @@ -0,0 +1,379 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_UnevenBrick_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Plane.046", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":81, + "max":[ + 0.7096809148788452, + 2.8951454162597656, + 2 + ], + "min":[ + -2, + 0, + -0.7096808552742004 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":81, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":81, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":207, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":320, + "max":[ + 1.100797176361084, + 3.116764545440674, + 2 + ], + "min":[ + -2, + 0.41332197189331055, + -1.1007977724075317 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":320, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":320, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":786, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":99, + "max":[ + 1.0948179960250854, + 2.91355037689209, + 2 + ], + "min":[ + -2, + 0, + -1.094817876815796 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":99, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":99, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":267, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":972, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":972, + "byteOffset":972, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":1944, + "target":34962 + }, + { + "buffer":0, + "byteLength":414, + "byteOffset":2592, + "target":34963 + }, + { + "buffer":0, + "byteLength":3840, + "byteOffset":3008, + "target":34962 + }, + { + "buffer":0, + "byteLength":3840, + "byteOffset":6848, + "target":34962 + }, + { + "buffer":0, + "byteLength":2560, + "byteOffset":10688, + "target":34962 + }, + { + "buffer":0, + "byteLength":1572, + "byteOffset":13248, + "target":34963 + }, + { + "buffer":0, + "byteLength":1188, + "byteOffset":14820, + "target":34962 + }, + { + "buffer":0, + "byteLength":1188, + "byteOffset":16008, + "target":34962 + }, + { + "buffer":0, + "byteLength":792, + "byteOffset":17196, + "target":34962 + }, + { + "buffer":0, + "byteLength":534, + "byteOffset":17988, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":18524, + "uri":"Overhang_UnevenBrick_Corner.bin" + } + ] +} diff --git a/meshes/village/Overhang_UnevenBrick_Corner.gltf.import b/meshes/village/Overhang_UnevenBrick_Corner.gltf.import new file mode 100644 index 0000000..6465f2a --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dv0c8muq2yds" +path="res://.godot/imported/Overhang_UnevenBrick_Corner.gltf-29c20bf25ad88c442f62bfa46b93c660.scn" + +[deps] + +source_file="res://meshes/village/Overhang_UnevenBrick_Corner.gltf" +dest_files=["res://.godot/imported/Overhang_UnevenBrick_Corner.gltf-29c20bf25ad88c442f62bfa46b93c660.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_UnevenBrick_Corner_Front.bin b/meshes/village/Overhang_UnevenBrick_Corner_Front.bin new file mode 100644 index 0000000..e74cfb9 Binary files /dev/null and b/meshes/village/Overhang_UnevenBrick_Corner_Front.bin differ diff --git a/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf b/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf new file mode 100644 index 0000000..5a6117f --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf @@ -0,0 +1,379 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_UnevenBrick_Corner_Front" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.143", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":68, + "max":[ + 1.1175693273544312, + 3.116764545440674, + 2.0000011920928955 + ], + "min":[ + -2, + 2.883235454559326, + -1.1175700426101685 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":126, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 0.8000000715255737, + 3, + 2.000000476837158 + ], + "min":[ + -2, + 0, + -0.800000786781311 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":23, + "max":[ + 1.0000007152557373, + 3, + 1.9999996423721313 + ], + "min":[ + -2.000000238418579, + 0, + -1.0000001192092896 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":23, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":23, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":816, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":1632, + "target":34962 + }, + { + "buffer":0, + "byteLength":252, + "byteOffset":2176, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":2428, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":2572, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2716, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":2812, + "target":34963 + }, + { + "buffer":0, + "byteLength":276, + "byteOffset":2848, + "target":34962 + }, + { + "buffer":0, + "byteLength":276, + "byteOffset":3124, + "target":34962 + }, + { + "buffer":0, + "byteLength":184, + "byteOffset":3400, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":3584, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3656, + "uri":"Overhang_UnevenBrick_Corner_Front.bin" + } + ] +} diff --git a/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf.import b/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf.import new file mode 100644 index 0000000..531fc66 --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Corner_Front.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://58nhhimrudas" +path="res://.godot/imported/Overhang_UnevenBrick_Corner_Front.gltf-cc3ef69066f5b570b9debab5f99465a4.scn" + +[deps] + +source_file="res://meshes/village/Overhang_UnevenBrick_Corner_Front.gltf" +dest_files=["res://.godot/imported/Overhang_UnevenBrick_Corner_Front.gltf-cc3ef69066f5b570b9debab5f99465a4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_UnevenBrick_Long.bin b/meshes/village/Overhang_UnevenBrick_Long.bin new file mode 100644 index 0000000..7416c64 Binary files /dev/null and b/meshes/village/Overhang_UnevenBrick_Long.bin differ diff --git a/meshes/village/Overhang_UnevenBrick_Long.gltf b/meshes/village/Overhang_UnevenBrick_Long.gltf new file mode 100644 index 0000000..6c2e2f7 --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Long.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_UnevenBrick_Long" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.116", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":180, + "max":[ + 1, + 3.028010368347168, + 2 + ], + "min":[ + -1.0000001192092896, + 0.41332197189331055, + -0.010601431131362915 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":180, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":180, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":414, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":32, + "max":[ + 1, + 2.924532651901245, + 2 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":78, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":34, + "max":[ + 1, + 2.91355037689209, + 1.0948179960250854 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":34, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2160, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2160, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":4320, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":5760, + "target":34962 + }, + { + "buffer":0, + "byteLength":828, + "byteOffset":7200, + "target":34963 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":8028, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":8412, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":8796, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":9052, + "target":34962 + }, + { + "buffer":0, + "byteLength":156, + "byteOffset":9308, + "target":34963 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":9464, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":9872, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":10280, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":10552, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":10824, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11016, + "uri":"Overhang_UnevenBrick_Long.bin" + } + ] +} diff --git a/meshes/village/Overhang_UnevenBrick_Long.gltf.import b/meshes/village/Overhang_UnevenBrick_Long.gltf.import new file mode 100644 index 0000000..1790fce --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Long.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6h5b07xtmt54" +path="res://.godot/imported/Overhang_UnevenBrick_Long.gltf-261f1d6144ee17a943f6873741c19a8d.scn" + +[deps] + +source_file="res://meshes/village/Overhang_UnevenBrick_Long.gltf" +dest_files=["res://.godot/imported/Overhang_UnevenBrick_Long.gltf-261f1d6144ee17a943f6873741c19a8d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Overhang_UnevenBrick_Short.bin b/meshes/village/Overhang_UnevenBrick_Short.bin new file mode 100644 index 0000000..8ef86d6 Binary files /dev/null and b/meshes/village/Overhang_UnevenBrick_Short.bin differ diff --git a/meshes/village/Overhang_UnevenBrick_Short.gltf b/meshes/village/Overhang_UnevenBrick_Short.gltf new file mode 100644 index 0000000..6e59118 --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Short.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Overhang_UnevenBrick_Short" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.117", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":184, + "max":[ + 1, + 3.1226887702941895, + 1.1228350400924683 + ], + "min":[ + -1.0000001192092896, + 0.41332197189331055, + -0.010601431131362915 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":184, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":184, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":184, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":474, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "max":[ + 1, + 2.8951454162597656, + 0.7096808552742004 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":72, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":34, + "max":[ + 1, + 2.91355037689209, + 1.0948179960250854 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":34, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2208, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2208, + "byteOffset":2208, + "target":34962 + }, + { + "buffer":0, + "byteLength":1472, + "byteOffset":4416, + "target":34962 + }, + { + "buffer":0, + "byteLength":1472, + "byteOffset":5888, + "target":34962 + }, + { + "buffer":0, + "byteLength":948, + "byteOffset":7360, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":8308, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":8644, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":8980, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":9204, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":9428, + "target":34963 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":9572, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":9980, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":10388, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":10660, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":10932, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11124, + "uri":"Overhang_UnevenBrick_Short.bin" + } + ] +} diff --git a/meshes/village/Overhang_UnevenBrick_Short.gltf.import b/meshes/village/Overhang_UnevenBrick_Short.gltf.import new file mode 100644 index 0000000..d45f77a --- /dev/null +++ b/meshes/village/Overhang_UnevenBrick_Short.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dqrqwuosvy3on" +path="res://.godot/imported/Overhang_UnevenBrick_Short.gltf-cebfda38ee649e37adc465e60a6165e0.scn" + +[deps] + +source_file="res://meshes/village/Overhang_UnevenBrick_Short.gltf" +dest_files=["res://.godot/imported/Overhang_UnevenBrick_Short.gltf-cebfda38ee649e37adc465e60a6165e0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Brick1.bin b/meshes/village/Prop_Brick1.bin new file mode 100644 index 0000000..d1e12c5 Binary files /dev/null and b/meshes/village/Prop_Brick1.bin differ diff --git a/meshes/village/Prop_Brick1.gltf b/meshes/village/Prop_Brick1.gltf new file mode 100644 index 0000000..6bdecc7 --- /dev/null +++ b/meshes/village/Prop_Brick1.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Brick1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.004", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":82, + "max":[ + 0.17773060500621796, + 0.09765361249446869, + 0.12473869323730469 + ], + "min":[ + -0.1679055243730545, + -0.11037472635507584, + -0.1254272609949112 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":82, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":82, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":324, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":984, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":984, + "byteOffset":984, + "target":34962 + }, + { + "buffer":0, + "byteLength":656, + "byteOffset":1968, + "target":34962 + }, + { + "buffer":0, + "byteLength":648, + "byteOffset":2624, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3272, + "uri":"Prop_Brick1.bin" + } + ] +} diff --git a/meshes/village/Prop_Brick1.gltf.import b/meshes/village/Prop_Brick1.gltf.import new file mode 100644 index 0000000..af6aef6 --- /dev/null +++ b/meshes/village/Prop_Brick1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c0x31u8e84gpp" +path="res://.godot/imported/Prop_Brick1.gltf-004228cd1aebfd13f41ce9f1420fe2fb.scn" + +[deps] + +source_file="res://meshes/village/Prop_Brick1.gltf" +dest_files=["res://.godot/imported/Prop_Brick1.gltf-004228cd1aebfd13f41ce9f1420fe2fb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Brick2.bin b/meshes/village/Prop_Brick2.bin new file mode 100644 index 0000000..22c0f97 Binary files /dev/null and b/meshes/village/Prop_Brick2.bin differ diff --git a/meshes/village/Prop_Brick2.gltf b/meshes/village/Prop_Brick2.gltf new file mode 100644 index 0000000..240b227 --- /dev/null +++ b/meshes/village/Prop_Brick2.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Brick2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":77, + "max":[ + 0.2050601989030838, + 0.13286349177360535, + 0.10852865874767303 + ], + "min":[ + -0.19034957885742188, + -0.11202564835548401, + -0.10835933685302734 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":77, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":77, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":282, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":924, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":924, + "byteOffset":924, + "target":34962 + }, + { + "buffer":0, + "byteLength":616, + "byteOffset":1848, + "target":34962 + }, + { + "buffer":0, + "byteLength":564, + "byteOffset":2464, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3028, + "uri":"Prop_Brick2.bin" + } + ] +} diff --git a/meshes/village/Prop_Brick2.gltf.import b/meshes/village/Prop_Brick2.gltf.import new file mode 100644 index 0000000..1af131b --- /dev/null +++ b/meshes/village/Prop_Brick2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cd2cvhk3ml5p6" +path="res://.godot/imported/Prop_Brick2.gltf-d70917e41354893a489a4543924e6cf5.scn" + +[deps] + +source_file="res://meshes/village/Prop_Brick2.gltf" +dest_files=["res://.godot/imported/Prop_Brick2.gltf-d70917e41354893a489a4543924e6cf5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Brick3.bin b/meshes/village/Prop_Brick3.bin new file mode 100644 index 0000000..01eccd4 Binary files /dev/null and b/meshes/village/Prop_Brick3.bin differ diff --git a/meshes/village/Prop_Brick3.gltf b/meshes/village/Prop_Brick3.gltf new file mode 100644 index 0000000..87d045c --- /dev/null +++ b/meshes/village/Prop_Brick3.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Brick3" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.002", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":98, + "max":[ + 0.19818253815174103, + 0.13483846187591553, + 0.10690490901470184 + ], + "min":[ + -0.18320874869823456, + -0.11486761271953583, + -0.10872507840394974 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":98, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":98, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":378, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1176, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1176, + "byteOffset":1176, + "target":34962 + }, + { + "buffer":0, + "byteLength":784, + "byteOffset":2352, + "target":34962 + }, + { + "buffer":0, + "byteLength":756, + "byteOffset":3136, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3892, + "uri":"Prop_Brick3.bin" + } + ] +} diff --git a/meshes/village/Prop_Brick3.gltf.import b/meshes/village/Prop_Brick3.gltf.import new file mode 100644 index 0000000..a138aaa --- /dev/null +++ b/meshes/village/Prop_Brick3.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://beceasgwt0jkr" +path="res://.godot/imported/Prop_Brick3.gltf-ceb6fd83d82bf769b0a070ca89a001eb.scn" + +[deps] + +source_file="res://meshes/village/Prop_Brick3.gltf" +dest_files=["res://.godot/imported/Prop_Brick3.gltf-ceb6fd83d82bf769b0a070ca89a001eb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Brick4.bin b/meshes/village/Prop_Brick4.bin new file mode 100644 index 0000000..07ca9c7 Binary files /dev/null and b/meshes/village/Prop_Brick4.bin differ diff --git a/meshes/village/Prop_Brick4.gltf b/meshes/village/Prop_Brick4.gltf new file mode 100644 index 0000000..4310847 --- /dev/null +++ b/meshes/village/Prop_Brick4.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Brick4" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.003", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":98, + "max":[ + 0.1283310055732727, + 0.13483846187591553, + 0.1026223823428154 + ], + "min":[ + -0.12834101915359497, + -0.11486760526895523, + -0.11300760507583618 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":98, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":98, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":378, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1176, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1176, + "byteOffset":1176, + "target":34962 + }, + { + "buffer":0, + "byteLength":784, + "byteOffset":2352, + "target":34962 + }, + { + "buffer":0, + "byteLength":756, + "byteOffset":3136, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3892, + "uri":"Prop_Brick4.bin" + } + ] +} diff --git a/meshes/village/Prop_Brick4.gltf.import b/meshes/village/Prop_Brick4.gltf.import new file mode 100644 index 0000000..763bbb4 --- /dev/null +++ b/meshes/village/Prop_Brick4.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://womvob48v2mh" +path="res://.godot/imported/Prop_Brick4.gltf-dd11ba2ea9d289b67671bb66cb0f7c43.scn" + +[deps] + +source_file="res://meshes/village/Prop_Brick4.gltf" +dest_files=["res://.godot/imported/Prop_Brick4.gltf-dd11ba2ea9d289b67671bb66cb0f7c43.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Chimney.bin b/meshes/village/Prop_Chimney.bin new file mode 100644 index 0000000..72081ac Binary files /dev/null and b/meshes/village/Prop_Chimney.bin differ diff --git a/meshes/village/Prop_Chimney.gltf b/meshes/village/Prop_Chimney.gltf new file mode 100644 index 0000000..1345e86 --- /dev/null +++ b/meshes/village/Prop_Chimney.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Chimney" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.006", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":508, + "max":[ + 0.4383014738559723, + 3.177875280380249, + 0.47339576482772827 + ], + "min":[ + -0.4516017735004425, + 2.8398513793945312, + -0.43134835362434387 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":508, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":508, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":1830, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":16, + "max":[ + 0.4457784593105316, + 3, + 0.5000000596046448 + ], + "min":[ + -0.5000000596046448, + 5.960464477539063e-08, + -0.5000000596046448 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":24, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6096, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6096, + "byteOffset":6096, + "target":34962 + }, + { + "buffer":0, + "byteLength":4064, + "byteOffset":12192, + "target":34962 + }, + { + "buffer":0, + "byteLength":3660, + "byteOffset":16256, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":19916, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":20108, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":20300, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":20428, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":20476, + "uri":"Prop_Chimney.bin" + } + ] +} diff --git a/meshes/village/Prop_Chimney.gltf.import b/meshes/village/Prop_Chimney.gltf.import new file mode 100644 index 0000000..c82cad2 --- /dev/null +++ b/meshes/village/Prop_Chimney.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b24vvj47ctcbg" +path="res://.godot/imported/Prop_Chimney.gltf-c289002ee9660fc38c8fc2a456cbdbec.scn" + +[deps] + +source_file="res://meshes/village/Prop_Chimney.gltf" +dest_files=["res://.godot/imported/Prop_Chimney.gltf-c289002ee9660fc38c8fc2a456cbdbec.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Chimney2.bin b/meshes/village/Prop_Chimney2.bin new file mode 100644 index 0000000..04d5695 Binary files /dev/null and b/meshes/village/Prop_Chimney2.bin differ diff --git a/meshes/village/Prop_Chimney2.gltf b/meshes/village/Prop_Chimney2.gltf new file mode 100644 index 0000000..aa52792 --- /dev/null +++ b/meshes/village/Prop_Chimney2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Chimney2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.017_Retopology.005", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":122, + "max":[ + 0.4457784593105316, + 3, + 0.4940085709095001 + ], + "min":[ + -0.5000000596046448, + 5.820766091346741e-08, + -0.49400854110717773 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":122, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":122, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":390, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1464, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1464, + "byteOffset":1464, + "target":34962 + }, + { + "buffer":0, + "byteLength":976, + "byteOffset":2928, + "target":34962 + }, + { + "buffer":0, + "byteLength":780, + "byteOffset":3904, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4684, + "uri":"Prop_Chimney2.bin" + } + ] +} diff --git a/meshes/village/Prop_Chimney2.gltf.import b/meshes/village/Prop_Chimney2.gltf.import new file mode 100644 index 0000000..d7ba071 --- /dev/null +++ b/meshes/village/Prop_Chimney2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dhldiyvppbdqp" +path="res://.godot/imported/Prop_Chimney2.gltf-d48802d44fcdaedca62f305c96b9a1ac.scn" + +[deps] + +source_file="res://meshes/village/Prop_Chimney2.gltf" +dest_files=["res://.godot/imported/Prop_Chimney2.gltf-d48802d44fcdaedca62f305c96b9a1ac.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Crate.bin b/meshes/village/Prop_Crate.bin new file mode 100644 index 0000000..80b658d Binary files /dev/null and b/meshes/village/Prop_Crate.bin differ diff --git a/meshes/village/Prop_Crate.gltf b/meshes/village/Prop_Crate.gltf new file mode 100644 index 0000000..6285532 --- /dev/null +++ b/meshes/village/Prop_Crate.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Crate" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.094", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":460, + "max":[ + 0.5417912006378174, + 1.0629422664642334, + 0.5417912006378174 + ], + "min":[ + -0.5417912602424622, + 0.003361523151397705, + -0.5417911410331726 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":460, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":460, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":690, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":5520, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":5520, + "byteOffset":5520, + "target":34962 + }, + { + "buffer":0, + "byteLength":3680, + "byteOffset":11040, + "target":34962 + }, + { + "buffer":0, + "byteLength":1380, + "byteOffset":14720, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":16100, + "uri":"Prop_Crate.bin" + } + ] +} diff --git a/meshes/village/Prop_Crate.gltf.import b/meshes/village/Prop_Crate.gltf.import new file mode 100644 index 0000000..bd335c7 --- /dev/null +++ b/meshes/village/Prop_Crate.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://htjk6aki04ol" +path="res://.godot/imported/Prop_Crate.gltf-50383a9280cfbdf268f5904c17a7365a.scn" + +[deps] + +source_file="res://meshes/village/Prop_Crate.gltf" +dest_files=["res://.godot/imported/Prop_Crate.gltf-50383a9280cfbdf268f5904c17a7365a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_ExteriorBorder_Corner.bin b/meshes/village/Prop_ExteriorBorder_Corner.bin new file mode 100644 index 0000000..f6d6ead Binary files /dev/null and b/meshes/village/Prop_ExteriorBorder_Corner.bin differ diff --git a/meshes/village/Prop_ExteriorBorder_Corner.gltf b/meshes/village/Prop_ExteriorBorder_Corner.gltf new file mode 100644 index 0000000..34e2db5 --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Corner.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_ExteriorBorder_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":34, + "max":[ + 1.1920928955078125e-07, + 0.13401801884174347, + 0.699999988079071 + ], + "min":[ + -0.699999988079071, + 2.701569457030928e-08, + -7.683411240577698e-09 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":34, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":34, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":54, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":408, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":408, + "target":34962 + }, + { + "buffer":0, + "byteLength":272, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1088, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1196, + "uri":"Prop_ExteriorBorder_Corner.bin" + } + ] +} diff --git a/meshes/village/Prop_ExteriorBorder_Corner.gltf.import b/meshes/village/Prop_ExteriorBorder_Corner.gltf.import new file mode 100644 index 0000000..e7c2a03 --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://4e6o7eygu7ml" +path="res://.godot/imported/Prop_ExteriorBorder_Corner.gltf-d80af9826464fbcdc0145b80fddd2fc3.scn" + +[deps] + +source_file="res://meshes/village/Prop_ExteriorBorder_Corner.gltf" +dest_files=["res://.godot/imported/Prop_ExteriorBorder_Corner.gltf-d80af9826464fbcdc0145b80fddd2fc3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_ExteriorBorder_Straight1.bin b/meshes/village/Prop_ExteriorBorder_Straight1.bin new file mode 100644 index 0000000..dbf4a8f Binary files /dev/null and b/meshes/village/Prop_ExteriorBorder_Straight1.bin differ diff --git a/meshes/village/Prop_ExteriorBorder_Straight1.gltf b/meshes/village/Prop_ExteriorBorder_Straight1.gltf new file mode 100644 index 0000000..2965cb5 --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Straight1.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_ExteriorBorder_Straight1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.025", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":28, + "max":[ + 1.0000001192092896, + 0.13401801884174347, + 0.699999988079071 + ], + "min":[ + -1.0000001192092896, + 2.701569457030928e-08, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":336, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":336, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":672, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":896, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":992, + "uri":"Prop_ExteriorBorder_Straight1.bin" + } + ] +} diff --git a/meshes/village/Prop_ExteriorBorder_Straight1.gltf.import b/meshes/village/Prop_ExteriorBorder_Straight1.gltf.import new file mode 100644 index 0000000..289edca --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Straight1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cte7gffi6akmi" +path="res://.godot/imported/Prop_ExteriorBorder_Straight1.gltf-dea516267399a1fb8697178697109441.scn" + +[deps] + +source_file="res://meshes/village/Prop_ExteriorBorder_Straight1.gltf" +dest_files=["res://.godot/imported/Prop_ExteriorBorder_Straight1.gltf-dea516267399a1fb8697178697109441.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_ExteriorBorder_Straight2.bin b/meshes/village/Prop_ExteriorBorder_Straight2.bin new file mode 100644 index 0000000..b021427 Binary files /dev/null and b/meshes/village/Prop_ExteriorBorder_Straight2.bin differ diff --git a/meshes/village/Prop_ExteriorBorder_Straight2.gltf b/meshes/village/Prop_ExteriorBorder_Straight2.gltf new file mode 100644 index 0000000..e5e32c5 --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Straight2.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_ExteriorBorder_Straight2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.005", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":28, + "max":[ + 1.0000001192092896, + 0.13401801884174347, + 0.699999988079071 + ], + "min":[ + -1.0000001192092896, + 2.701569457030928e-08, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":336, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":336, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":672, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":896, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":992, + "uri":"Prop_ExteriorBorder_Straight2.bin" + } + ] +} diff --git a/meshes/village/Prop_ExteriorBorder_Straight2.gltf.import b/meshes/village/Prop_ExteriorBorder_Straight2.gltf.import new file mode 100644 index 0000000..83c573d --- /dev/null +++ b/meshes/village/Prop_ExteriorBorder_Straight2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://crvtqdqwij6a4" +path="res://.godot/imported/Prop_ExteriorBorder_Straight2.gltf-6077c6b5d2fec130aceefa20f63df070.scn" + +[deps] + +source_file="res://meshes/village/Prop_ExteriorBorder_Straight2.gltf" +dest_files=["res://.godot/imported/Prop_ExteriorBorder_Straight2.gltf-6077c6b5d2fec130aceefa20f63df070.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_MetalFence_Ornament.bin b/meshes/village/Prop_MetalFence_Ornament.bin new file mode 100644 index 0000000..8ac2f92 Binary files /dev/null and b/meshes/village/Prop_MetalFence_Ornament.bin differ diff --git a/meshes/village/Prop_MetalFence_Ornament.gltf b/meshes/village/Prop_MetalFence_Ornament.gltf new file mode 100644 index 0000000..1a88822 --- /dev/null +++ b/meshes/village/Prop_MetalFence_Ornament.gltf @@ -0,0 +1,147 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_MetalFence_Ornament" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicRoughnessTexture":{ + "index":1 + } + } + } + ], + "meshes":[ + { + "name":"Torus.013", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":3966, + "max":[ + 0.9789982438087463, + 2.8523812294006348, + 0.07802899926900864 + ], + "min":[ + -0.9733137488365173, + -1.1920928955078125e-07, + -0.07802899181842804 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":3966, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":3966, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":11964, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":47592, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":47592, + "byteOffset":47592, + "target":34962 + }, + { + "buffer":0, + "byteLength":31728, + "byteOffset":95184, + "target":34962 + }, + { + "buffer":0, + "byteLength":23928, + "byteOffset":126912, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":150840, + "uri":"Prop_MetalFence_Ornament.bin" + } + ] +} diff --git a/meshes/village/Prop_MetalFence_Ornament.gltf.import b/meshes/village/Prop_MetalFence_Ornament.gltf.import new file mode 100644 index 0000000..7380326 --- /dev/null +++ b/meshes/village/Prop_MetalFence_Ornament.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://hjaw8421gbj3" +path="res://.godot/imported/Prop_MetalFence_Ornament.gltf-0ac77df5dc6801bfb0523570f2769849.scn" + +[deps] + +source_file="res://meshes/village/Prop_MetalFence_Ornament.gltf" +dest_files=["res://.godot/imported/Prop_MetalFence_Ornament.gltf-0ac77df5dc6801bfb0523570f2769849.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_MetalFence_Simple.bin b/meshes/village/Prop_MetalFence_Simple.bin new file mode 100644 index 0000000..9de6df7 Binary files /dev/null and b/meshes/village/Prop_MetalFence_Simple.bin differ diff --git a/meshes/village/Prop_MetalFence_Simple.gltf b/meshes/village/Prop_MetalFence_Simple.gltf new file mode 100644 index 0000000..31c6726 --- /dev/null +++ b/meshes/village/Prop_MetalFence_Simple.gltf @@ -0,0 +1,147 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_MetalFence_Simple" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicRoughnessTexture":{ + "index":1 + } + } + } + ], + "meshes":[ + { + "name":"Torus.011", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":2718, + "max":[ + 0.9789982438087463, + 2.8683502674102783, + 0.07802899926900864 + ], + "min":[ + -0.9701056480407715, + -1.1920928955078125e-07, + -0.07802898436784744 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":2718, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":2718, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":8232, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":32616, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":32616, + "byteOffset":32616, + "target":34962 + }, + { + "buffer":0, + "byteLength":21744, + "byteOffset":65232, + "target":34962 + }, + { + "buffer":0, + "byteLength":16464, + "byteOffset":86976, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":103440, + "uri":"Prop_MetalFence_Simple.bin" + } + ] +} diff --git a/meshes/village/Prop_MetalFence_Simple.gltf.import b/meshes/village/Prop_MetalFence_Simple.gltf.import new file mode 100644 index 0000000..dd7c82e --- /dev/null +++ b/meshes/village/Prop_MetalFence_Simple.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cpxhghesomogn" +path="res://.godot/imported/Prop_MetalFence_Simple.gltf-0108931d0717f80784fc073f1fbbbac1.scn" + +[deps] + +source_file="res://meshes/village/Prop_MetalFence_Simple.gltf" +dest_files=["res://.godot/imported/Prop_MetalFence_Simple.gltf-0108931d0717f80784fc073f1fbbbac1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Support.bin b/meshes/village/Prop_Support.bin new file mode 100644 index 0000000..a3c6ca8 Binary files /dev/null and b/meshes/village/Prop_Support.bin differ diff --git a/meshes/village/Prop_Support.gltf b/meshes/village/Prop_Support.gltf new file mode 100644 index 0000000..d334714 --- /dev/null +++ b/meshes/village/Prop_Support.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Support" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.124", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 0.09930171072483063, + 2.9200263023376465, + 1.9181500673294067 + ], + "min":[ + -0.09930182993412018, + 1.2113893032073975, + -0.11812299489974976 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"Prop_Support.bin" + } + ] +} diff --git a/meshes/village/Prop_Support.gltf.import b/meshes/village/Prop_Support.gltf.import new file mode 100644 index 0000000..57c08c3 --- /dev/null +++ b/meshes/village/Prop_Support.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b11j5101qm0wp" +path="res://.godot/imported/Prop_Support.gltf-4cdd6173e20d1410a20b38b98fe3d042.scn" + +[deps] + +source_file="res://meshes/village/Prop_Support.gltf" +dest_files=["res://.godot/imported/Prop_Support.gltf-4cdd6173e20d1410a20b38b98fe3d042.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine1.bin b/meshes/village/Prop_Vine1.bin new file mode 100644 index 0000000..b7737f5 Binary files /dev/null and b/meshes/village/Prop_Vine1.bin differ diff --git a/meshes/village/Prop_Vine1.gltf b/meshes/village/Prop_Vine1.gltf new file mode 100644 index 0000000..c8a31dd --- /dev/null +++ b/meshes/village/Prop_Vine1.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine1" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":159, + "max":[ + 0.7526196837425232, + 0.48202916979789734, + 0.17425554990768433 + ], + "min":[ + -0.7831392884254456, + -2.1205222606658936, + -0.04470796883106232 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":159, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":159, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":246, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1908, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1908, + "byteOffset":1908, + "target":34962 + }, + { + "buffer":0, + "byteLength":1272, + "byteOffset":3816, + "target":34962 + }, + { + "buffer":0, + "byteLength":492, + "byteOffset":5088, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5580, + "uri":"Prop_Vine1.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine1.gltf.import b/meshes/village/Prop_Vine1.gltf.import new file mode 100644 index 0000000..3751344 --- /dev/null +++ b/meshes/village/Prop_Vine1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://gnmix0icxiga" +path="res://.godot/imported/Prop_Vine1.gltf-9a1a8cf729f4e68aae1525a46a9db51e.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine1.gltf" +dest_files=["res://.godot/imported/Prop_Vine1.gltf-9a1a8cf729f4e68aae1525a46a9db51e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine2.bin b/meshes/village/Prop_Vine2.bin new file mode 100644 index 0000000..3adea61 Binary files /dev/null and b/meshes/village/Prop_Vine2.bin differ diff --git a/meshes/village/Prop_Vine2.gltf b/meshes/village/Prop_Vine2.gltf new file mode 100644 index 0000000..d79b40e --- /dev/null +++ b/meshes/village/Prop_Vine2.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine2" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.017", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":88, + "max":[ + 0.8920609951019287, + 0.4820291996002197, + 0.16913655400276184 + ], + "min":[ + -0.4940524697303772, + -2.1205222606658936, + -0.04470796883106232 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":88, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":88, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":135, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1056, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1056, + "byteOffset":1056, + "target":34962 + }, + { + "buffer":0, + "byteLength":704, + "byteOffset":2112, + "target":34962 + }, + { + "buffer":0, + "byteLength":270, + "byteOffset":2816, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3088, + "uri":"Prop_Vine2.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine2.gltf.import b/meshes/village/Prop_Vine2.gltf.import new file mode 100644 index 0000000..8dde2ce --- /dev/null +++ b/meshes/village/Prop_Vine2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cug82kb0oojpe" +path="res://.godot/imported/Prop_Vine2.gltf-25bb01d158735a7da73e867504f72c15.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine2.gltf" +dest_files=["res://.godot/imported/Prop_Vine2.gltf-25bb01d158735a7da73e867504f72c15.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine4.bin b/meshes/village/Prop_Vine4.bin new file mode 100644 index 0000000..6e035d5 Binary files /dev/null and b/meshes/village/Prop_Vine4.bin differ diff --git a/meshes/village/Prop_Vine4.gltf b/meshes/village/Prop_Vine4.gltf new file mode 100644 index 0000000..fa648fc --- /dev/null +++ b/meshes/village/Prop_Vine4.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine4" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.020", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":61, + "max":[ + 0.2984466254711151, + 0.5742899179458618, + 0.12323993444442749 + ], + "min":[ + -0.7181261777877808, + -1.0138827562332153, + -0.02677658572793007 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":61, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":61, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":93, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":732, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":732, + "byteOffset":732, + "target":34962 + }, + { + "buffer":0, + "byteLength":488, + "byteOffset":1464, + "target":34962 + }, + { + "buffer":0, + "byteLength":186, + "byteOffset":1952, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2140, + "uri":"Prop_Vine4.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine4.gltf.import b/meshes/village/Prop_Vine4.gltf.import new file mode 100644 index 0000000..a8b4c58 --- /dev/null +++ b/meshes/village/Prop_Vine4.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cnney33lidcy4" +path="res://.godot/imported/Prop_Vine4.gltf-135da4de2064fe43b7912354ff4d88f5.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine4.gltf" +dest_files=["res://.godot/imported/Prop_Vine4.gltf-135da4de2064fe43b7912354ff4d88f5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine5.bin b/meshes/village/Prop_Vine5.bin new file mode 100644 index 0000000..48fd729 Binary files /dev/null and b/meshes/village/Prop_Vine5.bin differ diff --git a/meshes/village/Prop_Vine5.gltf b/meshes/village/Prop_Vine5.gltf new file mode 100644 index 0000000..9a80fb4 --- /dev/null +++ b/meshes/village/Prop_Vine5.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine5" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.029", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":185, + "max":[ + 0.982731819152832, + 1.0308988094329834, + 0.1016744077205658 + ], + "min":[ + -1.3183526992797852, + -1.954820990562439, + -1.0241650342941284 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":185, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":185, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":351, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2220, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2220, + "byteOffset":2220, + "target":34962 + }, + { + "buffer":0, + "byteLength":1480, + "byteOffset":4440, + "target":34962 + }, + { + "buffer":0, + "byteLength":702, + "byteOffset":5920, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6624, + "uri":"Prop_Vine5.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine5.gltf.import b/meshes/village/Prop_Vine5.gltf.import new file mode 100644 index 0000000..9e93be5 --- /dev/null +++ b/meshes/village/Prop_Vine5.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cirqtvgqip00p" +path="res://.godot/imported/Prop_Vine5.gltf-750316a0590147ae5a49720423e92e32.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine5.gltf" +dest_files=["res://.godot/imported/Prop_Vine5.gltf-750316a0590147ae5a49720423e92e32.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine6.bin b/meshes/village/Prop_Vine6.bin new file mode 100644 index 0000000..dafeefe Binary files /dev/null and b/meshes/village/Prop_Vine6.bin differ diff --git a/meshes/village/Prop_Vine6.gltf b/meshes/village/Prop_Vine6.gltf new file mode 100644 index 0000000..f954575 --- /dev/null +++ b/meshes/village/Prop_Vine6.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine6" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.031", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":178, + "max":[ + 2.1019039154052734, + 1.396304965019226, + 0.1016744077205658 + ], + "min":[ + -2.035076856613159, + -1.0719956159591675, + -1.3687866926193237 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":178, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":178, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":342, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2136, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2136, + "byteOffset":2136, + "target":34962 + }, + { + "buffer":0, + "byteLength":1424, + "byteOffset":4272, + "target":34962 + }, + { + "buffer":0, + "byteLength":684, + "byteOffset":5696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6380, + "uri":"Prop_Vine6.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine6.gltf.import b/meshes/village/Prop_Vine6.gltf.import new file mode 100644 index 0000000..69d560d --- /dev/null +++ b/meshes/village/Prop_Vine6.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dyb543mwkl4sc" +path="res://.godot/imported/Prop_Vine6.gltf-473aa07d0214556e0fae6bba378a7fd7.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine6.gltf" +dest_files=["res://.godot/imported/Prop_Vine6.gltf-473aa07d0214556e0fae6bba378a7fd7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Vine9.bin b/meshes/village/Prop_Vine9.bin new file mode 100644 index 0000000..1ba87f8 Binary files /dev/null and b/meshes/village/Prop_Vine9.bin differ diff --git a/meshes/village/Prop_Vine9.gltf b/meshes/village/Prop_Vine9.gltf new file mode 100644 index 0000000..a835f25 --- /dev/null +++ b/meshes/village/Prop_Vine9.gltf @@ -0,0 +1,145 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Vine9" + } + ], + "materials":[ + { + "alphaCutoff":0.5, + "alphaMode":"MASK", + "doubleSided":true, + "name":"MI_Vine", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.10236014425754547, + 0.3486083149909973, + 0, + 1 + ], + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.002", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_VineLeaf.png", + "uri":"T_VineLeaf_png.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 2.1019039154052734, + 0.8338137865066528, + 0.7182512283325195 + ], + "min":[ + -2.035076856613159, + -0.6333709955215454, + -0.7522098422050476 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":132, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":2304, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2568, + "uri":"Prop_Vine9.bin" + } + ] +} diff --git a/meshes/village/Prop_Vine9.gltf.import b/meshes/village/Prop_Vine9.gltf.import new file mode 100644 index 0000000..dd09194 --- /dev/null +++ b/meshes/village/Prop_Vine9.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cdb1mjnmljaxx" +path="res://.godot/imported/Prop_Vine9.gltf-bc80b965bca783c54747aad41565413d.scn" + +[deps] + +source_file="res://meshes/village/Prop_Vine9.gltf" +dest_files=["res://.godot/imported/Prop_Vine9.gltf-bc80b965bca783c54747aad41565413d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_Wagon.bin b/meshes/village/Prop_Wagon.bin new file mode 100644 index 0000000..010e96f Binary files /dev/null and b/meshes/village/Prop_Wagon.bin differ diff --git a/meshes/village/Prop_Wagon.gltf b/meshes/village/Prop_Wagon.gltf new file mode 100644 index 0000000..734d37c --- /dev/null +++ b/meshes/village/Prop_Wagon.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_Wagon" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.043", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":2331, + "max":[ + 0.9720492362976074, + 1.5323269367218018, + 0.8735843896865845 + ], + "min":[ + -0.9793591499328613, + 0.00312984362244606, + -3.1504321098327637 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":2331, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":2331, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":2331, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":5016, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":27972, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":27972, + "byteOffset":27972, + "target":34962 + }, + { + "buffer":0, + "byteLength":18648, + "byteOffset":55944, + "target":34962 + }, + { + "buffer":0, + "byteLength":18648, + "byteOffset":74592, + "target":34962 + }, + { + "buffer":0, + "byteLength":10032, + "byteOffset":93240, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":103272, + "uri":"Prop_Wagon.bin" + } + ] +} diff --git a/meshes/village/Prop_Wagon.gltf.import b/meshes/village/Prop_Wagon.gltf.import new file mode 100644 index 0000000..7ee5fea --- /dev/null +++ b/meshes/village/Prop_Wagon.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://buitqmoynxhq" +path="res://.godot/imported/Prop_Wagon.gltf-7f0a5072d970d0d7fe3b0899a83d2bbf.scn" + +[deps] + +source_file="res://meshes/village/Prop_Wagon.gltf" +dest_files=["res://.godot/imported/Prop_Wagon.gltf-7f0a5072d970d0d7fe3b0899a83d2bbf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_WoodenFence_Extension1.bin b/meshes/village/Prop_WoodenFence_Extension1.bin new file mode 100644 index 0000000..f0d065c Binary files /dev/null and b/meshes/village/Prop_WoodenFence_Extension1.bin differ diff --git a/meshes/village/Prop_WoodenFence_Extension1.gltf b/meshes/village/Prop_WoodenFence_Extension1.gltf new file mode 100644 index 0000000..0b1168f --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Extension1.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_WoodenFence_Extension1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.099", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1.0326489210128784, + 0.8098565340042114, + 0.055178605020046234 + ], + "min":[ + -1.0123960971832275, + -0.02825251966714859, + -0.05517866089940071 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":96, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2048, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2240, + "uri":"Prop_WoodenFence_Extension1.bin" + } + ] +} diff --git a/meshes/village/Prop_WoodenFence_Extension1.gltf.import b/meshes/village/Prop_WoodenFence_Extension1.gltf.import new file mode 100644 index 0000000..36aad29 --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Extension1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cn7jbudpxr6gf" +path="res://.godot/imported/Prop_WoodenFence_Extension1.gltf-349895216513989cea55caaae54b550a.scn" + +[deps] + +source_file="res://meshes/village/Prop_WoodenFence_Extension1.gltf" +dest_files=["res://.godot/imported/Prop_WoodenFence_Extension1.gltf-349895216513989cea55caaae54b550a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_WoodenFence_Extension2.bin b/meshes/village/Prop_WoodenFence_Extension2.bin new file mode 100644 index 0000000..da8ff91 Binary files /dev/null and b/meshes/village/Prop_WoodenFence_Extension2.bin differ diff --git a/meshes/village/Prop_WoodenFence_Extension2.gltf b/meshes/village/Prop_WoodenFence_Extension2.gltf new file mode 100644 index 0000000..929b642 --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Extension2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_WoodenFence_Extension2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.098", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":56, + "max":[ + 1.0326489210128784, + 0.8098565340042114, + 0.055178605020046234 + ], + "min":[ + -0.9943826794624329, + -0.02825251966714859, + -0.05517866089940071 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":56, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":56, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":84, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":672, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":672, + "target":34962 + }, + { + "buffer":0, + "byteLength":448, + "byteOffset":1344, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":1792, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1960, + "uri":"Prop_WoodenFence_Extension2.bin" + } + ] +} diff --git a/meshes/village/Prop_WoodenFence_Extension2.gltf.import b/meshes/village/Prop_WoodenFence_Extension2.gltf.import new file mode 100644 index 0000000..678506f --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Extension2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://kph41aoue5ie" +path="res://.godot/imported/Prop_WoodenFence_Extension2.gltf-5071bf00a446a6db409b41a954460dbf.scn" + +[deps] + +source_file="res://meshes/village/Prop_WoodenFence_Extension2.gltf" +dest_files=["res://.godot/imported/Prop_WoodenFence_Extension2.gltf-5071bf00a446a6db409b41a954460dbf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Prop_WoodenFence_Single.bin b/meshes/village/Prop_WoodenFence_Single.bin new file mode 100644 index 0000000..596969a Binary files /dev/null and b/meshes/village/Prop_WoodenFence_Single.bin differ diff --git a/meshes/village/Prop_WoodenFence_Single.gltf b/meshes/village/Prop_WoodenFence_Single.gltf new file mode 100644 index 0000000..72f2b5e --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Single.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Prop_WoodenFence_Single" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.097", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":80, + "max":[ + 1.0326489210128784, + 0.8098565340042114, + 0.059910036623477936 + ], + "min":[ + -1.0314507484436035, + -0.02825251966714859, + -0.059909969568252563 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":80, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":120, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":960, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":960, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":1920, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":2560, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2800, + "uri":"Prop_WoodenFence_Single.bin" + } + ] +} diff --git a/meshes/village/Prop_WoodenFence_Single.gltf.import b/meshes/village/Prop_WoodenFence_Single.gltf.import new file mode 100644 index 0000000..2ac3cdd --- /dev/null +++ b/meshes/village/Prop_WoodenFence_Single.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6142s2dsrjap" +path="res://.godot/imported/Prop_WoodenFence_Single.gltf-de9975c6af18212f3de321a4f0d5df00.scn" + +[deps] + +source_file="res://meshes/village/Prop_WoodenFence_Single.gltf" +dest_files=["res://.godot/imported/Prop_WoodenFence_Single.gltf-de9975c6af18212f3de321a4f0d5df00.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_2x4_RoundTile.bin b/meshes/village/Roof_2x4_RoundTile.bin new file mode 100644 index 0000000..fee791d Binary files /dev/null and b/meshes/village/Roof_2x4_RoundTile.bin differ diff --git a/meshes/village/Roof_2x4_RoundTile.gltf b/meshes/village/Roof_2x4_RoundTile.gltf new file mode 100644 index 0000000..d02cb70 --- /dev/null +++ b/meshes/village/Roof_2x4_RoundTile.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_2x4_RoundTile" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.044", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":472, + "max":[ + 1.5365829467773438, + 1.903069019317627, + 2.000000238418579 + ], + "min":[ + -1.5365829467773438, + -0.3415522575378418, + -2.000000238418579 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":472, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":472, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":472, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":840, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":870, + "max":[ + 1.6467093229293823, + 2.3241586685180664, + 2.1076807975769043 + ], + "min":[ + -1.6467090845108032, + -0.21261566877365112, + -2.124508857727051 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":870, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":870, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":870, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":2496, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":5664, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":5664, + "byteOffset":5664, + "target":34962 + }, + { + "buffer":0, + "byteLength":3776, + "byteOffset":11328, + "target":34962 + }, + { + "buffer":0, + "byteLength":3776, + "byteOffset":15104, + "target":34962 + }, + { + "buffer":0, + "byteLength":1680, + "byteOffset":18880, + "target":34963 + }, + { + "buffer":0, + "byteLength":10440, + "byteOffset":20560, + "target":34962 + }, + { + "buffer":0, + "byteLength":10440, + "byteOffset":31000, + "target":34962 + }, + { + "buffer":0, + "byteLength":6960, + "byteOffset":41440, + "target":34962 + }, + { + "buffer":0, + "byteLength":6960, + "byteOffset":48400, + "target":34962 + }, + { + "buffer":0, + "byteLength":4992, + "byteOffset":55360, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":60352, + "uri":"Roof_2x4_RoundTile.bin" + } + ] +} diff --git a/meshes/village/Roof_2x4_RoundTile.gltf.import b/meshes/village/Roof_2x4_RoundTile.gltf.import new file mode 100644 index 0000000..1ffc79e --- /dev/null +++ b/meshes/village/Roof_2x4_RoundTile.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dliubmn7pv3br" +path="res://.godot/imported/Roof_2x4_RoundTile.gltf-5d7a4b0f54f647a70eda404c37de6ea5.scn" + +[deps] + +source_file="res://meshes/village/Roof_2x4_RoundTile.gltf" +dest_files=["res://.godot/imported/Roof_2x4_RoundTile.gltf-5d7a4b0f54f647a70eda404c37de6ea5.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Dormer_RoundTile.bin b/meshes/village/Roof_Dormer_RoundTile.bin new file mode 100644 index 0000000..7f461e4 Binary files /dev/null and b/meshes/village/Roof_Dormer_RoundTile.bin differ diff --git a/meshes/village/Roof_Dormer_RoundTile.gltf b/meshes/village/Roof_Dormer_RoundTile.gltf new file mode 100644 index 0000000..493ab03 --- /dev/null +++ b/meshes/village/Roof_Dormer_RoundTile.gltf @@ -0,0 +1,513 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Dormer_RoundTile" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.197", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + }, + { + "attributes":{ + "POSITION":15, + "NORMAL":16, + "TEXCOORD_0":17, + "TEXCOORD_1":18 + }, + "indices":19, + "material":3 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":804, + "max":[ + 1.796095609664917, + 2.4071543216705322, + 1.0531584024429321 + ], + "min":[ + -0.06625044345855713, + 0.029659956693649292, + -1.0530269145965576 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":804, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":804, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":804, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1272, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":88, + "max":[ + 1.6412353515625, + 2.1810436248779297, + 0.720812976360321 + ], + "min":[ + 0.20741748809814453, + 0.07360720634460449, + -0.7227497100830078 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":88, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":88, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":88, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":240, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":148, + "max":[ + 1.6450214385986328, + 1.0366252660751343, + 0.4369128346443176 + ], + "min":[ + 1.6450212001800537, + 0.24898052215576172, + -0.4329167604446411 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":148, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":148, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":148, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":222, + "type":"SCALAR" + }, + { + "bufferView":15, + "componentType":5126, + "count":352, + "max":[ + 1.900120496749878, + 2.7027745246887207, + 1.219645380973816 + ], + "min":[ + -0.01868981122970581, + 0.9468854665756226, + -1.2195141315460205 + ], + "type":"VEC3" + }, + { + "bufferView":16, + "componentType":5126, + "count":352, + "type":"VEC3" + }, + { + "bufferView":17, + "componentType":5126, + "count":352, + "type":"VEC2" + }, + { + "bufferView":18, + "componentType":5126, + "count":352, + "type":"VEC2" + }, + { + "bufferView":19, + "componentType":5123, + "count":978, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":9648, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":9648, + "byteOffset":9648, + "target":34962 + }, + { + "buffer":0, + "byteLength":6432, + "byteOffset":19296, + "target":34962 + }, + { + "buffer":0, + "byteLength":6432, + "byteOffset":25728, + "target":34962 + }, + { + "buffer":0, + "byteLength":2544, + "byteOffset":32160, + "target":34963 + }, + { + "buffer":0, + "byteLength":1056, + "byteOffset":34704, + "target":34962 + }, + { + "buffer":0, + "byteLength":1056, + "byteOffset":35760, + "target":34962 + }, + { + "buffer":0, + "byteLength":704, + "byteOffset":36816, + "target":34962 + }, + { + "buffer":0, + "byteLength":704, + "byteOffset":37520, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":38224, + "target":34963 + }, + { + "buffer":0, + "byteLength":1776, + "byteOffset":38704, + "target":34962 + }, + { + "buffer":0, + "byteLength":1776, + "byteOffset":40480, + "target":34962 + }, + { + "buffer":0, + "byteLength":1184, + "byteOffset":42256, + "target":34962 + }, + { + "buffer":0, + "byteLength":1184, + "byteOffset":43440, + "target":34962 + }, + { + "buffer":0, + "byteLength":444, + "byteOffset":44624, + "target":34963 + }, + { + "buffer":0, + "byteLength":4224, + "byteOffset":45068, + "target":34962 + }, + { + "buffer":0, + "byteLength":4224, + "byteOffset":49292, + "target":34962 + }, + { + "buffer":0, + "byteLength":2816, + "byteOffset":53516, + "target":34962 + }, + { + "buffer":0, + "byteLength":2816, + "byteOffset":56332, + "target":34962 + }, + { + "buffer":0, + "byteLength":1956, + "byteOffset":59148, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":61104, + "uri":"Roof_Dormer_RoundTile.bin" + } + ] +} diff --git a/meshes/village/Roof_Dormer_RoundTile.gltf.import b/meshes/village/Roof_Dormer_RoundTile.gltf.import new file mode 100644 index 0000000..1e257f7 --- /dev/null +++ b/meshes/village/Roof_Dormer_RoundTile.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dnjf7jkhd6ktw" +path="res://.godot/imported/Roof_Dormer_RoundTile.gltf-3a6b71b4c4520317783373ff658f82cb.scn" + +[deps] + +source_file="res://meshes/village/Roof_Dormer_RoundTile.gltf" +dest_files=["res://.godot/imported/Roof_Dormer_RoundTile.gltf-3a6b71b4c4520317783373ff658f82cb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_FrontSupports.bin b/meshes/village/Roof_FrontSupports.bin new file mode 100644 index 0000000..63d5b15 Binary files /dev/null and b/meshes/village/Roof_FrontSupports.bin differ diff --git a/meshes/village/Roof_FrontSupports.gltf b/meshes/village/Roof_FrontSupports.gltf new file mode 100644 index 0000000..117258a --- /dev/null +++ b/meshes/village/Roof_FrontSupports.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_FrontSupports" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.108", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":120, + "max":[ + 2.7431282997131348, + 0.11292797327041626, + 0.6272619962692261 + ], + "min":[ + -2.7431302070617676, + -0.11826205253601074, + -0.027265047654509544 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":120, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":120, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":180, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1440, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":1440, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":2880, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":3840, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4200, + "uri":"Roof_FrontSupports.bin" + } + ] +} diff --git a/meshes/village/Roof_FrontSupports.gltf.import b/meshes/village/Roof_FrontSupports.gltf.import new file mode 100644 index 0000000..48af518 --- /dev/null +++ b/meshes/village/Roof_FrontSupports.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bnwm0a24kfpli" +path="res://.godot/imported/Roof_FrontSupports.gltf-e9e3ed1dc0918782066ede7cf69d76d1.scn" + +[deps] + +source_file="res://meshes/village/Roof_FrontSupports.gltf" +dest_files=["res://.godot/imported/Roof_FrontSupports.gltf-e9e3ed1dc0918782066ede7cf69d76d1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick2.bin b/meshes/village/Roof_Front_Brick2.bin new file mode 100644 index 0000000..e8c214f Binary files /dev/null and b/meshes/village/Roof_Front_Brick2.bin differ diff --git a/meshes/village/Roof_Front_Brick2.gltf b/meshes/village/Roof_Front_Brick2.gltf new file mode 100644 index 0000000..870d0a2 --- /dev/null +++ b/meshes/village/Roof_Front_Brick2.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.114", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":132, + "max":[ + 1.2748736143112183, + 1.6359994411468506, + 0.41629892587661743 + ], + "min":[ + -1.3322436809539795, + -0.13308730721473694, + -0.3349645733833313 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":132, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":132, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":198, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":16, + "max":[ + 1.1078823804855347, + 1.6417748928070068, + 7.195509397206479e-07 + ], + "min":[ + -1.1091320514678955, + 0.019167093560099602, + -0.20000086724758148 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1584, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1584, + "byteOffset":1584, + "target":34962 + }, + { + "buffer":0, + "byteLength":1056, + "byteOffset":3168, + "target":34962 + }, + { + "buffer":0, + "byteLength":396, + "byteOffset":4224, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":4620, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":4812, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":5004, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":5132, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5204, + "uri":"Roof_Front_Brick2.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick2.gltf.import b/meshes/village/Roof_Front_Brick2.gltf.import new file mode 100644 index 0000000..c2211bf --- /dev/null +++ b/meshes/village/Roof_Front_Brick2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cv5vcuicygn5a" +path="res://.godot/imported/Roof_Front_Brick2.gltf-697cce45648d1ef83bd163dd557e1d57.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick2.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick2.gltf-697cce45648d1ef83bd163dd557e1d57.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick4.bin b/meshes/village/Roof_Front_Brick4.bin new file mode 100644 index 0000000..0d337f8 Binary files /dev/null and b/meshes/village/Roof_Front_Brick4.bin differ diff --git a/meshes/village/Roof_Front_Brick4.gltf b/meshes/village/Roof_Front_Brick4.gltf new file mode 100644 index 0000000..f7d4518 --- /dev/null +++ b/meshes/village/Roof_Front_Brick4.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick4" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.182", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":352, + "max":[ + 2.215996026992798, + 2.6399998664855957, + 0.7941397428512573 + ], + "min":[ + -2.183807373046875, + -0.13180206716060638, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":352, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":352, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":720, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":16, + "max":[ + 2.188183546066284, + 2.9367027282714844, + 9.464429240324534e-12 + ], + "min":[ + -2.1137986183166504, + 0.019167041406035423, + -0.2497011125087738 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4224, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4224, + "byteOffset":4224, + "target":34962 + }, + { + "buffer":0, + "byteLength":2816, + "byteOffset":8448, + "target":34962 + }, + { + "buffer":0, + "byteLength":1440, + "byteOffset":11264, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":12704, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":12896, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":13088, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":13216, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13288, + "uri":"Roof_Front_Brick4.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick4.gltf.import b/meshes/village/Roof_Front_Brick4.gltf.import new file mode 100644 index 0000000..c876a1f --- /dev/null +++ b/meshes/village/Roof_Front_Brick4.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b7mjoyryltilk" +path="res://.godot/imported/Roof_Front_Brick4.gltf-481bd6d404490a397ae5361ec33bb2ca.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick4.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick4.gltf-481bd6d404490a397ae5361ec33bb2ca.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick4_Half_L.bin b/meshes/village/Roof_Front_Brick4_Half_L.bin new file mode 100644 index 0000000..8ffccc7 Binary files /dev/null and b/meshes/village/Roof_Front_Brick4_Half_L.bin differ diff --git a/meshes/village/Roof_Front_Brick4_Half_L.gltf b/meshes/village/Roof_Front_Brick4_Half_L.gltf new file mode 100644 index 0000000..4ce6c89 --- /dev/null +++ b/meshes/village/Roof_Front_Brick4_Half_L.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick4_Half_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1777", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":208, + "max":[ + 0.12940314412117004, + 3.0649166107177734, + 0.15459048748016357 + ], + "min":[ + -2.2807068824768066, + -0.13180206716060638, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":208, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":208, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":402, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":10, + "max":[ + 3.5677588661187087e-10, + 2.9367027282714844, + 9.464429240324534e-12 + ], + "min":[ + -2.188183546066284, + 0.019167041406035423, + -0.2497004270553589 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":10, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":10, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2496, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2496, + "byteOffset":2496, + "target":34962 + }, + { + "buffer":0, + "byteLength":1664, + "byteOffset":4992, + "target":34962 + }, + { + "buffer":0, + "byteLength":804, + "byteOffset":6656, + "target":34963 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":7460, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":7580, + "target":34962 + }, + { + "buffer":0, + "byteLength":80, + "byteOffset":7700, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":7780, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":7816, + "uri":"Roof_Front_Brick4_Half_L.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick4_Half_L.gltf.import b/meshes/village/Roof_Front_Brick4_Half_L.gltf.import new file mode 100644 index 0000000..4599e51 --- /dev/null +++ b/meshes/village/Roof_Front_Brick4_Half_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bk8h2nmhhdoq1" +path="res://.godot/imported/Roof_Front_Brick4_Half_L.gltf-189764e9fe05b90c9a9802e214bfec4a.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick4_Half_L.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick4_Half_L.gltf-189764e9fe05b90c9a9802e214bfec4a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick4_Half_R.bin b/meshes/village/Roof_Front_Brick4_Half_R.bin new file mode 100644 index 0000000..1439602 Binary files /dev/null and b/meshes/village/Roof_Front_Brick4_Half_R.bin differ diff --git a/meshes/village/Roof_Front_Brick4_Half_R.gltf b/meshes/village/Roof_Front_Brick4_Half_R.gltf new file mode 100644 index 0000000..25f8996 --- /dev/null +++ b/meshes/village/Roof_Front_Brick4_Half_R.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick4_Half_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1771", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":220, + "max":[ + 2.2869279384613037, + 3.0649166107177734, + 0.15459048748016357 + ], + "min":[ + -0.12940314412117004, + -0.13180206716060638, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":220, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":220, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":420, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":10, + "max":[ + 2.188183546066284, + 2.9367027282714844, + 9.464429240324534e-12 + ], + "min":[ + -3.5677588661187087e-10, + 0.019167041406035423, + -0.2497004270553589 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":10, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":10, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2640, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2640, + "byteOffset":2640, + "target":34962 + }, + { + "buffer":0, + "byteLength":1760, + "byteOffset":5280, + "target":34962 + }, + { + "buffer":0, + "byteLength":840, + "byteOffset":7040, + "target":34963 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":7880, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":8000, + "target":34962 + }, + { + "buffer":0, + "byteLength":80, + "byteOffset":8120, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":8200, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8236, + "uri":"Roof_Front_Brick4_Half_R.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick4_Half_R.gltf.import b/meshes/village/Roof_Front_Brick4_Half_R.gltf.import new file mode 100644 index 0000000..054ba40 --- /dev/null +++ b/meshes/village/Roof_Front_Brick4_Half_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bcaotfbmplq1e" +path="res://.godot/imported/Roof_Front_Brick4_Half_R.gltf-6d9334460b410efa420a5a0da3bff04c.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick4_Half_R.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick4_Half_R.gltf-6d9334460b410efa420a5a0da3bff04c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick6.bin b/meshes/village/Roof_Front_Brick6.bin new file mode 100644 index 0000000..02ec5fc Binary files /dev/null and b/meshes/village/Roof_Front_Brick6.bin differ diff --git a/meshes/village/Roof_Front_Brick6.gltf b/meshes/village/Roof_Front_Brick6.gltf new file mode 100644 index 0000000..dbf4e3f --- /dev/null +++ b/meshes/village/Roof_Front_Brick6.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick6" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.101", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":504, + "max":[ + 3.347877264022827, + 4.383981704711914, + 0.7941403388977051 + ], + "min":[ + -3.346518039703369, + -0.13180209696292877, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":504, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":504, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":936, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":20, + "max":[ + 3.1225504875183105, + 4.377229690551758, + 1.375610736431554e-11 + ], + "min":[ + -3.1225504875183105, + 0.019167041406035423, + -0.24970144033432007 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":20, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":20, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6048, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6048, + "byteOffset":6048, + "target":34962 + }, + { + "buffer":0, + "byteLength":4032, + "byteOffset":12096, + "target":34962 + }, + { + "buffer":0, + "byteLength":1872, + "byteOffset":16128, + "target":34963 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":18000, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":18240, + "target":34962 + }, + { + "buffer":0, + "byteLength":160, + "byteOffset":18480, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":18640, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":18736, + "uri":"Roof_Front_Brick6.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick6.gltf.import b/meshes/village/Roof_Front_Brick6.gltf.import new file mode 100644 index 0000000..4c6afe1 --- /dev/null +++ b/meshes/village/Roof_Front_Brick6.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dquh5qx7gbnr4" +path="res://.godot/imported/Roof_Front_Brick6.gltf-e86453b61a3aa72c98070901e0a2073c.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick6.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick6.gltf-e86453b61a3aa72c98070901e0a2073c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick6_Half_L.bin b/meshes/village/Roof_Front_Brick6_Half_L.bin new file mode 100644 index 0000000..2c32bc6 Binary files /dev/null and b/meshes/village/Roof_Front_Brick6_Half_L.bin differ diff --git a/meshes/village/Roof_Front_Brick6_Half_L.gltf b/meshes/village/Roof_Front_Brick6_Half_L.gltf new file mode 100644 index 0000000..df97dc1 --- /dev/null +++ b/meshes/village/Roof_Front_Brick6_Half_L.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick6_Half_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1775", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":296, + "max":[ + 0.05047214403748512, + 4.383981704711914, + 0.15459108352661133 + ], + "min":[ + -3.363842248916626, + -0.13180209696292877, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":296, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":296, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":534, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 3.5677588661187087e-10, + 4.377229690551758, + 9.464429240324534e-12 + ], + "min":[ + -3.1225504875183105, + 0.019167041406035423, + -0.2497004270553589 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":24, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3552, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3552, + "byteOffset":3552, + "target":34962 + }, + { + "buffer":0, + "byteLength":2368, + "byteOffset":7104, + "target":34962 + }, + { + "buffer":0, + "byteLength":1068, + "byteOffset":9472, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":10540, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":10684, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":10828, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":10924, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":10972, + "uri":"Roof_Front_Brick6_Half_L.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick6_Half_L.gltf.import b/meshes/village/Roof_Front_Brick6_Half_L.gltf.import new file mode 100644 index 0000000..80ecc25 --- /dev/null +++ b/meshes/village/Roof_Front_Brick6_Half_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c3hbywy3hspwr" +path="res://.godot/imported/Roof_Front_Brick6_Half_L.gltf-ee721f627f12a95abcaa16d53172389c.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick6_Half_L.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick6_Half_L.gltf-ee721f627f12a95abcaa16d53172389c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick6_Half_R.bin b/meshes/village/Roof_Front_Brick6_Half_R.bin new file mode 100644 index 0000000..95be31a Binary files /dev/null and b/meshes/village/Roof_Front_Brick6_Half_R.bin differ diff --git a/meshes/village/Roof_Front_Brick6_Half_R.gltf b/meshes/village/Roof_Front_Brick6_Half_R.gltf new file mode 100644 index 0000000..fdd937d --- /dev/null +++ b/meshes/village/Roof_Front_Brick6_Half_R.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick6_Half_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1769", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":296, + "max":[ + 3.349721908569336, + 4.383981704711914, + 0.15459108352661133 + ], + "min":[ + -0.05047214403748512, + -0.13180209696292877, + -0.33496367931365967 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":296, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":296, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":534, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 3.1225504875183105, + 4.377229690551758, + 9.464429240324534e-12 + ], + "min":[ + -3.5677588661187087e-10, + 0.019167041406035423, + -0.2497004270553589 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":24, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3552, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3552, + "byteOffset":3552, + "target":34962 + }, + { + "buffer":0, + "byteLength":2368, + "byteOffset":7104, + "target":34962 + }, + { + "buffer":0, + "byteLength":1068, + "byteOffset":9472, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":10540, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":10684, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":10828, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":10924, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":10972, + "uri":"Roof_Front_Brick6_Half_R.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick6_Half_R.gltf.import b/meshes/village/Roof_Front_Brick6_Half_R.gltf.import new file mode 100644 index 0000000..3acfb31 --- /dev/null +++ b/meshes/village/Roof_Front_Brick6_Half_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1sc7exhravy6" +path="res://.godot/imported/Roof_Front_Brick6_Half_R.gltf-42e659066f9adb2e4ed786b67ab9ba5f.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick6_Half_R.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick6_Half_R.gltf-42e659066f9adb2e4ed786b67ab9ba5f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick8.bin b/meshes/village/Roof_Front_Brick8.bin new file mode 100644 index 0000000..c620fce Binary files /dev/null and b/meshes/village/Roof_Front_Brick8.bin differ diff --git a/meshes/village/Roof_Front_Brick8.gltf b/meshes/village/Roof_Front_Brick8.gltf new file mode 100644 index 0000000..fd58d03 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick8" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.166", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":596, + "max":[ + 4.256076812744141, + 5.269639492034912, + 0.794139564037323 + ], + "min":[ + -4.254717826843262, + -0.13180209696292877, + -0.33496370911598206 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":596, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":596, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":1056, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":16, + "max":[ + 4.1627702713012695, + 5.314065933227539, + 1.6825651982799172e-11 + ], + "min":[ + -4.1627702713012695, + 0.019167065620422363, + -0.24970084428787231 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":7152, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":7152, + "byteOffset":7152, + "target":34962 + }, + { + "buffer":0, + "byteLength":4768, + "byteOffset":14304, + "target":34962 + }, + { + "buffer":0, + "byteLength":2112, + "byteOffset":19072, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":21184, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":21376, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":21568, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":21696, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":21768, + "uri":"Roof_Front_Brick8.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick8.gltf.import b/meshes/village/Roof_Front_Brick8.gltf.import new file mode 100644 index 0000000..404f673 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bjtlxky68igt0" +path="res://.godot/imported/Roof_Front_Brick8.gltf-5af7822d5428940c24dd6972e7b21492.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick8.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick8.gltf-5af7822d5428940c24dd6972e7b21492.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick8_Half_L.bin b/meshes/village/Roof_Front_Brick8_Half_L.bin new file mode 100644 index 0000000..168af24 Binary files /dev/null and b/meshes/village/Roof_Front_Brick8_Half_L.bin differ diff --git a/meshes/village/Roof_Front_Brick8_Half_L.gltf b/meshes/village/Roof_Front_Brick8_Half_L.gltf new file mode 100644 index 0000000..88c1b26 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8_Half_L.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick8_Half_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1776", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":342, + "max":[ + 0.05047214403748512, + 5.269639492034912, + 0.15459030866622925 + ], + "min":[ + -4.276051998138428, + -0.13180209696292877, + -0.33496370911598206 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":342, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":594, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":10, + "max":[ + 3.567816042604477e-10, + 5.314065933227539, + 1.1510792319313623e-11 + ], + "min":[ + -4.1627702713012695, + 0.019167065620422363, + -0.24970084428787231 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":10, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":10, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4104, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4104, + "byteOffset":4104, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":8208, + "target":34962 + }, + { + "buffer":0, + "byteLength":1188, + "byteOffset":10944, + "target":34963 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":12132, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":12252, + "target":34962 + }, + { + "buffer":0, + "byteLength":80, + "byteOffset":12372, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":12452, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":12488, + "uri":"Roof_Front_Brick8_Half_L.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick8_Half_L.gltf.import b/meshes/village/Roof_Front_Brick8_Half_L.gltf.import new file mode 100644 index 0000000..6a26489 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8_Half_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cxvtm6fgu5i8a" +path="res://.godot/imported/Roof_Front_Brick8_Half_L.gltf-3e82bf6d299df44e64d9ac4c37e58219.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick8_Half_L.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick8_Half_L.gltf-3e82bf6d299df44e64d9ac4c37e58219.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Front_Brick8_Half_R.bin b/meshes/village/Roof_Front_Brick8_Half_R.bin new file mode 100644 index 0000000..79faef2 Binary files /dev/null and b/meshes/village/Roof_Front_Brick8_Half_R.bin differ diff --git a/meshes/village/Roof_Front_Brick8_Half_R.gltf b/meshes/village/Roof_Front_Brick8_Half_R.gltf new file mode 100644 index 0000000..b37bd18 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8_Half_R.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Front_Brick8_Half_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.1770", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":342, + "max":[ + 4.2988057136535645, + 5.269639492034912, + 0.15459030866622925 + ], + "min":[ + -0.05047214403748512, + -0.13180209696292877, + -0.33496370911598206 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":342, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":342, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":594, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":10, + "max":[ + 4.1627702713012695, + 5.314065933227539, + 1.1510792319313623e-11 + ], + "min":[ + -3.567816042604477e-10, + 0.019167065620422363, + -0.24970084428787231 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":10, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":10, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4104, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4104, + "byteOffset":4104, + "target":34962 + }, + { + "buffer":0, + "byteLength":2736, + "byteOffset":8208, + "target":34962 + }, + { + "buffer":0, + "byteLength":1188, + "byteOffset":10944, + "target":34963 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":12132, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":12252, + "target":34962 + }, + { + "buffer":0, + "byteLength":80, + "byteOffset":12372, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":12452, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":12488, + "uri":"Roof_Front_Brick8_Half_R.bin" + } + ] +} diff --git a/meshes/village/Roof_Front_Brick8_Half_R.gltf.import b/meshes/village/Roof_Front_Brick8_Half_R.gltf.import new file mode 100644 index 0000000..dbbbda3 --- /dev/null +++ b/meshes/village/Roof_Front_Brick8_Half_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b6481e72w2lj7" +path="res://.godot/imported/Roof_Front_Brick8_Half_R.gltf-2536dda7bfd200343a59b2e64f0185bd.scn" + +[deps] + +source_file="res://meshes/village/Roof_Front_Brick8_Half_R.gltf" +dest_files=["res://.godot/imported/Roof_Front_Brick8_Half_R.gltf-2536dda7bfd200343a59b2e64f0185bd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Log.bin b/meshes/village/Roof_Log.bin new file mode 100644 index 0000000..873e61b Binary files /dev/null and b/meshes/village/Roof_Log.bin differ diff --git a/meshes/village/Roof_Log.gltf b/meshes/village/Roof_Log.gltf new file mode 100644 index 0000000..0713bf5 --- /dev/null +++ b/meshes/village/Roof_Log.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Log" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.014", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":176, + "max":[ + 0.5626109838485718, + 5.235671520233154, + 5.347897529602051 + ], + "min":[ + -0.5863194465637207, + 3.848724842071533, + -5.347897529602051 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":176, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":176, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":492, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2112, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2112, + "byteOffset":2112, + "target":34962 + }, + { + "buffer":0, + "byteLength":1408, + "byteOffset":4224, + "target":34962 + }, + { + "buffer":0, + "byteLength":984, + "byteOffset":5632, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6616, + "uri":"Roof_Log.bin" + } + ] +} diff --git a/meshes/village/Roof_Log.gltf.import b/meshes/village/Roof_Log.gltf.import new file mode 100644 index 0000000..60444be --- /dev/null +++ b/meshes/village/Roof_Log.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://2aexe36s0fn6" +path="res://.godot/imported/Roof_Log.gltf-d162c90dab8e3695265727d26944e413.scn" + +[deps] + +source_file="res://meshes/village/Roof_Log.gltf" +dest_files=["res://.godot/imported/Roof_Log.gltf-d162c90dab8e3695265727d26944e413.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Modular_RoundTiles.bin b/meshes/village/Roof_Modular_RoundTiles.bin new file mode 100644 index 0000000..eca47c2 Binary files /dev/null and b/meshes/village/Roof_Modular_RoundTiles.bin differ diff --git a/meshes/village/Roof_Modular_RoundTiles.gltf b/meshes/village/Roof_Modular_RoundTiles.gltf new file mode 100644 index 0000000..4ac2b70 --- /dev/null +++ b/meshes/village/Roof_Modular_RoundTiles.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Modular_RoundTiles" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.145", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":160, + "max":[ + 0.3307531774044037, + 0.5118770003318787, + 1.045536756515503 + ], + "min":[ + -0.33246704936027527, + 0.006394326686859131, + -1.2061223983764648 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":160, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":160, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":160, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":408, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1920, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":1920, + "target":34962 + }, + { + "buffer":0, + "byteLength":1280, + "byteOffset":3840, + "target":34962 + }, + { + "buffer":0, + "byteLength":1280, + "byteOffset":5120, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":6400, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":7216, + "uri":"Roof_Modular_RoundTiles.bin" + } + ] +} diff --git a/meshes/village/Roof_Modular_RoundTiles.gltf.import b/meshes/village/Roof_Modular_RoundTiles.gltf.import new file mode 100644 index 0000000..5589b53 --- /dev/null +++ b/meshes/village/Roof_Modular_RoundTiles.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bjdq6m4mvcnrf" +path="res://.godot/imported/Roof_Modular_RoundTiles.gltf-d0b60702cfed1cc4c58a0ce0ed5c395c.scn" + +[deps] + +source_file="res://meshes/village/Roof_Modular_RoundTiles.gltf" +dest_files=["res://.godot/imported/Roof_Modular_RoundTiles.gltf-d0b60702cfed1cc4c58a0ce0ed5c395c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTile_2x1.bin b/meshes/village/Roof_RoundTile_2x1.bin new file mode 100644 index 0000000..aaa4c6e Binary files /dev/null and b/meshes/village/Roof_RoundTile_2x1.bin differ diff --git a/meshes/village/Roof_RoundTile_2x1.gltf b/meshes/village/Roof_RoundTile_2x1.gltf new file mode 100644 index 0000000..3ef2e6c --- /dev/null +++ b/meshes/village/Roof_RoundTile_2x1.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTile_2x1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cylinder.008", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":514, + "max":[ + 1.6485117673873901, + 2.317312717437744, + 1.483274221420288 + ], + "min":[ + -1.6485117673873901, + -0.20367643237113953, + -0.4689145088195801 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":514, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":514, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":514, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1212, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":356, + "max":[ + 1.5365829467773438, + 1.903069019317627, + 1.4169508218765259 + ], + "min":[ + -1.5365829467773438, + -0.34155815839767456, + -0.41289833188056946 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":356, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":356, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":356, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":624, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6168, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6168, + "byteOffset":6168, + "target":34962 + }, + { + "buffer":0, + "byteLength":4112, + "byteOffset":12336, + "target":34962 + }, + { + "buffer":0, + "byteLength":4112, + "byteOffset":16448, + "target":34962 + }, + { + "buffer":0, + "byteLength":2424, + "byteOffset":20560, + "target":34963 + }, + { + "buffer":0, + "byteLength":4272, + "byteOffset":22984, + "target":34962 + }, + { + "buffer":0, + "byteLength":4272, + "byteOffset":27256, + "target":34962 + }, + { + "buffer":0, + "byteLength":2848, + "byteOffset":31528, + "target":34962 + }, + { + "buffer":0, + "byteLength":2848, + "byteOffset":34376, + "target":34962 + }, + { + "buffer":0, + "byteLength":1248, + "byteOffset":37224, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":38472, + "uri":"Roof_RoundTile_2x1.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTile_2x1.gltf.import b/meshes/village/Roof_RoundTile_2x1.gltf.import new file mode 100644 index 0000000..08f1505 --- /dev/null +++ b/meshes/village/Roof_RoundTile_2x1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://be6mltv3k6ppm" +path="res://.godot/imported/Roof_RoundTile_2x1.gltf-0913eb202e1e0dba8af945bc8e4920d0.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTile_2x1.gltf" +dest_files=["res://.godot/imported/Roof_RoundTile_2x1.gltf-0913eb202e1e0dba8af945bc8e4920d0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTile_2x1_Long.bin b/meshes/village/Roof_RoundTile_2x1_Long.bin new file mode 100644 index 0000000..46780d1 Binary files /dev/null and b/meshes/village/Roof_RoundTile_2x1_Long.bin differ diff --git a/meshes/village/Roof_RoundTile_2x1_Long.gltf b/meshes/village/Roof_RoundTile_2x1_Long.gltf new file mode 100644 index 0000000..b147ec3 --- /dev/null +++ b/meshes/village/Roof_RoundTile_2x1_Long.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTile_2x1_Long" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cylinder.006", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":516, + "max":[ + 2.173652172088623, + 2.317312717437744, + 1.483274221420288 + ], + "min":[ + -2.1736536026000977, + -0.8092353343963623, + -0.4689145088195801 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":516, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":516, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":516, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":1212, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":388, + "max":[ + 2.0059471130371094, + 1.903069019317627, + 1.4169507026672363 + ], + "min":[ + -2.005948543548584, + -1.008133888244629, + -0.4128984212875366 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":388, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":388, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":388, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":672, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6192, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6192, + "byteOffset":6192, + "target":34962 + }, + { + "buffer":0, + "byteLength":4128, + "byteOffset":12384, + "target":34962 + }, + { + "buffer":0, + "byteLength":4128, + "byteOffset":16512, + "target":34962 + }, + { + "buffer":0, + "byteLength":2424, + "byteOffset":20640, + "target":34963 + }, + { + "buffer":0, + "byteLength":4656, + "byteOffset":23064, + "target":34962 + }, + { + "buffer":0, + "byteLength":4656, + "byteOffset":27720, + "target":34962 + }, + { + "buffer":0, + "byteLength":3104, + "byteOffset":32376, + "target":34962 + }, + { + "buffer":0, + "byteLength":3104, + "byteOffset":35480, + "target":34962 + }, + { + "buffer":0, + "byteLength":1344, + "byteOffset":38584, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":39928, + "uri":"Roof_RoundTile_2x1_Long.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTile_2x1_Long.gltf.import b/meshes/village/Roof_RoundTile_2x1_Long.gltf.import new file mode 100644 index 0000000..ead4a03 --- /dev/null +++ b/meshes/village/Roof_RoundTile_2x1_Long.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dsoypa4llth5e" +path="res://.godot/imported/Roof_RoundTile_2x1_Long.gltf-27b6fe1be03ffa1ac5ee6cc0aea4b385.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTile_2x1_Long.gltf" +dest_files=["res://.godot/imported/Roof_RoundTile_2x1_Long.gltf-27b6fe1be03ffa1ac5ee6cc0aea4b385.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_4x4.bin b/meshes/village/Roof_RoundTiles_4x4.bin new file mode 100644 index 0000000..617878d Binary files /dev/null and b/meshes/village/Roof_RoundTiles_4x4.bin differ diff --git a/meshes/village/Roof_RoundTiles_4x4.gltf b/meshes/village/Roof_RoundTiles_4x4.gltf new file mode 100644 index 0000000..d1ca604 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x4.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_4x4" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.110", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1176, + "max":[ + 2.5676212310791016, + 3.200705051422119, + 2.7454771995544434 + ], + "min":[ + -2.5676212310791016, + -0.5157185792922974, + -2.73990797996521 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1176, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1176, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1176, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2160, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":1204, + "max":[ + 2.756538152694702, + 3.7336742877960205, + 2.8215668201446533 + ], + "min":[ + -2.756538152694702, + -0.3878333568572998, + -2.7018470764160156 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":1204, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":1204, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":1204, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":3828, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":14112, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":14112, + "byteOffset":14112, + "target":34962 + }, + { + "buffer":0, + "byteLength":9408, + "byteOffset":28224, + "target":34962 + }, + { + "buffer":0, + "byteLength":9408, + "byteOffset":37632, + "target":34962 + }, + { + "buffer":0, + "byteLength":4320, + "byteOffset":47040, + "target":34963 + }, + { + "buffer":0, + "byteLength":14448, + "byteOffset":51360, + "target":34962 + }, + { + "buffer":0, + "byteLength":14448, + "byteOffset":65808, + "target":34962 + }, + { + "buffer":0, + "byteLength":9632, + "byteOffset":80256, + "target":34962 + }, + { + "buffer":0, + "byteLength":9632, + "byteOffset":89888, + "target":34962 + }, + { + "buffer":0, + "byteLength":7656, + "byteOffset":99520, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":107176, + "uri":"Roof_RoundTiles_4x4.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_4x4.gltf.import b/meshes/village/Roof_RoundTiles_4x4.gltf.import new file mode 100644 index 0000000..6ff81d7 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x4.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dc4ynch2n1ish" +path="res://.godot/imported/Roof_RoundTiles_4x4.gltf-2f2e5b01368ddac26a92a661229a23db.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_4x4.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_4x4.gltf-2f2e5b01368ddac26a92a661229a23db.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_4x6.bin b/meshes/village/Roof_RoundTiles_4x6.bin new file mode 100644 index 0000000..c7e538d Binary files /dev/null and b/meshes/village/Roof_RoundTiles_4x6.bin differ diff --git a/meshes/village/Roof_RoundTiles_4x6.gltf b/meshes/village/Roof_RoundTiles_4x6.gltf new file mode 100644 index 0000000..272d57f --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x6.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_4x6" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.074", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1184, + "max":[ + 2.5676212310791016, + 3.200705051422119, + 3.7862460613250732 + ], + "min":[ + -2.5676212310791016, + -0.5157185792922974, + -3.786034345626831 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1184, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1184, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1184, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2160, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":1684, + "max":[ + 2.756538152694702, + 3.7178683280944824, + 3.757296562194824 + ], + "min":[ + -2.756538152694702, + -0.3878333568572998, + -3.726191759109497 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":1684, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":1684, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":1684, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":5400, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":14208, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":14208, + "byteOffset":14208, + "target":34962 + }, + { + "buffer":0, + "byteLength":9472, + "byteOffset":28416, + "target":34962 + }, + { + "buffer":0, + "byteLength":9472, + "byteOffset":37888, + "target":34962 + }, + { + "buffer":0, + "byteLength":4320, + "byteOffset":47360, + "target":34963 + }, + { + "buffer":0, + "byteLength":20208, + "byteOffset":51680, + "target":34962 + }, + { + "buffer":0, + "byteLength":20208, + "byteOffset":71888, + "target":34962 + }, + { + "buffer":0, + "byteLength":13472, + "byteOffset":92096, + "target":34962 + }, + { + "buffer":0, + "byteLength":13472, + "byteOffset":105568, + "target":34962 + }, + { + "buffer":0, + "byteLength":10800, + "byteOffset":119040, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":129840, + "uri":"Roof_RoundTiles_4x6.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_4x6.gltf.import b/meshes/village/Roof_RoundTiles_4x6.gltf.import new file mode 100644 index 0000000..b1bbb70 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x6.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://biflsp04oh0ca" +path="res://.godot/imported/Roof_RoundTiles_4x6.gltf-57a528ca56fd9df5b32cf0fe0d677fd8.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_4x6.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_4x6.gltf-57a528ca56fd9df5b32cf0fe0d677fd8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_4x8.bin b/meshes/village/Roof_RoundTiles_4x8.bin new file mode 100644 index 0000000..8d89631 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_4x8.bin differ diff --git a/meshes/village/Roof_RoundTiles_4x8.gltf b/meshes/village/Roof_RoundTiles_4x8.gltf new file mode 100644 index 0000000..f463a36 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x8.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_4x8" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.060", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1328, + "max":[ + 2.5676212310791016, + 3.200705051422119, + 4.828753471374512 + ], + "min":[ + -2.5676212310791016, + -0.5157185792922974, + -4.828753471374512 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1328, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1328, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1328, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2376, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":2138, + "max":[ + 2.756538152694702, + 3.713447093963623, + 4.8539862632751465 + ], + "min":[ + -2.756538152694702, + -0.3878333568572998, + -4.756110191345215 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":2138, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":2138, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":2138, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":6972, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":15936, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":15936, + "byteOffset":15936, + "target":34962 + }, + { + "buffer":0, + "byteLength":10624, + "byteOffset":31872, + "target":34962 + }, + { + "buffer":0, + "byteLength":10624, + "byteOffset":42496, + "target":34962 + }, + { + "buffer":0, + "byteLength":4752, + "byteOffset":53120, + "target":34963 + }, + { + "buffer":0, + "byteLength":25656, + "byteOffset":57872, + "target":34962 + }, + { + "buffer":0, + "byteLength":25656, + "byteOffset":83528, + "target":34962 + }, + { + "buffer":0, + "byteLength":17104, + "byteOffset":109184, + "target":34962 + }, + { + "buffer":0, + "byteLength":17104, + "byteOffset":126288, + "target":34962 + }, + { + "buffer":0, + "byteLength":13944, + "byteOffset":143392, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":157336, + "uri":"Roof_RoundTiles_4x8.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_4x8.gltf.import b/meshes/village/Roof_RoundTiles_4x8.gltf.import new file mode 100644 index 0000000..6cd0976 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_4x8.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dfbroep7o75cl" +path="res://.godot/imported/Roof_RoundTiles_4x8.gltf-a55109c9807c6e2431ba8bae4a3312cf.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_4x8.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_4x8.gltf-a55109c9807c6e2431ba8bae4a3312cf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x10.bin b/meshes/village/Roof_RoundTiles_6x10.bin new file mode 100644 index 0000000..c96305b Binary files /dev/null and b/meshes/village/Roof_RoundTiles_6x10.bin differ diff --git a/meshes/village/Roof_RoundTiles_6x10.gltf b/meshes/village/Roof_RoundTiles_6x10.gltf new file mode 100644 index 0000000..4ed0072 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x10.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x10" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.030", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1640, + "max":[ + 3.958951234817505, + 4.342607498168945, + 5.828753471374512 + ], + "min":[ + -3.958951234817505, + -0.7821269035339355, + -5.828753471374512 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1640, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":2968, + "max":[ + 4.124891757965088, + 4.890044689178467, + 5.954605579376221 + ], + "min":[ + -4.124891757965088, + -0.6384454965591431, + -5.897581100463867 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":2968, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":2968, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":2968, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":10188, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19680, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19680, + "byteOffset":19680, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":39360, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":52480, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65600, + "target":34963 + }, + { + "buffer":0, + "byteLength":35616, + "byteOffset":71024, + "target":34962 + }, + { + "buffer":0, + "byteLength":35616, + "byteOffset":106640, + "target":34962 + }, + { + "buffer":0, + "byteLength":23744, + "byteOffset":142256, + "target":34962 + }, + { + "buffer":0, + "byteLength":23744, + "byteOffset":166000, + "target":34962 + }, + { + "buffer":0, + "byteLength":20376, + "byteOffset":189744, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":210120, + "uri":"Roof_RoundTiles_6x10.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x10.gltf.import b/meshes/village/Roof_RoundTiles_6x10.gltf.import new file mode 100644 index 0000000..d3427cd --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x10.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://txpe257rsot7" +path="res://.godot/imported/Roof_RoundTiles_6x10.gltf-80a557e02614819758f54d754b94c6d2.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x10.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x10.gltf-80a557e02614819758f54d754b94c6d2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x12.bin b/meshes/village/Roof_RoundTiles_6x12.bin new file mode 100644 index 0000000..1507c89 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x12.bin @@ -0,0 +1,1172 @@ + 嵻Vy@;@ 嵻Vy@;@ 嵻Vy@;@ 嵻Vy@;@@wvx@#@@wvx@#@@wvx@#@@wvx@#@廤@;@廤@;@廤@;@廤@#@廤@#@廤@#@4px9H=@4px9H=@4px9H=@4px9H&@4px9H&@4px9H&@u_}=@u_}=@u_}=@u_}&@u_}&@u_}&@aտ?$@aտ?$@aտ?$@VA?;@VA?;@VA?;@aտ?;@aտ?;@aտ?;@VA?$@VA?$@VA?$@Y#]?%@Y#]?%@Y#]?%@$G4?<@$G4?<@$G4?<@Y#]?<@Y#]?<@Y#]?<@$G4?%@$G4?%@$G4?%@B>&@B>&@B>&@u15'>=@u15'>=@u15'>=@B>=@B>=@B>=@u15'>&@u15'>&@u15'>&@ +ó?;@ +ó?;@ +ó?;@՞?$@՞?$@՞?$@ ó?$@ ó?$@ ó?$@՞?;@՞?;@՞?;@KOJ@;@KOJ@;@KOJ@;@&ɂ@@#@&ɂ@@#@&ɂ@@#@KOJ@#@KOJ@#@KOJ@#@+ɂ@@;@+ɂ@@;@+ɂ@@;@4p@x9H=@4p@x9H=@4p@x9H=@4p@x9H&@4p@x9H&@4p@x9H&@u_}@=@u_}@=@u_}@=@u_}@&@u_}@&@u_}@&@a??$@a??$@a??$@V?A?;@V?A?;@V?A?;@a??;@a??;@a??;@V?A?$@V?A?$@V?A?$@Y#@]?%@Y#@]?%@Y#@]?%@$@G4?<@$@G4?<@$@G4?<@Y#@]?<@Y#@]?<@Y#@]?<@$@G4?%@$@G4?%@$@G4?%@B@>&@B@>&@B@>&@u15@'>=@u15@'>=@u15@'>=@B@>=@B@>=@B@>=@u15@'>&@u15@'>&@u15@'>&@ +@ó?;@ +@ó?;@ +@ó?;@?՞?$@?՞?$@?՞?$@ @ó?$@ @ó?$@ @ó?$@?՞?;@?՞?;@?՞?;@KO?J@;@KO?J@;@KO?J@;@&?ɂ@@#@&?ɂ@@#@&?ɂ@@#@KO?J@#@KO?J@#@KO?J@#@+?ɂ@@;@+?ɂ@@;@+?ɂ@@;@ 嵻Vy@^F@ 嵻Vy@^F@ 嵻Vy@^F@ 嵻Vy@^F@@wvx@F@@wvx@F@@wvx@F@@wvx@F@廤@^F@廤@^F@廤@^F@廤@F@廤@F@廤@F@4px9H`F@4px9H`F@4px9H`F@4px9HI@4px9HI@4px9HI@u_}`F@u_}`F@u_}`F@u_}I@u_}I@u_}I@aտ?G@aտ?G@aտ?G@VA?^F@VA?^F@VA?^F@aտ?^F@aտ?^F@aտ?^F@VA?G@VA?G@VA?G@Y#]?H@Y#]?H@Y#]?H@$G4?_F@$G4?_F@$G4?_F@Y#]?_F@Y#]?_F@Y#]?_F@$G4?H@$G4?H@$G4?H@B>I@B>I@B>I@u15'>`F@u15'>`F@u15'>`F@B>`F@B>`F@B>`F@u15'>I@u15'>I@u15'>I@ +ó?^F@ +ó?^F@ +ó?^F@՞?G@՞?G@՞?G@ ó?G@ ó?G@ ó?G@՞?^F@՞?^F@՞?^F@KOJ@^F@KOJ@^F@KOJ@^F@&ɂ@@F@&ɂ@@F@&ɂ@@F@KOJ@F@KOJ@F@KOJ@F@+ɂ@@^F@+ɂ@@^F@+ɂ@@^F@4p@x9H`F@4p@x9H`F@4p@x9H`F@4p@x9HI@4p@x9HI@4p@x9HI@u_}@`F@u_}@`F@u_}@`F@u_}@I@u_}@I@u_}@I@a??G@a??G@a??G@V?A?^F@V?A?^F@V?A?^F@a??^F@a??^F@a??^F@V?A?G@V?A?G@V?A?G@Y#@]?H@Y#@]?H@Y#@]?H@$@G4?_F@$@G4?_F@$@G4?_F@Y#@]?_F@Y#@]?_F@Y#@]?_F@$@G4?H@$@G4?H@$@G4?H@B@>I@B@>I@B@>I@u15@'>`F@u15@'>`F@u15@'>`F@B@>`F@B@>`F@B@>`F@u15@'>I@u15@'>I@u15@'>I@ +@ó?^F@ +@ó?^F@ +@ó?^F@?՞?G@?՞?G@?՞?G@ @ó?G@ @ó?G@ @ó?G@?՞?^F@?՞?^F@?՞?^F@KO?J@^F@KO?J@^F@KO?J@^F@&?ɂ@@F@&?ɂ@@F@&?ɂ@@F@KO?J@F@KO?J@F@KO?J@F@+?ɂ@@^F@+?ɂ@@^F@+?ɂ@@^F@ 嵻Vy@; 嵻Vy@; 嵻Vy@; 嵻Vy@;@wvx@#@wvx@#@wvx@#@wvx@#廤@;廤@;廤@;廤@#廤@#廤@#4px9H=4px9H=4px9H=4px9H&4px9H&4px9H&u_}=u_}=u_}=u_}&u_}&u_}&aտ?$aտ?$aտ?$VA?;VA?;VA?;aտ?;aտ?;aտ?;VA?$VA?$VA?$Y#]?%Y#]?%Y#]?%$G4?<$G4?<$G4?<Y#]?<Y#]?<Y#]?<$G4?%$G4?%$G4?%B>&B>&B>&u15'>=u15'>=u15'>=B>=B>=B>=u15'>&u15'>&u15'>& +ó?; +ó?; +ó?;՞?$՞?$՞?$ ó?$ ó?$ ó?$՞?;՞?;՞?;KOJ@;KOJ@;KOJ@;&ɂ@@#&ɂ@@#&ɂ@@#KOJ@#KOJ@#KOJ@#+ɂ@@;+ɂ@@;+ɂ@@;4p@x9H=4p@x9H=4p@x9H=4p@x9H&4p@x9H&4p@x9H&u_}@=u_}@=u_}@=u_}@&u_}@&u_}@&a??$a??$a??$V?A?;V?A?;V?A?;a??;a??;a??;V?A?$V?A?$V?A?$Y#@]?%Y#@]?%Y#@]?%$@G4?<$@G4?<$@G4?<Y#@]?<Y#@]?<Y#@]?<$@G4?%$@G4?%$@G4?%B@>&B@>&B@>&u15@'>=u15@'>=u15@'>=B@>=B@>=B@>=u15@'>&u15@'>&u15@'>& +@ó?; +@ó?; +@ó?;?՞?$?՞?$?՞?$ @ó?$ @ó?$ @ó?$?՞?;?՞?;?՞?;KO?J@;KO?J@;KO?J@;&?ɂ@@#&?ɂ@@#&?ɂ@@#KO?J@#KO?J@#KO?J@#+?ɂ@@;+?ɂ@@;+?ɂ@@; 嵻Vy@ҿ 嵻Vy@ҿ 嵻Vy@ҿ 嵻Vy@ҿ@wvx@7@wvx@7@wvx@7@wvx@7廤@ҿ廤@ҿ廤@ҿ廤@7廤@7廤@74px9Hҿ4px9Hҿ4px9Hҿ4px9H74px9H74px9H7u_}ҿu_}ҿu_}ҿu_}7u_}7u_}7aտ?7aտ?7aտ?7VA?ҿVA?ҿVA?ҿaտ?ҿaտ?ҿaտ?ҿVA?7VA?7VA?7Y#]?7Y#]?7Y#]?7$G4?ҿ$G4?ҿ$G4?ҿY#]?ҿY#]?ҿY#]?ҿ$G4?7$G4?7$G4?7B>7B>7B>7u15'>ҿu15'>ҿu15'>ҿB>ҿB>ҿB>ҿu15'>7u15'>7u15'>7 +ó?ҿ +ó?ҿ +ó?ҿ՞?7՞?7՞?7 ó?7 ó?7 ó?7՞?ҿ՞?ҿ՞?ҿKOJ@ҿKOJ@ҿKOJ@ҿ&ɂ@@7&ɂ@@7&ɂ@@7KOJ@7KOJ@7KOJ@7+ɂ@@ҿ+ɂ@@ҿ+ɂ@@ҿ4p@x9Hҿ4p@x9Hҿ4p@x9Hҿ4p@x9H74p@x9H74p@x9H7u_}@ҿu_}@ҿu_}@ҿu_}@7u_}@7u_}@7a??7a??7a??7V?A?ҿV?A?ҿV?A?ҿa??ҿa??ҿa??ҿV?A?7V?A?7V?A?7Y#@]?7Y#@]?7Y#@]?7$@G4?ҿ$@G4?ҿ$@G4?ҿY#@]?ҿY#@]?ҿY#@]?ҿ$@G4?7$@G4?7$@G4?7B@>7B@>7B@>7u15@'>ҿu15@'>ҿu15@'>ҿB@>ҿB@>ҿB@>ҿu15@'>7u15@'>7u15@'>7 +@ó?ҿ +@ó?ҿ +@ó?ҿ?՞?7?՞?7?՞?7 @ó?7 @ó?7 @ó?7?՞?ҿ?՞?ҿ?՞?ҿKO?J@ҿKO?J@ҿKO?J@ҿ&?ɂ@@7&?ɂ@@7&?ɂ@@7KO?J@7KO?J@7KO?J@7+?ɂ@@ҿ+?ɂ@@ҿ+?ɂ@@ҿ+p@Y>+p@Y>+p@Y>z@&z@&z@&?d@5?d@5?d@5n@*ɾn@*ɾn@*ɾ+p@~Y>@+p@~Y>@+p@~Y>@z@؆@z@؆@z@؆@?d@@?d@@?d@@˷n@ɾ@˷n@ɾ@˷n@ɾ@+pY>+pY>+pY>z&z&z&?d5?d5?d5n*ɾn*ɾn*ɾ+p~Y>@+p~Y>@+p~Y>@z؆@z؆@z؆@?d@?d@?d@˷nɾ@˷nɾ@˷nɾ@ečo@Kbečo@Kbečo@Kbečo@Kb\`@\`@RO=]@KbRO=]@Kb~*s@Kb~*s@Kb~*s@Kb~*s@KbRdޯf@KbRdޯf@KbRdޯf@KbRdޯf@Kbt&Y@Kbt&Y@Kbt&Y@Kbt&Y@KbrlL@KbrlL@KbrlL@KbrlL@Kb0(?@Kb0(?@Kb0(?@Kb0(?@KbhM2@KbhM2@KbhM2@KbhM2@Kbs=%@Kbs=%@Kbs=%@Kbs=%@Kb4/rm%@4/rm%@Ls2@Ls2@ L@ L@ڐ=J@:s@:s@W af@W af@亾DŽY@亾DŽY@'Sy?@'Sy?@ XC?Kb XC?Kb XC?Kb XC?Kb3CC?3CC? n +@Kb n +@Kb n +@Kb n +@KbtQ?KbtQ?KbtQ?KbtQ?Kb$Fɿ?Kb$Fɿ?Kb$Fɿ?Kb$Fɿ?Kb?ܿ8Kb*>Kb*>Kb*>Kbu5cY>Kbu5cY>Kbu5cY>Kbu5cY>Kb@W=Kb@W=Kb@W=Kb@W=KbLKbLKbLKbLKb +6WKb +6WKb +6WKb +6WKb<]b4Kb<]b4Kb<]b4Kb<]b4Kb/b/bWT WT @C<@C<3(?3(?u*@>u*@>U5V>U5V>KKeč?o@Kbeč?o@Kbeč?o@Kbeč?o@Kb\?`@\?`@RO]@KbRO]@Kb~*=s@Kb~*=s@Kb~*=s@Kb~*=s@KbRd>ޯf@KbRd>ޯf@KbRd>ޯf@KbRd>ޯf@Kbt>&Y@Kbt>&Y@Kbt>&Y@Kbt>&Y@Kbr?lL@Kbr?lL@Kbr?lL@Kbr?lL@Kb0(??@Kb0(??@Kb0(??@Kb0(??@KbhM?2@KbhM?2@KbhM?2@KbhM?2@Kbs?=%@Kbs?=%@Kbs?=%@Kbs?=%@Kb4/r?m%@4/r?m%@L?s2@L?s2@? L@? L@ڐJ@=:s@=:s@W a>f@W a>f@>DŽY@>DŽY@'?Sy?@'?Sy?@ @XC?Kb @XC?Kb @XC?Kb @XC?Kb3@CC?3@CC?? n +@Kb? n +@Kb? n +@Kb? n +@Kb?tQ?Kb?tQ?Kb?tQ?Kb?tQ?Kb$F??Kb$F??Kb$F??Kb$F??Kb??8Kb*@>Kb*@>Kb*@>Kbu5@cY>Kbu5@cY>Kbu5@cY>Kbu5@cY>Kb@@W=Kb@@W=Kb@@W=Kb@@W=KbL@KbL@KbL@KbL@Kb +6W@Kb +6W@Kb +6W@Kb +6W@Kb<]b@4Kb<]b@4Kb<]b@4Kb<]b@4Kb/b@/b@W@T W@T @@C<@@C<3@(?3@(?u*@@>u*@@>U5@V>U5@V>K@K@ečo@צečo@צečo@צečo@צRO=]@צRO=]@צ~*s@צ~*s@צ~*s@צ~*s@צRdޯf@צRdޯf@צRdޯf@צRdޯf@צt&Y@צt&Y@צt&Y@צt&Y@צrlL@צrlL@צrlL@צrlL@צ0(?@צ0(?@צ0(?@צ0(?@צhM2@צhM2@צhM2@צhM2@צs=%@צs=%@צs=%@צs=%@צ XC?צ XC?צ XC?צ XC?צ n +@צ n +@צ n +@צ n +@צtQ?צtQ?צtQ?צtQ?צ$Fɿ?צ$Fɿ?צ$Fɿ?צ$Fɿ?צ?ܿ8צ*>צ*>צ*>צu5cY>צu5cY>צu5cY>צu5cY>צ@W=צ@W=צ@W=צ@W=צLצLצLצLצ +6Wצ +6Wצ +6Wצ +6Wצ<]b4צ<]b4צ<]b4צ<]b4צeč?o@צeč?o@צeč?o@צeč?o@צRO]@צRO]@צ~*=s@צ~*=s@צ~*=s@צ~*=s@צRd>ޯf@צRd>ޯf@צRd>ޯf@צRd>ޯf@צt>&Y@צt>&Y@צt>&Y@צt>&Y@צr?lL@צr?lL@צr?lL@צr?lL@צ0(??@צ0(??@צ0(??@צ0(??@צhM?2@צhM?2@צhM?2@צhM?2@צs?=%@צs?=%@צs?=%@צs?=%@צ @XC?צ @XC?צ @XC?צ @XC?צ? n +@צ? n +@צ? n +@צ? n +@צ?tQ?צ?tQ?צ?tQ?צ?tQ?צ$F??צ$F??צ$F??צ$F??צ??8צ*@>צ*@>צ*@>צu5@cY>צu5@cY>צu5@cY>צu5@cY>צ@@W=צ@@W=צ@@W=צ@@W=צL@צL@צL@צL@צ +6W@צ +6W@צ +6W@צ +6W@צ<]b@4צ<]b@4צ<]b@4צ<]b@4צečo@ٳ?ečo@ٳ?ečo@ٳ?ečo@ٳ?RO=]@ٳ?RO=]@ٳ?~*s@ٳ?~*s@ٳ?~*s@ٳ?~*s@ٳ?Rdޯf@ٳ?Rdޯf@ٳ?Rdޯf@ٳ?Rdޯf@ٳ?t&Y@ٳ?t&Y@ٳ?t&Y@ٳ?t&Y@ٳ?rlL@ٳ?rlL@ٳ?rlL@ٳ?rlL@ٳ?0(?@ٳ?0(?@ٳ?0(?@ٳ?0(?@ٳ?hM2@ٳ?hM2@ٳ?hM2@ٳ?hM2@ٳ?s=%@ٳ?s=%@ٳ?s=%@ٳ?s=%@ٳ? XC?ٳ? XC?ٳ? XC?ٳ? XC?ٳ? n +@ٳ? n +@ٳ? n +@ٳ? n +@ٳ?tQ?ٳ?tQ?ٳ?tQ?ٳ?tQ?ٳ?$Fɿ?ٳ?$Fɿ?ٳ?$Fɿ?ٳ?$Fɿ?ٳ??ܿ8ٳ?*>ٳ?*>ٳ?*>ٳ?u5cY>ٳ?u5cY>ٳ?u5cY>ٳ?u5cY>ٳ?@W=ٳ?@W=ٳ?@W=ٳ?@W=ٳ?Lٳ?Lٳ?Lٳ?Lٳ? +6Wٳ? +6Wٳ? +6Wٳ? +6Wٳ?<]b4ٳ?<]b4ٳ?<]b4ٳ?<]b4ٳ?eč?o@ٳ?eč?o@ٳ?eč?o@ٳ?eč?o@ٳ?RO]@ٳ?RO]@ٳ?~*=s@ٳ?~*=s@ٳ?~*=s@ٳ?~*=s@ٳ?Rd>ޯf@ٳ?Rd>ޯf@ٳ?Rd>ޯf@ٳ?Rd>ޯf@ٳ?t>&Y@ٳ?t>&Y@ٳ?t>&Y@ٳ?t>&Y@ٳ?r?lL@ٳ?r?lL@ٳ?r?lL@ٳ?r?lL@ٳ?0(??@ٳ?0(??@ٳ?0(??@ٳ?0(??@ٳ?hM?2@ٳ?hM?2@ٳ?hM?2@ٳ?hM?2@ٳ?s?=%@ٳ?s?=%@ٳ?s?=%@ٳ?s?=%@ٳ? @XC?ٳ? @XC?ٳ? @XC?ٳ? @XC?ٳ?? n +@ٳ?? n +@ٳ?? n +@ٳ?? n +@ٳ??tQ?ٳ??tQ?ٳ??tQ?ٳ??tQ?ٳ?$F??ٳ?$F??ٳ?$F??ٳ?$F??ٳ???8ٳ?*@>ٳ?*@>ٳ?*@>ٳ?u5@cY>ٳ?u5@cY>ٳ?u5@cY>ٳ?u5@cY>ٳ?@@W=ٳ?@@W=ٳ?@@W=ٳ?@@W=ٳ?L@ٳ?L@ٳ?L@ٳ?L@ٳ? +6W@ٳ? +6W@ٳ? +6W@ٳ? +6W@ٳ?<]b@4ٳ?<]b@4ٳ?<]b@4ٳ?<]b@4ٳ?ečo@@ečo@@ečo@@ečo@@RO=]@@RO=]@@~*s@@~*s@@~*s@@~*s@@Rdޯf@@Rdޯf@@Rdޯf@@Rdޯf@@t&Y@@t&Y@@t&Y@@t&Y@@rlL@@rlL@@rlL@@rlL@@0(?@@0(?@@0(?@@0(?@@hM2@@hM2@@hM2@@hM2@@s=%@@s=%@@s=%@@s=%@@ XC?@ XC?@ XC?@ XC?@ n +@@ n +@@ n +@@ n +@@tQ?@tQ?@tQ?@tQ?@$Fɿ?@$Fɿ?@$Fɿ?@$Fɿ?@?ܿ8@*>@*>@*>@u5cY>@u5cY>@u5cY>@u5cY>@@W=@@W=@@W=@@W=@L@L@L@L@ +6W@ +6W@ +6W@ +6W@<]b4@<]b4@<]b4@<]b4@eč?o@@eč?o@@eč?o@@eč?o@@RO]@@RO]@@~*=s@@~*=s@@~*=s@@~*=s@@Rd>ޯf@@Rd>ޯf@@Rd>ޯf@@Rd>ޯf@@t>&Y@@t>&Y@@t>&Y@@t>&Y@@r?lL@@r?lL@@r?lL@@r?lL@@0(??@@0(??@@0(??@@0(??@@hM?2@@hM?2@@hM?2@@hM?2@@s?=%@@s?=%@@s?=%@@s?=%@@ @XC?@ @XC?@ @XC?@ @XC?@? n +@@? n +@@? n +@@? n +@@?tQ?@?tQ?@?tQ?@?tQ?@$F??@$F??@$F??@$F??@??8@*@>@*@>@*@>@u5@cY>@u5@cY>@u5@cY>@u5@cY>@@@W=@@@W=@@@W=@@@W=@L@@L@@L@@L@@ +6W@@ +6W@@ +6W@@ +6W@@<]b@4@<]b@4@<]b@4@<]b@4@ečo@O@ečo@O@RO=]@O@~*s@O@~*s@O@Rdޯf@O@Rdޯf@O@t&Y@O@t&Y@O@rlL@O@rlL@O@0(?@O@0(?@O@hM2@O@hM2@O@s=%@O@s=%@O@ XC?O@ XC?O@ n +@O@ n +@O@tQ?O@tQ?O@$Fɿ?O@$Fɿ?O@?ܿ8O@*>O@u5cY>O@u5cY>O@@W=O@@W=O@LO@LO@ +6WO@ +6WO@<]b4O@<]b4O@eč?o@O@eč?o@O@RO]@O@~*=s@O@~*=s@O@Rd>ޯf@O@Rd>ޯf@O@t>&Y@O@t>&Y@O@r?lL@O@r?lL@O@0(??@O@0(??@O@hM?2@O@hM?2@O@s?=%@O@s?=%@O@ @XC?O@ @XC?O@? n +@O@? n +@O@?tQ?O@?tQ?O@$F??O@$F??O@??8O@*@>O@u5@cY>O@u5@cY>O@@@W=O@@@W=O@L@O@L@O@ +6W@O@ +6W@O@<]b@4O@<]b@4O@, +S^ T?eVb, +S^?? T?eVb]aSi?!3R??]aSi??!3R??(,w=D6?3(,w=?D6?33.63?(,w=3.63?(,w=?LpOq?BLP??BL?PjO? LpOq?BLP??BL?PjO? aD:$?P>7+??}>?+|RD?L$aD:$?P>7+??}>?+|RD?L$P>7+?3.63??D6?3}>?+P>7+?3.63??D6?3}>?+BLP?aD:$??|RD?L$BL?PBLP?aD:$??|RD?L$BL?P]aSi?LpOq??jO?  T?eVb]aSi?LpOq??jO?  T?eVbD63(,?w=D63?(,?w=(,?w=3.6?3??(,?w=3.6?3??BL?P?LpO?q?jO BLPBL?P?LpO?q?jO BLP??P>?7+?aD?:$?|RDL$}>+P>?7+?aD?:$?|RDL$}>+??3.6?3?P>?7+?}>+D633.6?3?P>?7+?}>+D63?aD?:$?BL?P?BLP|RDL$??aD?:$?BL?P?BLP|RDL$LpO?q?!3R??, +S^jO ??LpO?q?!3R??, +S^jO , +S^ T?eVb, +S^?? T?eVb]aSi?!3R??]aSi??!3R??(,w=D6?3(,w=?D6?33.63?(,w=3.63?(,w=?LpOq?BLP??BL?PjO? LpOq?BLP??BL?PjO? aD:$?P>7+??}>?+|RD?L$aD:$?P>7+??}>?+|RD?L$P>7+?3.63??D6?3}>?+P>7+?3.63??D6?3}>?+BLP?aD:$??|RD?L$BL?PBLP?aD:$??|RD?L$BL?P]aSi?LpOq??jO?  T?eVb]aSi?LpOq??jO?  T?eVbD63(,?w=D63?(,?w=(,?w=3.6?3??(,?w=3.6?3??BL?P?LpO?q?jO BLPBL?P?LpO?q?jO BLP??P>?7+?aD?:$?|RDL$}>+P>?7+?aD?:$?|RDL$}>+??3.6?3?P>?7+?}>+D633.6?3?P>?7+?}>+D63?aD?:$?BL?P?BLP|RDL$??aD?:$?BL?P?BLP|RDL$LpO?q?!3R??, +S^jO ??LpO?q?!3R??, +S^jO , +S^<?? T?eVb<, +S^< T?eVb<]aSi??!3R??]aSi?!3R??(,w=?D6?3(,w=D6?33.63?(,w=?3.63?(,w=LpOq?BLP??BL?PjO? LpOq?BLP??BL?PjO? aD:$?P>7+??}>?+|RD?L$aD:$?P>7+??}>?+|RD?L$P>7+?3.63??D6?3}>?+P>7+?3.63??D6?3}>?+BLP?aD:$??|RD?L$BL?PBLP?aD:$??|RD?L$BL?P]aSi?LpOq??jO?  T?eVb<]aSi?LpOq??jO?  T?eVb?7+?aD?:$?|RDL$}>+??P>?7+?aD?:$?|RDL$}>+3.6?3?P>?7+?}>+D63??3.6?3?P>?7+?}>+D63?aD?:$?BL?P?BLP|RDL$aD?:$?BL?P?BLP|RDL$??LpO?q?!3R??, +S^7+??}>?+|RD?L$aD:$?P>7+??}>?+|RD?L$P>7+?3.63??D6?3}>?+P>7+?3.63??D6?3}>?+BLP?aD:$??|RD?L$BL?PBLP?aD:$??|RD?L$BL?P]aSi?LpOq??jO?  T?eVb<]aSi?LpOq??jO?  T?eVb?7+?aD?:$?|RDL$}>+??P>?7+?aD?:$?|RDL$}>+3.6?3?P>?7+?}>+D63??3.6?3?P>?7+?}>+D63?aD?:$?BL?P?BLP|RDL$aD?:$?BL?P?BLP|RDL$??LpO?q?!3R??, +S^À8Ex>b@@{;@'= +Ā8Ex>b@@'=@'=1p>@'=@{;1p>@{;=>wI?wk?H +{;=>] ?xk?8Ex>H'=H'= >wI?yk?p>H +{; >] ?vk?p>XA? {;XA? {;x>p>x>8Ex>XA? {;XA? {;ZA?'=ZA?'=x>p>x>8Ex>ZA?'=ZA?'=b {;b {;$ā?p>%ā?8Ex>b {;b {; b'= b'=(ā?l>&ā?8Ex> b'= b'=<_̾ +{;<_̾ +{;?p>?@Ex><_̾ {;<_̾ {;4_̾'=4_̾'=?p>?8Ex>4_̾'=4_̾'=>>'=>>'= ?p> ?8Ex>>>'=>>'= >> {; >> {; ?p> ?8Ex> >> {; >> {;~?'=~?'=p>8Ex>~?'=~?'=~?{;~?{;p>8Ex>~?{;~?{;H +{;wk?=>wI?H'=xk?8Ex>=>] ?yk?p> >wI?H'=vk?p> >] ?H +{;x>p>XA? {;XA? {;XA? {;XA? {;x>8Ex>x>p>ZA?'=ZA?'=ZA?'=ZA?'=x>8Ex>$ā?p>b {;b {;b {;b {;%ā?8Ex>(ā?l> b'= b'= b'= b'=&ā?8Ex>?p><_̾ +{;<_̾ +{;<_̾ {;<_̾ {;?@Ex>?p>4_̾'=4_̾'=4_̾'=4_̾'=?8Ex> ?p>>>'=>>'=>>'=>>'= ?8Ex> ?p> >> {; >> {; >> {; >> {; ?8Ex>p>~?'=~?'=~?'=~?'=8Ex>p>~?{;~?{;~?{;~?{;8Ex>@{; +8Ex>À8Ex>b@@{;@'= +Ā8Ex>b@@'=@'=1p>@'=@{;1p>@{;=>wI?wk?H +{;=>] ?xk?8Ex>H'=H'= >wI?yk?p>H +{; >] ?vk?p>XA? {;XA? {;x>p>x>8Ex>XA? {;XA? {;ZA?'=ZA?'=x>p>x>8Ex>ZA?'=ZA?'=b {;b {;$ā?p>%ā?8Ex>b {;b {; b'= b'=(ā?l>&ā?8Ex> b'= b'=<_̾ +{;<_̾ +{;?p>?@Ex><_̾ {;<_̾ {;4_̾'=4_̾'=?p>?8Ex>4_̾'=4_̾'=>>'=>>'= ?p> ?8Ex>>>'=>>'= >> {; >> {; ?p> ?8Ex> >> {; >> {;~?'=~?'=p>8Ex>~?'=~?'=~?{;~?{;p>8Ex>~?{;~?{;H +{;wk?=>wI?H'=xk?8Ex>=>] ?yk?p> >wI?H'=vk?p> >] ?H +{;x>p>XA? {;XA? {;XA? {;XA? {;x>8Ex>x>p>ZA?'=ZA?'=ZA?'=ZA?'=x>8Ex>$ā?p>b {;b {;b {;b {;%ā?8Ex>(ā?l> b'= b'= b'= b'=&ā?8Ex>?p><_̾ +{;<_̾ +{;<_̾ {;<_̾ {;?@Ex>?p>4_̾'=4_̾'=4_̾'=4_̾'=?8Ex> ?p>>>'=>>'=>>'=>>'= ?8Ex> ?p> >> {; >> {; >> {; >> {; ?8Ex>p>~?'=~?'=~?'=~?'=8Ex>p>~?{;~?{;~?{;~?{;8Ex>@{; +8Ex>À8Ex>b@@{;@'= +Ā8Ex>b@@'=@'=1p>@'=@{;1p>@{;=>wI?wk?H +{;=>] ?xk?8Ex>H'=H'= >wI?yk?p>H +{; >] ?vk?p>XA? {;XA? {;x>p>x>8Ex>XA? {;XA? {;ZA?'=ZA?'=x>p>x>8Ex>ZA?'=ZA?'=b {;b {;$ā?p>%ā?8Ex>b {;b {; b'= b'=(ā?l>&ā?8Ex> b'= b'=<_̾ +{;<_̾ +{;?p>?@Ex><_̾ {;<_̾ {;4_̾'=4_̾'=?p>?8Ex>4_̾'=4_̾'=>>'=>>'= ?p> ?8Ex>>>'=>>'= >> {; >> {; ?p> ?8Ex> >> {; >> {;~?'=~?'=p>8Ex>~?'=~?'=~?{;~?{;p>8Ex>~?{;~?{;H +{;wk?=>wI?H'=xk?8Ex>=>] ?yk?p> >wI?H'=vk?p> >] ?H +{;x>p>XA? {;XA? {;XA? {;XA? {;x>8Ex>x>p>ZA?'=ZA?'=ZA?'=ZA?'=x>8Ex>$ā?p>b {;b {;b {;b {;%ā?8Ex>(ā?l> b'= b'= b'= b'=&ā?8Ex>?p><_̾ +{;<_̾ +{;<_̾ {;<_̾ {;?@Ex>?p>4_̾'=4_̾'=4_̾'=4_̾'=?8Ex> ?p>>>'=>>'=>>'=>>'= ?8Ex> ?p> >> {; >> {; >> {; >> {; ?8Ex>p>~?'=~?'=~?'=~?'=8Ex>p>~?{;~?{;~?{;~?{;8Ex>@{; +8Ex>À8Ex>b@@{;@'= +Ā8Ex>b@@'=@'=1p>@'=@{;1p>@{;=>wI?wk?H +{;=>] ?xk?8Ex>H'=H'= >wI?yk?p>H +{; >] ?vk?p>XA? {;XA? {;x>p>x>8Ex>XA? {;XA? {;ZA?'=ZA?'=x>p>x>8Ex>ZA?'=ZA?'=b {;b {;$ā?p>%ā?8Ex>b {;b {; b'= b'=(ā?l>&ā?8Ex> b'= b'=<_̾ +{;<_̾ +{;?p>?@Ex><_̾ {;<_̾ {;4_̾'=4_̾'=?p>?8Ex>4_̾'=4_̾'=>>'=>>'= ?p> ?8Ex>>>'=>>'= >> {; >> {; ?p> ?8Ex> >> {; >> {;~?'=~?'=p>8Ex>~?'=~?'=~?{;~?{;p>8Ex>~?{;~?{;H +{;wk?=>wI?H'=xk?8Ex>=>] ?yk?p> >wI?H'=vk?p> >] ?H +{;x>p>XA? {;XA? {;XA? {;XA? {;x>8Ex>x>p>ZA?'=ZA?'=ZA?'=ZA?'=x>8Ex>$ā?p>b {;b {;b {;b {;%ā?8Ex>(ā?l> b'= b'= b'= b'=&ā?8Ex>?p><_̾ +{;<_̾ +{;<_̾ {;<_̾ {;?@Ex>?p>4_̾'=4_̾'=4_̾'=4_̾'=?8Ex> ?p>>>'=>>'=>>'=>>'= ?8Ex> ?p> >> {; >> {; >> {; >> {; ?8Ex>p>~?'=~?'=~?'=~?'=8Ex>p>~?{;~?{;~?{;~?{;8Ex>18Ex>=>wI?@{;=>] ?@'=18Ex>1p>@'= >wI?@{; >] ?1p>@8Ex>=>wI?1 +{;=>] ?1'=@8Ex>@p>1'= >wI?1 +{; >] ?@p>@{;=>wI?18Ex>18Ex>@'==>] ? >wI?@'=1p>1p> >] ?@{;1 +{;=>wI?@8Ex>@8Ex>1'==>] ? >wI?1'=@p>@p> >] ?1 +{;_>^>>Q????_>??Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>??`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>Q????_>??`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>_>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>Q????_>??Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>??`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>Q????_>??`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>_>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_i>^>Ԇ>@8>^>?^Ԇ>?>`Ԇ>?Ԇ>`?^i>^>?i>^?@8i>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>Q????`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>_>^>>`Ԇ>^>؆>Q?Ԇ>?Ԇ>`?^i>^>i>^>?^>@8i>^>>?i>^Ԇ>@8>`>؆>?>^?@8i>`>??i>`?@8>^>??>`Ԇ>_i>^>i>^>Ԇ>^>>Q??Q??^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>^>>Q??^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>^>>^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>^>>Q??Q??^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>^>>Q??^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>^>>^>؆>Q?Ԇ>^>i>^>?@8i>^>>@8>`>؆>`>??i>`??>`Ԇ>^>i>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????993RMR :5:<<6N%NTLSL"FA#F#K KQ4;/4/(B1+B+H@G)@).?,&?&E;;40=707*.)5.5:-82-2'!>D!D"G"G@$CI$I(/A(AFJPP S SLOUU#MMR]`[][X{aa^ \WW~VVYeekhggbmmddjznyzyqqwtssppv_z_Zxr}x}ttsuo|u|icihhglflnny + + bbm665""4:4 00;* * )171 #(.($$/%+%##!  ,,&$// +- +-' *) )8820;;993655 QTMQMJuoSuSPHBBvRKvKqxrLxLO[[a^YYX__}VV\pdkpkw~g~gm|je|e{b{bhUpwUwNlfslsyjvqjqeicnint]W]z^|^Y`Z`d}d}kDGDEE>C?CXX_AAHFFIE=E@@< ,,'(.(&&-  %+%  " ! + +  !!##  **$&--//),''72575:[8;[;UrqrZY1Z16^30^0XpE?p?vlwAlABfeGfG<mD>m>sT_STSHdQKdKj`kM`MNaPJaJg94_9_TR]WRWLNMYNYZO\VOVICbhCh=BAkBk`FciFi@HSeHefnttwwlouu<Gq<qryy{}}zz|~~x + + 1  * *(&+-&-"%,7%7! 6. ./55433200B>bBbd9Z\9\<XT_X_]WSjWj^RN`R`iMIhMhaJFfJfgGAcGces:=s=llo~z~{w{xrxmpp  ' '&$)$$$ ### 0,?0?C)HY)Y8FBVFV[EAQEQU@<L@LP;7K;KO84E8EH5/@5@DP*;P;tKhKkfbfeae`\}`}[W|[|XTvXvyUOqUqunLnnnkk~z~yuyvrvsms  +%%'""!  --1GG(DDI??C::>99=336..2++Q (g gJ&"d&di%!_%_c Z Z^YY]SSVNNR. M.Mo+F+jD@DC?}C}>:x>x|95w9w{62q6qt3-l3lpPPLIIhffbeea``\[[WXXTUUOppJkk|{{wxxtuuol '' +$$)#  /EE*BBG==A88<77;114,,0 QM M +Hggiddc__^ZZ]YYVSS RNN qKK j(''%&&$#~z#z"!}y!y vs srnn+m+m))766455322100.//,--*<:<8H8GEGFDFCBCA?A@=@>;>L9LIXIWUWVTVSRSQOQPMPNKN[J[YgYfdfecebab`^`_\_]Z]?p@߳ {@p}?p@"?p@"?p@ڳ?p@ڳ?p@H(?p@H(?p@u?p@u?p@D?p@D?p@P_?p@P_?p@<?p@<?p@?p@?p@s?p@s?p@s?p@s@Av@Av^?@߳-*@=o?߳aD@>޳=$@O?p}>@>o}ұ?(J@o},{@*q#,{@*q#;>6@߳F>hw@q}(@?߳(@?߳(@?߳]?,?߳]?,?߳l^@*@=|Y@p}|Y@p}W?m?p}W?m?p} @?p}Տ?UX:@߳Տ?UX:@߳w;?T(1@p}t!aD@>ڳaD@>G(aD@>uaD@>DaD@>P_aD@> j^@~@=.g^@A=ܳ=d^@yB=*La^@AC=bwZ^^@+D=Eh[^@_D=R_vX^@E=?]@P_Q>?: ^@D+=?.^@u9=?R^@G(H1=?u^@ڳW)@P>{@5q@P_E>fg@D8>]@u<>S@G( >I@ڳ2u>#@@!̿?}g:@!G?+w:@ڳ?ֆ:@G(<|?:@ue?.:@D3O?ڵ:@P_8?:@@vﺾ>@vﺾvc?b@#?1@?@?@d}N@? h@=C@?}$P>e@4?UK>@?w@3@~??H@3?H@3d}N@?3h@ =56@{?3@v@v$P>e@3Yc?rb@3Ct?:@3?Z>@3R?w@33@~?38?@w8?@wd}N@?}h@x=zư@4u?m@%;N@%;N$P>e@~J5d?COb@~??D@~ ?lj>@} ?&w@{3@~?~{?@Ϛ{?@Ϛd}N@?Ϛh@9=К @Io?Κ@F๾@F๾$P>e@Ϛ;d?+b@Ϛ +?aN@Ϛ?z>@Ϛ?8w@ Ϛ3@~?Ϛ?R@?R@d}N@?h@?=[Q@_i?]@Zm]@Zm$P>e@+d?^b@ +?3X@ڢ?ĉ>@?Jw@3@~??@p?@pd}N@?ph@b=p@uc?Sp@|*np@|*np"P>e@pUe?a@zpM?b@pzĢ?q>@p?\w@p3@~?pB?@qMB?@qMd}N@?Mh@=6Nܹ@]?"M@ϸM@ϸM!P>e@Me?{a@WMl?k@M?>@MX?ow@pM3@~?Ml?k@D+l?k@D+d}N@?]+ h@0l=]+,@W?+>@4s<+>@4s<+ P>e@]+f?ra@C+6?u@+? >@+%?w@I+3@~?]+?)@*A ?)@*A d}N@?PA h@p=A {@Q?@ @~ +@~ + P>e@PA xf?nya@JA \?@{A 1?>@sA ?w@:A 3@~?PA P~@0P~@0P~@0P~@0@T<@T<@Ge@Ge@@a@3ֶa@3ֶ&@}pZb&@}pZb@L>_@L>_@)9<@)9<@2(t@2(tn$@y⾪an$@y⾪a+&@;м+&@;м'@ˍᾫ'@ˍᾫ)@eFt")@eFt"y+@ྎ,y+@ྎ,?-@{p?-@{p/@pM/@pM0@'ྱN+0@'ྱN+2@߾{ +2@߾{ +x@\#x@\#x@\#zx@zx@Cw@ahj.w@:c52 w@]O5#w@X=8&w@8S=)w@MsDA,w@H*țD/w@;CKG2w@=봊J5w@8܁O8w@938qR;w@-\_T>w@(vDNYAw@:#_9|@Q>_|@Jp<|@Jpp@=$@O?W:@>@>W:@)?@W:@s{@*"-s@s{@*"-s@B@?ir;@p@I7?2@W:@ @sB?Aq@$?m?p@$?m?p@$?m?p@7^@+N=}s@7^@+N=}s@GY@ǶW:@GY@ǶW:@??W:@??W:@ +@t?W:@3C?E=\@p@'?U@W:@p>Q@p@p>Q@p@>y@Y:@@??ϔ?@??ϔ?@??ϔ?@??ϔ?Q?v?@Q?v?@7L?}?9@7L?}?9@zF?@?Z@zF?@?Z@@??{@@??{@:??;@:??;@A5?W?Y@A5?W?Y@/?? @/?? @)??@)??@aD@>ϔ?aD@>ϔ?aD@>@aD@>9@aD@>nZ@aD@>H{@aD@>@aD@>~Y@aD@> @aD@>Y@O^@G=P@L^@H= 9@I^@I=:Z@F^@HJ={@C^@>K=@@^@jK=M[@=^@L=@:^@dM=@ @q?B@&@k?* 9@l@e?Z@@ +`?{@@Z?q@;@4T?Y@@JN?Y @@_H?;@@@@@@#@@#@Z@]BY@Z@]BY@@@@@@}@@}@@n[@@n[@5@l`:@5@l`:@@Q$@@Q$@B?`\@Y@sB?*\@ @B?\@Y@A?\@@SA?\@J{@@?]@pZ@@?d5]@9@3@?X]@@ ڼ>݀@Y@C>Ӏ@ @>ɀ@Y@~>@@>=@J{@t>l@pZ@R>@9@k>ʘ@@>=@ϔ?>=@ϔ?e? :@@ݎ?;@9@\ǎ?c;@uZ@װ?$;@P{@S?3;@@σ?fC;@Y@Jm?S;@ @V?b;@]@\?C@պ@o\?U@9@<\?i@Z@ \?|@l{@[?@%@[?@Y@v[?@ @D[?Ȍ@q@-*@=o?ϔ?-*@=o?ϔ?-*@=o?@-*@=o?9@-*@=o?nZ@-*@=o?I{@-*@=o?@-*@=o?Y@-*@=o? @-*@=o?Y@ھ?ؤ@@ھ?ؤ@@d}N@?L@h@4=@@K?@@@@@$P>e@L@f?Ua@M@?@M@i?>@R@?w@f@3@~?L@?@em(@?@em(@d}N@?&m(@h@= +n(@@E?m(@@aC)@@aC)@$P>e@&m(@7g?2a@(m(@ߗ?h@(m(@(S?N>@,m(@?w@Dm(@3@~?&m(@^?5@FI@^?5@FI@d}N@?I@h@*=I@K@??I@g@#*K@g@#*K@$P>e@I@g?a@I@"c?:@I@@I@Z?w@ I@3@~?I@?@&7k@?@&7k@d}N@?6k@.g@_=8k@@9?7k@@FDl@@FDl@$P>e@6k@g?`@6k@e.? +@6k@&??@6k@)?w@6k@3@~?6k@?@N@?@N@d}N@?M@e@M@Wh?4`@M@?ܰ@M@?Q?@M@?w@M@3@~?M@$?@@s@$?@@s@d}N@?H@Ig@&=@@.?@B@|"@B@|"@$P>e@H@h?`@H@?@H@?&?@L@?x@\@3@~?H@h?@㲧@h?@㲧@d}N@?@Xg@=@`@(?@@c@@c@$P>e@@i?N`@@,?}Ă@@?6?@@?x@˲@3@~?@?@Se@?@Se@d}N@?"e@gg@=eg@@,"?e@@?@@?@$P>e@#e@wi?]`@#e@n[?N΂@#e@̡?SF?@'e@b?*x@9e@3@~?#e@?K@@?K@@d}N@?@vg@Q=@@B?@$P>e@@?V?@@1?=x@@3@~?@@䴾R@@䴾R@i?j:`@@&?؂@@|@Q'@|@Q'@|@Q'@|@Q'@]%@Qϔ?]%@Qϔ?]%@Qϔ?]%@Qϔ? @ɼ@ @ɼ@!@:@!@:@#@^uQ\@#@^uQ\@]%@Q}@]%@Q}@"'@-6׏@"'@-6׏@(@= +o@(@= +o@*@@*@@p,@\@p,@\@a4@߾r@a4@߾r@'6@&P߾)@'6@&P߾)@7@߾SzK@7@߾SzK@9@Q޾(m@9@Q޾(m@u;@y޾k@u;@y޾k@9=@y2޾B@9=@y2޾B@>@ ݾ @>@ ݾ @@@ݾC@@@ݾC@B@4\ݾ{@B@4\ݾ{@Lx@H%@Lx@H%@Lx@H%@w@@w@@Ӏw@@Pw@7md@Sw@\@Vw@U*@Yw@9%N;@\w@FL@_w@J?]@bw@<7n@ew@o0@hw@@kw@9ʐ@nw@ @qw@]@tw@5@ww@@zw@8@}w@8z@5|@ϔ?5|@ϔ?5|@ϔ?5|@ϔ?*|@Rrt@*|@Rrt@ +.|@*:@ +.|@*:@1|@}VQ\@1|@}VQ\@5|@}@5|@}@8|@T׏@8|@T׏@0<|@; S@0<|@; S@?|@フ@?|@フ@CC|@f~\@CC|@f~\@)@Kɾ<@)@Kɾ<@Y+@Hɾ)@Y+@Hɾ)@-@uɾzK@-@uɾzK@.@Ⱦ(m@.@Ⱦ(m@0@rȾk@0@rȾk@k2@9+ȾB@k2@9+ȾB@/4@Ǿ@/4@Ǿ@5@dǾ(@5@dǾ(@7@TǾa@7@TǾa@?p@?p@?p@?p@?p@<>?p@<>?p@?@??p@?@??p@??p@?O?4z?␺O?4z?␺O?4z?␺O?4z?␺Q?v? +<>Q?v? +<>7L?}?o@?7L?}?o@?zF?@??zF?@??aD@>aD@>aD@> <>aD@>=@?aD@>?N^@ VH=N^@ VH=O^@G=<>L^@H=@?I^@I=?F^@ HJ=ϔ?F^@ HJ=ϔ?@n?@n? @q?.<>&@k?@?l@e?b?@ +`?ϔ?@ +`?ϔ?@ϔ?@ϔ?@ϔ?@ϔ?@nF ?@nF ?5@l-F?5@l-F?@P$N>@P$N>@@@@??J|]@ϔ???J|]@ϔ?@?]@?@?d5]@P@?3@?X]@<>c@?G]@c@?G]@x>l@?R>@G@?h>ʘ@T<>>@>@"?:@򐺾"?:@򐺾e? :@<>ݎ?;@\@?\ǎ?c;@?װ?$;@ϔ?װ?$;@ϔ?\?M@󐺾\?M@󐺾\?C@ <>o\?U@ɪ@?<\?i@S? \?|@ϔ? \?|@ϔ?-*@=o?-*@=o?-*@=o?<>-*@=o??@?-*@=o??ھ?ؤ@گŽھ?ؤ@گŽd}N@?Žh@5=Ž@K?ߧŽ@컷|@컷| P>e@Žf?Ua@Ž?@NŽi?>@%Ž?w@Ž3@~?Ž?@O>?@O>d}N@?>h@=~>@E?>@a>@a> P>e@>7g?2a@|>?h@>(S?N>@>?w@>3@~?>^?5@B?^?5@B?d}N@?AB?h@0=E?K@??C?g@$`?g@$`? P>e@CB?g?a@3B?"c?:@PB?@ZB?Z?w@B?3@~?CB??@??@?d}N@?g?.g@_=?@9?˚?@D?@D? P>e@i?g?`@m?d.? +@m?&??@x?)?w@?3@~?i? @ @ @ @ @ʼ(P> @ʼ(P>!@ *G?!@ *G?#@^u˪?#@^u˪?a4@߾͢a4@߾͢'6@$P߾b>'6@$P߾b>7@߾?7@߾?9@P޾?9@P޾?Vw@9Vw@9Pw@6^-Sw@nX>Vw@>?Yw@:1J?\w@Nr?_w@F?bw@<?Mw@ ϔ?Mw@ ϔ?D,|@ND,|@ND,|@ND,|@N*|@TrTQ>*|@TrTQ> +.|@*-G? +.|@*-G?1|@|2˪?1|@|2˪?)@Lɾ)@LɾY+@HɾBj>Y+@HɾBj>-@tɾ?-@tɾ?.@Ⱦ?.@Ⱦ??p@d?p@d?p@B?p@B@??d@??d:??C:??CaD@>daD@>BaD@>saD@>sF^@ HJ=1dC^@@K=vH@^@`K=s@^@`K=s@ +`?d@Z?VD@#@#@gb@gbA?\@BSA?\@d>ɀ@s>ɀ@s>@B>=@dװ?$;@ dS?3;@ C \?|@vd[?@CC-*@=o?d-*@=o?B?@g!?@g!d}N@?e!.g@_=n!@9?h!@D!@D! P>e@e!g?`@ff!d.? +@e!&??@e!)?w@f!3@~?e!?@1?@1d}N@?e@Wh?4`@?ܰ@?Q?@?w@3@~?$?@@ӿ$?@@ӿd}N@?wӿIg@&=ӿ@.?ӿB@|'ӿB@|'ӿ P>e@yӿh?`@{ӿ?@{ӿ?&?@ӿ?x@­ӿ3@~?yӿ]%@Q9d]%@Q9d"'@-4"'@-4(@> +s(@> +s(@> +s(@> +s9@P޾ 9@P޾ u;@y޾q1u;@y޾q19=@x2޾EԿ9=@x2޾EԿbw@<1$ew@hhw@kw@:N޳=$O?p}>>o}ұ(J@o},{*q#,{*q#;þ6@߳Fhw@q}(?߳(?߳(?߳],?߳],?߳l^*@=|Yp}|Yp}W޿m?p}W޿m?p} ?p}ՏUX:@߳ՏUX:@߳w;T(1@p}t!aD>ڳaD>G(aD>uaD>DaD>P_aD> j^~@=.g^A=ܳ=d^yB=*La^AC=bwZ^^+D=Eh[^_D=R_vX^E=]@P_Q>: ^@D+=.^@u9=R^@G(H1=u^@ڳW<^@!`)@P{@vﺾ>vﺾvcb@#1@@@d}N? h=C?}$Pe@4UK>@ӿw@3~?H@3H@3d}N?3h =56{?3vv$Pe@3Ycrb@3Ct:@3Z>@3Rӿw@33~?38@w8@wd}N?}hx=zư4u?m%;N%;N$Pe@~J5dCOb@~?D@~ lj>@} ӿ&w@{3~?~{@Ϛ{@Ϛd}N?Ϛh9=К Io?ΚF๾F๾$Pe@Ϛ;d+b@Ϛ +aN@Ϛz>@Ϛӿ8w@ Ϛ3~?ϚR@R@d}N?h?=[Q_i?]Zm]Zm$Pe@+d^b@ +3X@ڢĉ>@ӿJw@3~?@p@pd}N?phb=puc?Sp|*np|*np"Pe@pUea@zpMb@pzĢq>@pӿ\w@p3~?pB@qMB@qMd}N?Mh=6Nܹ]?"MϸMϸM!Pe@Me{a@WMlk@M>@MXӿow@pM3~?Mlk@D+lk@D+d}N?]+ h0l=]+,W?+>4s<+>4s<+ Pe@]+fra@C+6u@+ >@+%ӿw@I+3~?]+)@*A )@*A d}N?PA hp=A {Q?@ ~ +~ + Pe@PA xfnya@JA \@{A 1>@sA ӿw@:A 3~?PA P~0P~0P~0P~0T<T<GeGea3ֶa3ֶ&}pZb&}pZbL>_L>_)9<)9<2(t2(tn$y⾪an$y⾪a+&;м+&;м'ˍᾫ'ˍᾫ)eFt")eFt"y+ྎ,y+ྎ,?-{p?-{p/pM/pM0'ྱN+0'ྱN+2߾{ +2߾{ +x\#x\#x\#zxzxCwahj.w:c52 w]O5#wX=8&w8S=)wMsDA,wH*țD/w;CKG2w=봊J5w8܁O8w938qR;w-\_T>w(vDNYAw:#_9|Q>_|Jp<|Jpp@=$O?W:@>>W:@)@W:@s{*"-s@s{*"-s@B@ir;@p@I72@W:@ sB?Aq@$m?p@$m?p@$m?p@7^+N=}s@7^+N=}s@GYǶW:@GYǶW:@ݿ?W:@ݿ?W:@ +t?W:@3CE=\@p@'U@W:@pQ@p@pQ@p@y@Y:@@꿜?ϔ?@꿜?ϔ?@꿜?ϔ?@꿜?ϔ?Q꿆v?@Q꿆v?@7L}?9@7L}?9@zF@?Z@zF@?Z@@꿜?{@@꿜?{@:?;@:?;@A5W?Y@A5W?Y@/꿳? @/꿳? @)?@)?@aD>ϔ?aD>ϔ?aD>@aD>9@aD>nZ@aD>H{@aD>@aD>~Y@aD> @aD>Y@O^G=P@L^H= 9@I^I=:Z@F^HJ={@C^>K=@@^jK=M[@=^L=@:^dM=@ q?B@&k?* 9@le?Z@ +`?{@Z?q@;4T?Y@JN?Y @_H?;@@@#@#@Z]BY@Z]BY@@@}@}@n[@n[@5l`:@5l`:@Q$@Q$@B`\@Y@sB*\@ @B\@Y@A\@@SA\@J{@@]@pZ@@d5]@9@3@X]@@ ڼ݀@Y@CӀ@ @ɀ@Y@~@@=@J{@t龾l@pZ@R@9@kʘ@@=@ϔ?=@ϔ?e :@@ݎ;@9@\ǎc;@uZ@װ$;@P{@S3;@@σfC;@Y@JmS;@ @Vb;@]@\C@պ@o\U@9@<\i@Z@ \|@l{@[@%@[@Y@v[@ @D[Ȍ@q@-*=o?ϔ?-*=o?ϔ?-*=o?@-*=o?9@-*=o?nZ@-*=o?I{@-*=o?@-*=o?Y@-*=o? @-*=o?Y@ھؤ@@ھؤ@@d}N?L@h4=@K?@@@$Pe@L@fUa@M@@M@i>@R@ӿw@f@3~?L@@em(@@em(@d}N?&m(@h= +n(@E?m(@aC)@aC)@$Pe@&m(@7g2a@(m(@ߗh@(m(@(SN>@,m(@ӿw@Dm(@3~?&m(@^5@FI@^5@FI@d}N?I@h*=I@K??I@g#*K@g#*K@$Pe@I@ga@I@"c:@I@<>@I@Zӿw@ I@3~?I@@&7k@@&7k@d}N?6k@.g_=8k@9?7k@FDl@FDl@$Pe@6k@g`@6k@e. +@6k@&?@6k@)ӿw@6k@3~?6k@@N@@N@d}N?M@ ݾ @> ݾ @@ݾC@@ݾC@B4\ݾ{@B4\ݾ{@LxH%@LxH%@LxH%@w@w@Ӏw@Pw7md@Sw\@VwU*@Yw9%N;@\wFL@_wJ?]@bw<7n@ewo0@hw@kw9ʐ@nw @qw]@tw5@ww@zw8@}w8z@5|ϔ?5|ϔ?5|ϔ?5|ϔ?*|Rrt@*|Rrt@ +.|*:@ +.|*:@1|}VQ\@1|}VQ\@5|}@5|}@8|T׏@8|T׏@0<|; S@0<|; S@?|フ@?|フ@CC|f~\@CC|f~\@)Kɾ<@)Kɾ<@Y+Hɾ)@Y+Hɾ)@-uɾzK@-uɾzK@.Ⱦ(m@.Ⱦ(m@0rȾk@0rȾk@k29+ȾB@k29+ȾB@/4Ǿ@/4Ǿ@5dǾ(@5dǾ(@7TǾa@7TǾa@O4z?␺O4z?␺O4z?␺O4z?␺Q꿆v? +<>Q꿆v? +<>7L}?o@?7L}?o@?zF@??zF@??aD>aD>aD> <>aD>=@?aD>?N^ VH=N^ VH=O^G=<>L^H=@?I^I=?F^ HJ=ϔ?F^ HJ=ϔ?n?n? q?.<>&k?@?le?b? +`?ϔ? +`?ϔ?ϔ?ϔ?ϔ?ϔ?nF ?nF ?5l-F?5l-F?P$N>P$N>?J|]@ϔ??J|]@ϔ?@]@?@d5]@P@?3@X]@<>c@G]@c@G]@x龾l@?R@G@?hʘ@T<>@@"鎿:@򐺾"鎿:@򐺾e :@<>ݎ;@\@?\ǎc;@?װ$;@ϔ?װ$;@ϔ?\M@󐺾\M@󐺾\C@ <>o\U@ɪ@?<\i@S? \|@ϔ? \|@ϔ?-*=o?-*=o?-*=o?<>-*=o??@?-*=o??ھؤ@گŽھؤ@گŽd}N?Žh5=ŽK?ߧŽ컷|컷| Pe@ŽfUa@Ž@NŽi>@%Žӿw@Ž3~?Ž@O>@O>d}N?>h=~>E?>a>a> Pe@>7g2a@|>h@>(SN>@>ӿw@>3~?>^5@B?^5@B?d}N?AB?h0=E?K??C?g$`?g$`? Pe@CB?ga@3B?"c:@PB?<>@ZB?Zӿw@B?3~?CB?@?@?d}N?g?.g_=?9?˚?D?D? Pe@i?g`@m?d. +@m?&?@x?)ӿw@?3~?i?     ʼ(P> ʼ(P>! *G?! *G?#^u˪?#^u˪?a4߾͢a4߾͢'6$P߾b>'6$P߾b>7߾?7߾?9P޾?9P޾?Vw9Vw9Pw6^-SwnX>Vw>?Yw:1J?\wNr?_wF?bw<?Mw ϔ?Mw ϔ?D,|ND,|ND,|ND,|N*|TrTQ>*|TrTQ> +.|*-G? +.|*-G?1||2˪?1||2˪?)Lɾ)LɾY+HɾBj>Y+HɾBj>-tɾ?-tɾ?.Ⱦ?.Ⱦ?@꿜?d@꿜?d:?C:?CaD>daD>BaD>saD>sF^ HJ=1dC^@K=vH@^`K=s@^`K=s +`?dZ?VD##gbgbA\@BSA\@dɀ@sɀ@s@B=@dװ$;@ dS3;@ C \|@vd[@CC-*=o?d-*=o?B@g!@g!d}N?e!.g_=n!9?h!D!D! Pe@e!g`@ff!d. +@e!&?@e!)ӿw@f!3~?e!@1@1d}N? +s(> +s(> +s(> +s9P޾ 9P޾ u;y޾q1u;y޾q19=x2޾EԿ9=x2޾EԿbw<1$ewhhwkw:N@v@yX>@v@yX>@v@{X>a:@=@{X>a:@=@{X>a:@=@9@v@9@v@9@v@9a:@?@9a:@?@9a:@?@ƑG@ +@ƑG@ +@ƑҐ@@ƑҐ@@7X@‡@7X@‡@7XWߓ@9@7XWߓ@9@#ě@q۰@#ě@q۰@@Y@@Y@ץ`?{@@ץ`?{@@`矖@Mw@`矖@Mw@T=#ě@q۰@T=#ě@q۰@T=@Y@T=@Y@vV>@‡@vV>@‡@vV>Wߓ@9@vV>Wߓ@9@>G@ +@>G@ +@>Ґ@@>Ґ@@5>)@P@5>)@P@5>)@P@7>UN@[@7>UN@[@7>UN@[@ۛ)@P@ۛ)@P@ۛ)@P@ٛUN@]@ٛUN@]@ٛUN@]@`|@|ٯ@`|@|ٯ@`x@W@`x@W@PT#@d@@PT#@d@@IT#"@۾@IT#"@۾@q@@q@@𷯽@q@𷯽@q@`@薰@`@薰@Þ`=@a@Þ`=@a@f5=q@@f5=q@@t5=@q@t5=@q@!>@d@@!>@d@@ !>"@۾@ !>"@۾@D^>|@|ٯ@D^>|@|ٯ@I^>x@W@I^>x@W@yX>@$@yX>@$@yX>@$@{X>a:@R@{X>a:@R@{X>a:@R@9@$@9@$@9@$@9a:@S@9a:@S@9a:@S@ƑG@@ƑG@@ƑҐ@7@ƑҐ@7@7X@5@7X@5@7XWߓ@N@7XWߓ@N@#ě@@#ě@@@@@@ץ`?{@覘@ץ`?{@覘@`矖@a%@`矖@a%@T=#ě@@T=#ě@@T=@@T=@@vV>@5@vV>@5@vV>Wߓ@N@vV>Wߓ@N@>G@@>G@@>Ґ@7@>Ґ@7@5>)@@5>)@@5>)@@7>UN@p}@7>UN@p}@7>UN@p}@ۛ)@@ۛ)@@ۛ)@@ٛUN@q}@ٛUN@q}@ٛUN@q}@`|@@`|@@`x@ +@`x@ +@PT#@x@PT#@x@IT#"@l@IT#"@l@q@/@q@/@𷯽@@𷯽@@`@D@`@D@Þ`=@uü@Þ`=@uü@f5=q@/@f5=q@/@t5=@@t5=@@!>@x@!>@x@ !>"@l@ !>"@l@D^>|@@D^>|@@I^>x@ @I^>x@ @yX>@ޥ}@yX>@ޥ}@yX>@ޥ}@{X>a:@fQ@{X>a:@fQ@{X>a:@fQ@9@}@9@}@9@}@9a:@hQ@9a:@hQ@9a:@hQ@ƑG@X~@ƑG@X~@ƑҐ@$@ƑҐ@$@7X@@7X@@7XWߓ@bb@7XWߓ@bb@#ě@7@#ě@7@@@@@ץ`?{@T@ץ`?{@T@`矖@vӤ@`矖@vӤ@T=#ě@7@T=#ě@7@T=@@T=@@vV>@@vV>@@vV>Wߓ@bb@vV>Wߓ@bb@>G@X~@>G@X~@>Ґ@$@>Ґ@$@5>)@Z}@5>)@Z}@5>)@Z}@7>UN@+@7>UN@+@7>UN@+@ۛ)@Z}@ۛ)@Z}@ۛ)@Z}@ٛUN@+@ٛUN@+@ٛUN@+@`|@Lk~@`|@Lk~@`x@@`x@@PT#@9@PT#@9@IT#"@@IT#"@@q@D@q@D@𷯽@[@𷯽@[@`@$@`@$@Þ`=@q@Þ`=@q@f5=q@D@f5=q@D@t5=@[@t5=@[@!>@9@!>@9@ !>"@@ !>"@@D^>|@Lk~@D^>|@Lk~@I^>x@@I^>x@@yX>@M@yX>@M@yX>@M@{X>a:@{@{X>a:@{@{X>a:@{@9@M@9@M@9@M@9a:@|@9a:@|@9a:@|@ƑG@)N@ƑG@)N@ƑҐ@8@ƑҐ@8@7X@#O@7X@#O@7XWߓ@w@7XWߓ@w@#ě@\O@#ě@\O@@'d@@'d@ץ`?{@"P@ץ`?{@"P@`矖@@`矖@@T=#ě@\O@T=#ě@\O@T=@'d@T=@'d@vV>@#O@vV>@#O@vV>Wߓ@w@vV>Wߓ@w@>G@)N@>G@)N@>Ґ@8@>Ґ@8@5>)@BL@5>)@BL@5>)@BL@7>UN@ي@7>UN@ي@7>UN@ي@ۛ)@BL@ۛ)@BL@ۛ)@BL@ٛUN@ي@ٛUN@ي@ٛUN@ي@`|@tM@`|@tM@`x@3b@`x@3b@PT#@BN@PT#@BN@IT#"@ɋ@IT#"@ɋ@q@nO@q@nO@𷯽@ @𷯽@ @`@LBO@`@LBO@Þ`=@@Þ`=@@f5=q@nO@f5=q@nO@t5=@ @t5=@ @!>@BN@!>@BN@ !>"@ɋ@ !>"@ɋ@D^>|@tM@D^>|@tM@I^>x@2b@I^>x@2b@yX>@0^@yX>@0^@yX>@0^@{X>a:@[e@{X>a:@[e@{X>a:@[e@9@0^@9@0^@9@0^@9a:@ [e@9a:@ [e@9a:@ [e@ƑG@@ƑG@@ƑҐ@f@ƑҐ@f@7X@&@7X@&@7XWߓ@}g@7XWߓ@}g@#ě@'@#ě@'@@v$h@@v$h@ץ`?{@Lb@ץ`?{@Lb@`矖@<_h@`矖@<_h@T=#ě@'@T=#ě@'@T=@v$h@T=@v$h@vV>@&@vV>@&@vV>Wߓ@}g@vV>Wߓ@}g@>G@@>G@@>Ґ@f@>Ґ@f@5>)@j@5>)@j@5>)@j@7>UN@Ze@7>UN@Ze@7>UN@Ze@ۛ)@l@ۛ)@l@ۛ)@l@ٛUN@\e@ٛUN@\e@ٛUN@\e@`|@#@`|@#@`x@ f@`x@ f@PT#@l@PT#@l@IT#"@Zf@IT#"@Zf@q@r@q@r@𷯽@og@𷯽@og@`@t@`@t@Þ`=@dg@Þ`=@dg@f5=q@r@f5=q@r@t5=@og@t5=@og@!>@l@!>@l@ !>"@Zf@ !>"@Zf@D^>|@#@D^>|@#@I^>x@ f@I^>x@ f@yX>@t?yX>@t?yX>@t?{X>a:@H4@{X>a:@H4@{X>a:@H4@9@t?9@t?9@t?9a:@J4@9a:@J4@9a:@J4@ƑG@?ƑG@?ƑҐ@5@ƑҐ@5@7X@?7X@?7XWߓ@@6@7XWߓ@@6@#ě@]?#ě@]?@7@@7@ץ`?{@|?ץ`?{@|?`矖@f7@`矖@f7@T=#ě@]?T=#ě@]?T=@7@T=@7@vV>@?vV>@?vV>Wߓ@@6@vV>Wߓ@@6@>G@?>G@?>Ґ@5@>Ґ@5@5>)@'?5>)@'?5>)@'?7>UN@k4@7>UN@k4@7>UN@k4@ۛ)@)?ۛ)@)?ۛ)@)?ٛUN@k4@ٛUN@k4@ٛUN@k4@`|@?`|@?`x@|5@`x@|5@PT#@)?PT#@)?IT#"@J6@IT#"@J6@q@?q@?𷯽@6@𷯽@6@`@;?`@;?Þ`=@6@Þ`=@6@f5=q@?f5=q@?t5=@6@t5=@6@!>@)?!>@)? !>"@J6@ !>"@J6@D^>|@?D^>|@?I^>x@|5@I^>x@|5@yX>@ +Zl?yX>@ +Zl?yX>@ +Zl?{X>a:@r@{X>a:@r@{X>a:@r@9@Zl?9@Zl?9@Zl?9a:@t@9a:@t@9a:@t@ƑG@p?ƑG@p?ƑҐ@:@ƑҐ@:@7X@t?7X@t?7XWߓ@j5@7XWߓ@j5@#ě@bw?#ě@bw?@@@@ץ`?{@zjx?ץ`?{@zjx?`矖@@`矖@@T=#ě@bw?T=#ě@bw?T=@@T=@@vV>@t?vV>@t?vV>Wߓ@j5@vV>Wߓ@j5@>G@p?>G@p?>Ґ@:@>Ґ@:@5>)@*k?5>)@*k?5>)@*k?7>UN@@7>UN@@7>UN@@ۛ)@*k?ۛ)@*k?ۛ)@*k?ٛUN@@ٛUN@@ٛUN@@`|@oo?`|@oo?`x@@`x@@PT#@r?PT#@r?IT#"@@IT#"@@q@t?q@t?𷯽@'@𷯽@'@`@[u?`@[u?Þ`=@S@Þ`=@S@f5=q@t?f5=q@t?t5=@'@t5=@'@!>@r?!>@r? !>"@@ !>"@@D^>|@oo?D^>|@oo?I^>x@@I^>x@@yX>@*'>yX>@*'>yX>@*'>{X>a:@3ߦ?{X>a:@3ߦ?{X>a:@3ߦ?9@*'>9@*'>9@*'>9a:@7ߦ?9a:@7ߦ?9a:@7ߦ?ƑG@89>ƑG@89>ƑҐ@'.?ƑҐ@'.?7X@JI>7X@JI>7XWߓ@##?7XWߓ@##?#ě@S>#ě@S>@q?@q?ץ`?{@hlW>ץ`?{@hlW>`矖@o?`矖@o?T=#ě@S>T=#ě@S>T=@q?T=@q?vV>@JI>vV>@JI>vV>Wߓ@##?vV>Wߓ@##?>G@89>>G@89>>Ґ@'.?>Ґ@'.?5>)@Xn">5>)@Xn">5>)@Xn">7>UN@G?7>UN@G?7>UN@G?ۛ)@hn">ۛ)@hn">ۛ)@hn">ٛUN@G?ٛUN@G?ٛUN@G?`|@x3>`|@x3>`x@j?`x@j?PT#@h^@>PT#@h^@>IT#"@?IT#"@?q@qH>q@qH>𷯽@?𷯽@?`@.K>`@.K>Þ`=@_?Þ`=@_?f5=q@qH>f5=q@qH>t5=@?t5=@?!>@h^@>!>@h^@> !>"@? !>"@?D^>|@x3>D^>|@x3>I^>x@j?I^>x@j?yX>@yX>@yX>@{X>a:@/ ?{X>a:@/ ?{X>a:@/ ?9@9@9@9a:@/ ?9a:@/ ?9a:@/ ?ƑG@&ƑG@&ƑҐ@?ƑҐ@?7X@<7X@<7XWߓ@?7XWߓ@?#ě@^ #ě@^ @fT?@fT?ץ`?{@F ץ`?{@F `矖@~??`矖@~??T=#ě@^ T=#ě@^ T=@fT?T=@fT?vV>@<vV>@<vV>Wߓ@?vV>Wߓ@?>G@&>G@&>Ґ@?>Ґ@?5>)@5>)@5>)@7>UN@ ?7>UN@ ?7>UN@ ?ۛ)@ۛ)@ۛ)@ٛUN@ ?ٛUN@ ?ٛUN@ ?`|@`|@`x@D?`x@D?PT#@wPT#@wIT#"@{?IT#"@{?q@sq@s𷯽@?𷯽@?`@`@Þ`=@0?Þ`=@0?f5=q@sf5=q@st5=@?t5=@?!>@w!>@w !>"@{? !>"@{?D^>|@D^>|@I^>x@D?I^>x@D?yX>@ yX>@ yX>@ {X>a:@h]{X>a:@h]{X>a:@h]9@ 9@ 9@ 9a:@H]9a:@H]9a:@H]ƑG@[ƑG@[ƑҐ@ KƑҐ@ K7X@f7X@f7XWߓ@a;7XWߓ@a;#ě@_#ě@_@0@0ץ`?{@ӡץ`?{@ӡ`矖@?-`矖@?-T=#ě@_T=#ě@_T=@0T=@0vV>@fvV>@fvV>Wߓ@a;vV>Wߓ@a;>G@[>G@[>Ґ@ K>Ґ@ K5>)@A5>)@A5>)@A7>UN@=b7>UN@=b7>UN@=bۛ)@Aۛ)@Aۛ)@AٛUN@=bٛUN@=bٛUN@=b`|@1`|@1`x@h*Q`x@h*QPT#@PT#@IT#"@MDIT#"@MDq@=q@=𷯽@:<𷯽@:<`@)`@)Þ`=@}9Þ`=@}9f5=q@=f5=q@=t5=@:@!>@ !>"@MD !>"@MDD^>|@1D^>|@1I^>x@*QI^>x@*QyX>@xyX>@xyX>@x{X>a:@y{X>a:@y{X>a:@y9@x9@x9@x9a:@y9a:@y9a:@yƑG@dQƑG@dQƑҐ@QuƑҐ@Qu7X@V7X@V7XWߓ@gq7XWߓ@gq#ě@#ě@@Zn@Znץ`?{@tץ`?{@t`矖@Bm`矖@BmT=#ě@T=#ě@T=@ZnT=@ZnvV>@VvV>@VvV>Wߓ@gqvV>Wߓ@gq>G@dQ>G@dQ>Ґ@Qu>Ґ@Qu5>)@5>)@5>)@7>UN@{7>UN@{7>UN@{ۛ)@ۛ)@ۛ)@ٛUN@{ٛUN@{ٛUN@{`|@p`|@p`x@v`x@vPT#@PT#@IT#"@ʢsIT#"@ʢsq@vdq@vd𷯽@q𷯽@q`@8`@8Þ`=@pÞ`=@pf5=q@vdf5=q@vdt5=@qt5=@q!>@!>@ !>"@ʢs !>"@ʢsD^>|@pD^>|@pI^>x@vI^>x@vI^>x@jI^>x@jD^>|@D^>|@ !>"@ !>"@!>@(!>@(t5=@ðt5=@ðf5=q@Af5=q@AÞ`=@+Þ`=@+`@+`@+𷯽@ð𷯽@ðq@Aq@AIT#"@IT#"@PT#@(PT#@(`x@j`x@j`|@`|@ٛUN@/ٛUN@/ٛUN@/ۛ)@qۛ)@qۛ)@q7>UN@07>UN@07>UN@05>)@q5>)@q5>)@q>Ґ@9>Ґ@9>G@ >G@ vV>Wߓ@RvV>Wߓ@RvV>@:vV>@:T=@hT=@hT=#ě@T=#ě@`矖@?K`矖@?Kץ`?{@ץ`?{@@h@h#ě@#ě@7XWߓ@R7XWߓ@R7X@:7X@:ƑҐ@9ƑҐ@9ƑG@ ƑG@ 9a:@Mͱ9a:@Mͱ9a:@Mͱ9@K9@K9@K{X>a:@Nͱ{X>a:@Nͱ{X>a:@NͱyX>@KyX>@KyX>@KI^>x@I^>x@D^>|@#D^>|@# !>"@ı !>"@ı!>@<0!>@<0t5=@.qt5=@.qf5=q@f5=q@Þ`=@?[Þ`=@?[`@ټ`@ټ𷯽@.q𷯽@.qq@q@IT#"@ıIT#"@ıPT#@<0PT#@<0`x@`x@`|@#`|@#ٛUN@CٛUN@CٛUN@Cۛ)@ۛ)@ۛ)@7>UN@D7>UN@D7>UN@D5>)@5>)@5>)@>Ґ@>Ґ@>G@f>G@fvV>Wߓ@fjvV>Wߓ@fjvV>@vV>@T=@T=@T=#ě@.T=#ě@.`矖@S`矖@Sץ`?{@wץ`?{@w@@#ě@.#ě@.7XWߓ@fj7XWߓ@fj7X@7X@ƑҐ@ƑҐ@ƑG@fƑG@f9a:@a{9a:@a{9a:@a{9@9@9@{X>a:@b{{X>a:@b{{X>a:@b{yX>@yX>@yX>@I^>x@ƀI^>x@ƀD^>|@8ED^>|@8E !>"@_ !>"@_!>@Pޤ!>@Pޤt5=@Ct5=@Cf5=q@f5=q@Þ`=@T Þ`=@T `@̇`@̇𷯽@C𷯽@Cq@q@IT#"@_IT#"@_PT#@PޤPT#@Pޤ`x@ƀ`x@ƀ`|@8E`|@8EٛUN@XOٛUN@XOٛUN@XOۛ)@ͥۛ)@ͥۛ)@ͥ7>UN@YO7>UN@YO7>UN@YO5>)@ͥ5>)@ͥ5>)@ͥ>Ґ@>Ґ@>G@2>G@2vV>Wߓ@{vV>Wߓ@{vV>@vV>@T=@T=@T=#ě@DCT=#ě@DC`矖@N`矖@Nץ`?{@%ץ`?{@%@@#ě@DC#ě@DC7XWߓ@{7XWߓ@{7X@7X@ƑҐ@ƑҐ@ƑG@2ƑG@29a:@v)9a:@v)9a:@v)9@9@9@{X>a:@w){X>a:@w){X>a:@w)yX>@yX>@yX>@I^>x@PI^>x@PD^>|@LD^>|@L !>"@P !>"@P!>@e!>@et5=@Ot5=@Of5=q@Kf5=q@KÞ`=@nOÞ`=@nO`@5`@5𷯽@O𷯽@Oq@Kq@KIT#"@PIT#"@PPT#@ePT#@e`x@P`x@P`|@L`|@LٛUN@QٛUN@QٛUN@Qۛ)@{ۛ)@{ۛ)@{7>UN@Q7>UN@Q7>UN@Q5>)@{5>)@{5>)@{>Ґ@P>Ґ@P>G@FŒ>G@FŒvV>Wߓ@ OvV>Wߓ@ OvV>@EvV>@ET=@NT=@NT=#ě@XT=#ě@X`矖@N`矖@Nץ`?{@Ӌץ`?{@Ӌ@N@N#ě@X#ě@X7XWߓ@ O7XWߓ@ O7X@E7X@EƑҐ@PƑҐ@PƑG@FŒƑG@FŒ9a:@Q9a:@Q9a:@Q9@V9@V9@V{X>a:@Q{X>a:@Q{X>a:@QyX>@VyX>@VyX>@VI^>x@E I^>x@E D^>|@BiD^>|@Bi !>"@x !>"@x!>@th!>@tht5=@t5=@f5=q@gf5=q@gÞ`=@Þ`=@`@g`@g𷯽@𷯽@q@gq@gIT#"@xIT#"@xPT#@thPT#@th`x@E `x@E `|@Bi`|@BiٛUN@W!ٛUN@W!ٛUN@W!ۛ)@Sjۛ)@Sjۛ)@Sj7>UN@W!7>UN@W!7>UN@W!5>)@Sj5>)@Sj5>)@Sj>Ґ@>Ґ@>G@h>G@hvV>Wߓ@HvV>Wߓ@HvV>@8gvV>@8gT=@AT=@AT=#ě@>gT=#ě@>g`矖@"`矖@"ץ`?{@gץ`?{@g@A@A#ě@>g#ě@>g7XWߓ@H7XWߓ@H7X@8g7X@8gƑҐ@ƑҐ@ƑG@hƑG@h9a:@> !9a:@> !9a:@> !9@.j9@.j9@.j{X>a:@@ !{X>a:@@ !{X>a:@@ !yX>@0jyX>@0jyX>@0jI^>x@C߿I^>x@C߿D^>|@8D^>|@8 !>"@]ݿ !>"@]ݿ!>@7!>@7t5=@ܿt5=@ܿf5=q@O7f5=q@O7Þ`=@ENܿÞ`=@ENܿ`@$7`@$7𷯽@ܿ𷯽@ܿq@O7q@O7IT#"@]ݿIT#"@]ݿPT#@7PT#@7`x@C߿`x@C߿`|@8`|@8ٛUN@UfٛUN@UfٛUN@Ufۛ)@9ۛ)@9ۛ)@97>UN@]f7>UN@]f7>UN@]f5>)@95>)@95>)@9>Ґ@޿>Ґ@޿>G@<8>G@<8vV>Wߓ@ܿvV>Wߓ@ܿvV>@bB7vV>@bB7T=@%<ۿT=@%<ۿT=#ě@6T=#ě@6`矖@ڿ`矖@ڿץ`?{@<`6ץ`?{@<`6@%<ۿ@%<ۿ#ě@6#ě@67XWߓ@ܿ7XWߓ@ܿ7X@bB77X@bB7ƑҐ@޿ƑҐ@޿ƑG@<8ƑG@<89a:@9a:@9a:@9@Vd99@Vd99@Vd9{X>a:@{X>a:@{X>a:@yX>@Xd9yX>@Xd9yX>@Xd9?\I>rzTM?|;T?M?|;T,?T?,?T,?T?,?T?>;T??>;ɁT?^:ɁT??^:T?``eT??``e݁T*?I:݁T?*?I:T?>DT??>DYTҾ?-;YTҾ?-;YT?Ҿ?-;YT?Ҿ?-;>+>ZaM^?ǵER| +? >F>>Fۢ>C.>7F>xf>ip1>Nn>spBď>S>o<ߠvr?F>>z?ֲ>GKؐ>FC>p>QI>ņF>QI>ņF>QI>ņFM>>FM>>Fe8>>>G_>$rh>r_>$rh>r/>[> p/>[> p;܈>q(`>/,G?G>,G>÷M>o ?>PG,>6F>ZApk?J??~;k?J??~;KCJ??KCJ??KCJ??KCJ?? CJ??l(K; CJ??l(K;=J?8? :=J?8? :z@J??Wrz@J??WrHCJ??7:HCJ??7:?J??Q?J??QEJ?~?;EJ?~?;EJ?~?;EJ?~?;JH;U? >H;.?m:?e'T?[<.?:?BBXS?H4/?:?ǻmS?B0B/?ٙ:?:[S?fp*Kj/?s:?5+K;H!S?@7/?P:?::DR?/?k*:?>;UR?mǻ/? +9?"9<5pR?QqλT? c?I;T? c?I; T?vc?[ST?g?~7:T?g?yT?g?:T?g?Q;T?g?T?g? T?i?;={T??PT݁T?*?7:{T??{ yǁT?? :T??@Q;T?,?T?,?XT?%?L;Q?z?>z;-Q??-Q??Q?Q?Q;Q?p? :Q?<?6 ycQ??67:Q??m\SQ?{?SI;Q?{?SI;UN??z;VN??VN??@VN??)K;HSN?N? :RN??y~VN??7:ON??ZSUN??;I;UN??;I;B?&?p3;# B?&?# B?&?B?&?Q)K;B?&?9 +:B?&?*|rB?&?O}7:WB?&?PB?&?,;B?&?,;0/?*:?IW?, fأS??T?,?I??I??S?G:T?M?|⻟S?M?4ԻT?f??ԻUQ?~?ԻN??KԻuA? '?qԻfI?|?fHfI?|?fH p:>w^?ǵER|8^DTGG-R?&Y;DTTk:vR?GA;DTTk:R?U^;DT=ĺS?*K;BTLIS?}&#;tDT`Q;cS?& :DTQS?B e:1 CTJg*<=T?[¶ѹ1Aᄒ_Z>V`Y?%DDT:R?ˏ{DT:R?:zDT: S?VDX,DTh7;KS?YBXDT9>S?t.m޺DT#S?NѹtDT`QT? +w J:/QDTdգ;ȣT?.;mp =T?mp =T?ׂO?57ܵ<<ߠvr?ׂO?57ܵ?I[?I>rz?zT1?5zT1?5zT?1?5zT?1?5T,?T?,?T,?T?,?T,?T?,?T,?T?,?T,?T?,?T,?T?,?T,?T?,?T,?T?,?M> +>V?NNV? U =?>E? #>l>rE?>2 >t E?>xf>ip?1>Nn>sp?v>FT>bo?K=өZpS>Rz\>.w?%?>KE?>M>o?0>>XE??y>E??y>E??y>E? +I>t>G? +I>t>G?I F>êq>s?I F>êq>s?>Z>:p?>Z>:p?;܈>q(`>/F?z>{G>2p?8? >mF?8? >mF?֐>iyC>p?7J?K?ݵ7J?K?ݵ7J?K?ݵ7J?K?ݵKCJ??KCJ??KCJ??KCJ??KCJ??KCJ??KCJ??KCJ??KCJ??KCJ??xFJ??xFJ??xFJ??xFJ??xFJ??xFJ??ܐV?f ^<-? ;?/yBU?Ɋ <-?L;?bӭU? ;.?;?)KeU?h +;:.?;?k84U?! U;x].?k;?!JT?:RD;d.?I;?UT?cl:%T?yc?%T?yc?%T?yc?%T?yc?%T?yc?%T?yc?%T?yc?%T?yc?~T??T?,?T?,?T?,?T?,?T?,?T?,?T?,?sT?y?PsT?y?PfQ??fQ??yQ??yQ??yQ??yQ??Q??Q??VN??VN??VN??VN??VN??VN??VN??VN??B?&?z B?&?z B?&?B?&?B?&?B?&?B?&?B?&?B?&?B?&?I?;?I+˻I?;?I+˻ e>bv?NNV? U =!>T!>T>U? N-:>U? N-:DTTk:!T?xQDTTk:T?AĺDTTk:@U? N.DTTk:KU? >DTTk:U?<: NxrDTTk:U? -DTTk:QU? `DTTk:*V?G< QTnCTT?MӴ8DT:T?MG;DT:U? JEX;DT:NSU?h A;DT:GU?% 2c;DT:U?' (;DT:m*V?; ;DT:rV? T݆N>T݆T?5L.;T?5L.;DT:6T?9DT:T?5зQ:DT:kU? G:DT:]U?u :DT:U? ;DT:U? H;DT:#V?H +7;DT:8dV? BX;CTUx4T?IDTTk:T?]ŷѹDTTk:;U?WKDTTk:>U? EQDTTk:zU?I DTTk:U? fDTTk:U?y řĺDTTk:0V?B5 @޺ WcU?X IӁT#?:ӁT#?:ӁT?#?:ӁT?#?:T?DX;T??DX;T?IT??ÍT?޺́T??޺?CJ??:?CJ??:?CJ??:?CJ??:@J??ce;@J??ce;CJ??d*CJ??d*7CJ??7CJ??:U?p <-;>U?p <-;6.?;?qN +U?) ;4\.?j;?GT?(:b*;_.?J;?~ףT?e-/;j.?-^;??<j.?-^;??<.T?P9:.T?P9:_T?EW?T_T?EW?TT?jc?!T?g?c*T?g?uk;T?pc?!:T?pc?!:ɁT??^뺱T? ?d*T??k;ЁT?!?:ЁT?!?:YQ??.:YQ??.: Q?ȇ?Tk;8Q??c*QQ??뺧Q?{?"RQ?{?"RsVN??:sVN??: SN?"?\e;3SN???pb*kVN??pGN?`?3GN?`?3B? &?Հ:B? &?Հ:B?&?`e;B?&?# +B?&?F޺'I?v?i'I?v?i;U3?86?6k:F?h""?;-?;?cTCX&U? U;T?ik:T?ik:6T?95T?T?]I:T?C:P,>U? I:bU? H U?| FX;T?5;T?5;BH:TFBH:TFT?iH:T?iH:DT;H4T?I:qBTk;T?5׀7:DTw;lU? R,:DT=ĺ7T?Q HT7:T?]ŷѹGTݠ<U?WVѹ@TcP +U?6 7:T?1;T??1;sT<?z;?g:BeU?i WS?V?2<<T?b?;?T??.I;?T??.I;nT?g?1I?|? >Z.?o;?;NU?J 79T??)KT?k~?DT??>zQ?? +>N??>oA?֮'?>3I?v?I<3I?v?I< Tl뻖U?) mm@T!KjߏU?) />U? dSU? :U?z= +/ƏU?) b>;U?R U?v: ,U?v: ,M~DT医]U?u b;;Ts|U? ѹ GT. GT.U?v: ,U?v: ,jDTR^e4U? J: B>T+zU?I e:?TuU?u ]:^ǵER|ξ+>ZaM + >F>FۢC.>7Fꄾxf>ip1Nn>spBďS>oF>z뼸ߠvr?ֲ>GKؐFC>pQI>ņFQI>ņFQI>ņFM>FM>Fe8㾉>>G_$rh>r_$rh>r/[> p/[> p;܈q(`>/,GG>,G÷M>o >PG,6F>ZApk?J?~;k?J?~;KCJ?KCJ?KCJ?KCJ? CJ?l(K; CJ?l(K;=J8? :=J8? :z@J?Wrz@J?WrHCJ?7:HCJ?7:?J?Q?J?QEJ~?;EJ~?;EJ~?;EJ~?;J<-?;G<6-?{ѸG<6-? <-?)K;3<$-?R:<-?{rE<4-?I:<-?[Pӧ5&`4?;ߔ5t4?|IJ5A4?y7 t584?U7;;]5K4?۝ ;L54?j7?54? :l354?P/%aF!?I};bF!?bF!?KbF!?+K;rbF!? :0bF!?~rbF!?7:`^F!?QdFH!?;dFH!?;U >H;U >H;p-";5pRQqλ/ +9?"9<T c?I;T c?I; Tvc?[STg?~7:Tg?yTg?:Tg?Q;Tg?Tg? Ti?;={T?PT݁T*?7:{T?{ yǁT? :T?@Q;T,?T,?XT%?L;Qz?>z;-Q?-Q?QQ?Q;Qp? :Q<?6 ycQ?67:Q?m\SQ{?SI;Q{?SI;UN?z;VN?VN?@VN?)K;HSNN? :RN?y~VN?7:ON?ZSUN?;I;UN?;I;B&?p3;# B&?# B&?B&?Q)K;B&?9 +:B&?*|rB&?O}7:WB&?PB&?,;B&?,;W, fأ0/*:?IS?T,?I?I?<0-?83945?#;FK'"?T,?;Q?N?pA'?I?I?<0-?8%4+5?W:FK'"?BsR?;/J:?gkT,?S?T,?NQ^?N?rAǫ'?I?I?<0-?89 4K5?A:FK'"?tRa ;dn/Yp:?`c*T,?S?T,?NQ^?N?rAǫ'?I?I?<0-?8y36?Q9FK'"?}Rve:EI/t:?ĺT,?S?T,?wQJ?N?rAǫ'?QI{?ԻQI{?Ի<ŭ-?rλ3T#6?޻Fj&"?Իu>SG:/:?#CػTM?|⻟SM?4ԻTf??ԻUQ~?ԻN?KԻuA '?qԻfI|?fHfI|?fH wC:>iC?C:>iC?5*R+;8?^DTGvRGA;?DTTk:RU^;?DTTk:S*K;?DT=ĺIS}&#;?BTLcS& :t?DT`Q;SB e:?DTQ=T[¶ѹ1? CTJg*_Z>Rˏ{?DT:R:z?DT: SVDX?DT:KSYBX?,DTh7;>St.m޺?DT9SNѹ?DT#T +w J:t?DT`QȣT.;/?QDTdգ;ׂO57ܵp =T?m>p =T?ׂO57ܵ<뼸ߠvr?CPFLa<@R% . :ŀR޺ Rk:RUĺLRV?bG:Rd<S-:ASeTS|k:S}:`QS29SQMѹ SDJ9T{TTdTGFTa-8`RH-E?rDTWsR-`/?DT:Rb'?DT:Sĺ?DTc0\SpJ?BTQSlIx?DT'K;S8xG?DTѸOT`TOW?DCT#`=^sRG:?DTTk:RaY:?DTTk:Rxk:?DTTk:fV?>E? #l>rE?2 >t E?ꄾxf>ip?1Nn>sp?vFT>bo?SRz\>.w?KөZp%>KE?M>o?0>XE?y>E?y>E?y>E? +I߾t>G? +I߾t>G?I Fêq>s?I Fêq>s?Z>:p?Z>:p?;܈q(`>/F?z{G>2p?8 >mF?8 >mF?֐iyC>p?7JK?ݵ7JK?ݵ7JK?ݵ7JK?ݵKCJ?KCJ?KCJ?KCJ?KCJ?KCJ?KCJ?KCJ?KCJ?KCJ?xFJ?xFJ?xFJ?xFJ?xFJ?xFJ?ܐVf ^<˫-abv?>"W>"W>U N-:>U N-:!?>T!?>T!TxQ?DTTk:TAĺ?DTTk:@U N.?DTTk:KU >?DTTk:U<: Nxr?DTTk:U -?DTTk:QU `?DTTk:*VG< QT?DTTk:TMӴ8?nCTTMG;?DT:U JEX;?DT:NSUh A;?DT:GU% 2c;?DT:U' (;?DT:m*V; ;?DT:rV <?DT:Uԫ ʶQG?plW;TxBҷM>tJҷM>tJTxBKөZpa.UQ -7T4TIT]I:TD:nkBU k:bU HFUb I:SU .ĺU5 :U& UA = :U Vp R-; V~p HJV lc*;BV 0T5L.;T5L.;N?>T݆N?>T݆6T9?DT:T5зQ:?DT:kU G:?DT:]Uu :?DT:U ;?DT:U H;?DT:#VH +7;?DT:8dV BX;?DT:4TI?CTUxT]ŷѹ?DTTk:;UWK?DTTk:>U EQ?DTTk:zUI ?DTTk:U f?DTTk:Uy řĺ?DTTk:0VB5 @޺?DTTk:cUX I? W?CJ?:?CJ?:?CJ?:?CJ?:@J?ce;@J?ce;CJ?d*CJ?d*7CJ?7CJ?:<+-?::<+-?:<-?S`e; <-?6#5<&-?޺V55?,;V55?,;55? ;F45?7:4%5?h ;84D5?Տm84D5?Տm}bF!?:}bF!?:_F!?M_e;(_F!?+d*tbF!?SF9!?ݵSF9!?ݵ>Up <-;>Up <-;-[;U386?6k:Fh""?;HU ۷8-;?cTCXTik:Tik:6T95TT]I:TC:P,>U I:bU H U| FX;T5;T5;TiH:TiH:B?H:TFB?H:TF4TI:?DT;HT5׀7:q?BTk;lU R,:?DTw;7TQ?DT=ĺT]ŷѹ ?HT7:<UWVѹ?GTݠP +U6 7:?@TcEJH?Ⱥ;EJH?Ⱥ;6JO?<6JO?<<-?;<4-?o-<Ğ<-?x;Ğ<-?x;a4+5?3;4,5?J;?g:SV?2<<Tb?;?T?.I;?T?.I;nTg?1I|? ><-? 7y3c6?% F'"?>NUJ 79Z.o;?;T?)KTk~?DT?>zQ? +>N?>oA֮'?>3Iv?I<3Iv?I< TlߏU) /m?m@T!Kj>U dSU :Uz= +/ƏU) b>;UR Uv: ,Uv: ,]Uu bM?~DT医U ѹ;?;Ts|Uv: ,Uv: , ?GT. ?GT.4U J:j?DTR^ezUI e: ?B>T+Uu ]:??Tu$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?$L">|> iW@l?>O{=$L"|?> iW@l?>O{=@l>O{=ƾ iW$L">|@l>O{=ƾ iW$L"|?]>f=$L">|]>f=$L"|?H/788?=$L">|H/788?=$L"|?;þi?>$L">|;þi?>$L"|?$L">||?$L">$L"|?|?$L">$L">|;>i?>$L"|?;>i?>$L">|H/?788?=$L"|?H/?788?=$L">|]?>f=$L"|?]?>f=lw$L">|> iWlw$L"|?> iWƾ iW$L">|l?wƾ iW$L"|?l?w$L">|7^?E?/$L"|?7^?E?/$L">|0?q7$L"|?0?q7$L">| >aJiL$L"|? >aJiL|$L"$L">||$L"$L"|? žaJiL$L">| žaJiL$L"|?0q7$L">|0q7$L"|?7^E?/$L">|7^E?/$L"|?7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=7^E?/$L"|?7^E?/$L">|0q7$L"|?0q7$L">| žaJiL$L"|? žaJiL$L">||$L"$L"|?|$L"$L">|$L"|? >aJiL$L">| >aJiL$L"|?0?q7$L">|0?q7$L"|?7^?E?/$L">|7^?E?/ƾ iW$L"|?l?wƾ iW$L">|l?wlw$L"|?> iWlw$L">|> iW$L"|?]?>f=$L">|]?>f=$L"|?H/?788?=$L">|H/?788?=$L"|?;>i?>$L">|;>i?>$L"|?|?$L">$L">||?$L">;þi?>$L"|?;þi?>$L">|H/788?=$L"|?H/788?=$L">|]>f=$L"|?]>f=$L">|@l>O{=ƾ iW$L"|?@l>O{=ƾ iW$L">|$L"|?> iW@l?>O{=$L">|> iW@l?>O{=?Hd=p?,>8#?Y=8#?Y=??PN=??PN=E?C=E?C=Jx?7=Jx?7=~~?,=~~?,= T?!= T?!=)?h=)?h=V> +=V> +=)=l>=)=l>=Gx?f?Gx?f??DR???| ???l?2?X?{? (?=?3?F?3?F??>?Ʌ??ʅ??ʅ??a??a??Y?X????1?Ja?1?Ja??????D?5 +?(??4+>?r>?Oa??Oa?@?ӊa?@?ӊa?0?Wa?0?Wa?L?a?L?a?~?_za?~?_za?QT?ta?QT?ta?T)?goa?T)?goa??>ia??>ia?Qf*ZCa?Qf*ZCa?>Ada?>Ada? B?|??G?ũ??@??~??fT?t?ܘ)?@?q> +?X1?0?J??z?p?˅?V,? ͅ??y΅?Ԥ?υ?%~?Uх?:T?҅?)?2ԅ?>Յ?jV*߅?>ׅ?)?L=>!?)?L=>!?*>~?*>~?)??)??hT?k?hT?k?z~?bF?z~?bF?l?!?l?!?ۛ??ۛ??˾?z?˾?z?K?׳?K?׳?)&>>>,>q>>+)?>V>T?>^~?>?@g>ĩ?>?>d>?Dx>p>щ>ԟ)?d>@T?b3>~?hc>?h>?lÊ>n?n>"0?r#>\??6??z۩?2??V?~?y?2T?q? )?]?>>I?(*6?>b5?T?Q??;?O???N??F?M??~?NL??#MT?K??p)?I??>H??`*@@??9>uG??+]?/ ???Dک??Ә?@?~??+T??)?P?>?;*?~>?H9??H9???Q>t?:>?a??a?T??v?D??ʅ?f?^=j???Q???V ??a??a??a?P??8?S̅?b?(?b?(??S=?>Ȓ?r >???P??r? ? ?a? ?a?d?,?CW?֚?v?ͅ?v3??v3??M?H=.c?>X?jۊ>{?!?N?NO??z??=W?a?=W?a?b&??4??F?0υ?@?n?@?n??==d&?l?>`?j>;?D?S?N??9?g?\?}a?\?}a???'߉?^??Ѕ?Չ?4?Չ?4?ۉ?`2=?>?j{>^?h??L????i?wa?i?wa?Si??5Fi?"?b~i? ҅?Ki?X?Ki?X?Ei?0'=Yi?>Oi?fK>Csi?{?i?K??Hmi??5 ??%ra?5 ??%ra? >?Z?>??>?{Ӆ?0>?X}?0>?X}?>?=>?l.>>?b>>?g???J??`>?x?{?la?{?la?ި?%?]??t?ԅ?????2?=?`>?>?S??HI???&?}>fa?}>fa?6>?2>\?>dօ?>?>?`>H=>X>>й>q>P??>H??>?B?j^?>j^?)?$?)?$?&V??&V??)?x?)?x?????1щ?:?1щ?:?Ii??Ii??>?5?>?5?N?P?N?P?>k?>k?B???<)??v??bU>? >?P??P???F??F?????[g??[g?? v~?j? v~?j?iT?(?iT?(?)?,C?)?,C?>j^?>j^?)?$?)?$?&V??&V??)?x?)?x?????1щ?:?1щ?:?Ii??Ii??>?5?>?5?N?P?N?P?>k?>k?V=ɜ0><謾=l>=<謾=l>=#>=#>=Ȼ`=Ȼ`=0(=0(=<謾=<謾===X+=X+=Up=Up=@=@=ٔ#?ٔ#?˕L>ug>dg> +蒈>\ʭRNa?\ʭRNa?>Ada?>Ada?i">^a?i">^a?IYa?IYa?e1Sa?e1Sa?\ʭRNa?\ʭRNa?pHa?pHa?+ZCa?+ZCa?rV=a?rV=a?b8a?b8a?k?x>?*">?`޻l?*07?k?`2?+?t+Vd?T0?#>?ػƇ?0?CP??+~?0 +V|?%A_z?">؅?^م?Y1fۅ?܅?GeBޅ?+߅?NtV?}?T:?T:?fT?fT?*?*?9Q?9Q?,l?,l?- +H?- +H?h#?h#?%>?%>?@xu>V%>+&>dz>36>0$>Jӻ|>L#>G>,!>UQ>n+>8>>90>̻A>q#>q>>>Ρ> $#>!?<ܻ ?0?v?<?a+6??VY?`}?">BF??&E??\1C??líB??lltA??"+@@??ցV ???F=??Ln?~>?@">^?+?$1?Ln? O?+?TV~?k.?x>aa?x>aa?>w>? x> ?w>ׅ?y>r?y>r?jx> =H?x> >o\x>Љ>&x>t+?x>F??w>?=\a?=\a?* =? S=? =@م?=?=?6F===o> =Y>*B=?hț=E??؛=6?LVa?LVa?(طQ?m?څ?|k5?|k5?pI=P>)>ɷ?@tD??X>?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?VؾKa?VؾKa?6׾?ڻ׾2? +Cؾ݅?־~?־~?0Z׾`=.׾^>}׾Ɉ>R׾?"NؾB??2ؾF?жFa?жFa?p?V?ޅ?h?h?0=1PP>3>}$?DZ@???BA@a?BA@a?.@~? @}?0Ah?.?E?.?E?@=@>R@i>@G?|k9>kk?0kr>??NkV? -5a? -5a?"?*ߊ@y?D?v=?(@=?? ?B?B?ފJ>ʊ >WRn?qڼ?WRn?qڼ?bO?kb>x?bO?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?bO?bO? +? +?b*?b*?LTr1?LTr1?K?K?z>?z>?a=\?a=\?0c?0c? +? +?`վ?`վ?V6 ?V6 ??B$??B$?i>?i>?" Y?" Y?WRn?qڼ?qڼ?Zʛ8?k[?ȉ?Bz>?\&>?|=?2??F+?dB?$?Ծ???)?t>?T#T?6Hi?m~?bO?kb>x?bO?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?bO?bO? +? +?b*?b*?LTr1?LTr1?K?K?z>?z>?a=\?a=\?0c?0c? +? +?`վ?`վ?V6 ?V6 ??B$??B$?i>?i>?" Y?" Y?0(=l>=0(=l>=#>=#>=Ȼ`=Ȼ`=0(=0(=e1Sa?e1Sa?>Ada?>Ada?i">^a?i">^a?IYa?IYa?e1Sa?e1Sa?*07?x>?*">?`޻l?*07?0?}>>?#>?ػƇ?0?CP?}>>?Y1fۅ?>ׅ?">؅?^م?Y1fۅ?܅?>ׅ?,l?L=>!?,l?L=>!?- +H?- +H?h#?h#?%>?%>?- +H?L=>!?- +H?L=>!?36>>>,>0$>Jӻ|>L#>G>0$>>>,>90>̻A>q#>q>90>>Ρ>0?>b5? $#>!?<ܻ ?0?v?>b5?\1C??9>uG??">BF??&E??\1C??líB??9>uG??$1?~>?@">^?+?$1?x>aa?x>aa?>w>? x> ?w>ׅ?y>r?y>r?jx> =H?x> >o\x>Љ>&x>t+?x>F??w>?=\a?=\a?* =? S=? =@م?=?=?6F===o> =Y>*B=?hț=E??؛=6?LVa?LVa?(طQ?m?څ?|k5?|k5?pI=P>)>ɷ?@tD??X>?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?b-?kb>x?b-?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?z>?z>?a=\?a=\?0c?0c? +? +?F+?>?Bz>?\&>?|=?2??F+?dB?$?>?b-?kb>x?b-?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?z>?z>?a=\?a=\?0c?0c? +? +?<謾=<謾===\ʭRNa?\ʭRNa?pHa?pHa?k?`2?*?x>?CP??)~?}>>?܅?GeBޅ?9Q?9Q?,l?,l?dz>36>@)>>Ρ>8>>v?<?líB??lltA??Ln? O?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?VؾKa?VؾKa?6׾?ڻ׾2? +Cؾ݅?־~?־~?0Z׾`=.׾^>}׾Ɉ>R׾?"NؾB??2ؾF?жFa?жFa?p?V?ޅ?h?h?0=1PP>3>}$?DZ@???bO?bO? +? +?H(?kb>x?H(?kb>x? +? +?`վ?`վ?V6 ?V6 ?dB?$?Ծ???4C(?>?bO?bO? +? +?H(?kb>x?H(?kb>x? +? +?`վ?`վ?V6 ?V6 ?Gx?f?Gx?f??DR???| ???l?2?X?{? (?=?3?F?3?F??>?Ʌ??ʅ??ʅ??a??a??Y?X????1?Ja?1?Ja??????D?5 +?(??4+>?r>?Oa??Oa?@?ӊa?@?ӊa?0?Wa?0?Wa?L?a?L?a?~?_za?~?_za?QT?ta?QT?ta?T)?goa?T)?goa??>ia??>ia?Qf*ZCa?Qf*ZCa?>Ada?>Ada? B?|??G?ũ??@??~??fT?t?ܘ)?@?q> +?X1?0?J??z?p?˅?V,? ͅ??y΅?Ԥ?υ?%~?Uх?:T?҅?)?2ԅ?>Յ?jV*߅?>ׅ?)?L=>!?)?L=>!?*>~?*>~?)??)??hT?k?hT?k?z~?bF?z~?bF?l?!?l?!?ۛ??ۛ??˾?z?˾?z?K?׳?K?׳?)&>>>,>q>>+)?>V>T?>^~?>?@g>ĩ?>?>d>?Dx>p>щ>ԟ)?d>@T?b3>~?hc>?h>?lÊ>n?n>"0?r#>\??6??z۩?2??V?~?y?2T?q? )?]?>>I?(*6?>b5?T?Q??;?O???N??F?M??~?NL??#MT?K??p)?I??>H??`*@@??9>uG??+]?/ ???Dک??Ә?@?~??+T??)?P?>?;*?~>?H9??H9???Q>t?:>?a??a?T??v?D??ʅ?f?^=j???Q???V ??a??a??a?P??8?S̅?b?(?b?(??S=?>Ȓ?r >???P??r? ? ?a? ?a?d?,?CW?֚?v?ͅ?v3??v3??M?H=.c?>X?jۊ>{?!?N?NO??z??=W?a?=W?a?b&??4??F?0υ?@?n?@?n??==d&?l?>`?j>;?D?S?N??9?g?\?}a?\?}a???'߉?^??Ѕ?Չ?4?Չ?4?ۉ?`2=?>?j{>^?h??L????i?wa?i?wa?Si??5Fi?"?b~i? ҅?Ki?X?Ki?X?Ei?0'=Yi?>Oi?fK>Csi?{?i?K??Hmi??5 ??%ra?5 ??%ra? >?Z?>??>?{Ӆ?0>?X}?0>?X}?>?=>?l.>>?b>>?g???J??`>?x?{?la?{?la?ި?%?]??t?ԅ?????2?=?`>?>?S??HI???&?}>fa?}>fa?6>?2>\?>dօ?>?>?`>H=>X>>й>q>P??>H??>?B?j^?>j^?)?$?)?$?&V??&V??)?x?)?x?????1щ?:?1щ?:?Ii??Ii??>?5?>?5?N?P?N?P?>k?>k?B???<)??v??bU>? >?P??P???F??F?????[g??[g?? v~?j? v~?j?iT?(?iT?(?)?,C?)?,C?>j^?>j^?)?$?)?$?&V??&V??)?x?)?x?????1щ?:?1щ?:?Ii??Ii??>?5?>?5?N?P?N?P?>k?>k?ٔ#?ٔ#?˕L>ug>dg> +蒈>\ʭRNa?\ʭRNa?>Ada?>Ada?i">^a?i">^a?IYa?IYa?e1Sa?e1Sa?\ʭRNa?\ʭRNa?pHa?pHa?+ZCa?+ZCa?rV=a?rV=a?b8a?b8a?k?x>?*">?`޻l?*07?k?`2?+?t+Vd?T0?#>?ػƇ?0?CP??+~?0 +V|?%A_z?">؅?^م?Y1fۅ?܅?GeBޅ?+߅?NtV?}?T:?T:?fT?fT?*?*?9Q?9Q?,l?,l?- +H?- +H?h#?h#?%>?%>?@xu>V%>+&>dz>36>0$>Jӻ|>L#>G>,!>UQ>n+>8>>90>̻A>q#>q>>>Ρ> $#>!?<ܻ ?0?v?<?a+6??VY?`}?">BF??&E??\1C??líB??lltA??"+@@??ցV ???F=??Ln?~>?@">^?+?$1?Ln? O?+?TV~?k.?x>aa?x>aa?>w>? x> ?w>ׅ?y>r?y>r?jx> =H?x> >o\x>Љ>&x>t+?x>F??w>?=\a?=\a?* =? S=? =@م?=?=?6F===o> =Y>*B=?hț=E??؛=6?LVa?LVa?(طQ?m?څ?|k5?|k5?pI=P>)>ɷ?@tD??X>?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?VؾKa?VؾKa?6׾?ڻ׾2? +Cؾ݅?־~?־~?0Z׾`=.׾^>}׾Ɉ>R׾?"NؾB??2ؾF?жFa?жFa?p?V?ޅ?h?h?0=1PP>3>}$?DZ@???BA@a?BA@a?.@~? @}?0Ah?.?E?.?E?@=@>R@i>@G?|k9>kk?0kr>??NkV? -5a? -5a?"?*ߊ@y?D?v=?(@=?? ?B?B?ފJ>ʊ >qڼ?WRn?WRn?qڼ?bO?kb>x?bO?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?bO?bO? +? +?b*?b*?LTr1?LTr1?K?K?z>?z>?a=\?a=\?0c?0c? +? +?`վ?`վ?V6 ?V6 ??B$??B$?i>?i>?" Y?" Y?qڼ?WRn?qڼ?k[?Zʛ8?ȉ?Bz>?\&>?|=?2??F+?dB?$?Ծ???)?t>?T#T?6Hi?m~?bO?kb>x?bO?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?bO?bO? +? +?b*?b*?LTr1?LTr1?K?K?z>?z>?a=\?a=\?0c?0c? +? +?`վ?`վ?V6 ?V6 ??B$??B$?i>?i>?" Y?" Y?e1Sa?e1Sa?>Ada?>Ada?i">^a?i">^a?IYa?IYa?e1Sa?e1Sa?*07?x>?*">?`޻l?*07?0?}>>?#>?ػƇ?0?CP?}>>?Y1fۅ?>ׅ?">؅?^م?Y1fۅ?܅?>ׅ?,l?L=>!?,l?L=>!?- +H?- +H?h#?h#?%>?%>?- +H?L=>!?- +H?L=>!?36>>>,>0$>Jӻ|>L#>G>0$>>>,>90>̻A>q#>q>90>>Ρ>0?>b5? $#>!?<ܻ ?0?v?>b5?\1C??9>uG??">BF??&E??\1C??líB??9>uG??$1?~>?@">^?+?$1?x>aa?x>aa?>w>? x> ?w>ׅ?y>r?y>r?jx> =H?x> >o\x>Љ>&x>t+?x>F??w>?=\a?=\a?* =? S=? =@م?=?=?6F===o> =Y>*B=?hț=E??؛=6?LVa?LVa?(طQ?m?څ?|k5?|k5?pI=P>)>ɷ?@tD??X>?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?b-?kb>x?b-?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?z>?z>?a=\?a=\?0c?0c? +? +?F+?>?Bz>?\&>?|=?2??F+?dB?$?>?b-?kb>x?b-?kb>x?Bb%>+?Bb%>+? +? +?b-?b-?z>?z>?a=\?a=\?0c?0c? +? +?\ʭRNa?\ʭRNa?pHa?pHa?k?`2?*?x>?CP??)~?}>>?܅?GeBޅ?9Q?9Q?,l?,l?dz>36>@)>>Ρ>8>>v?<?líB??lltA??Ln? O?>Qa?>Qa? ?˂m?4܅?W\Z?W\Z?Fv=>8>^?8AC??d?VؾKa?VؾKa?6׾?ڻ׾2? +Cؾ݅?־~?־~?0Z׾`=.׾^>}׾Ɉ>R׾?"NؾB??2ؾF?жFa?жFa?p?V?ޅ?h?h?0=1PP>3>}$?DZ@???bO?bO? +? +?H(?kb>x?H(?kb>x? +? +?`վ?`վ?V6 ?V6 ?dB?$?Ծ???4C(?>?bO?bO? +? +?H(?kb>x?H(?kb>x? +? +?`վ?`վ?V6 ?V6 ?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?Z,?Y`?/+?9W?:*?9W?:*?'?/+?(?:*?(?OS?9W?R?9W?,R?Y`?OS?(?R?(?OS?'?mN?4U?_rM?L^?mN?j&?mN?%?I?S?,H?H>]?I?j0%?I?$?nD?R?C?\?nD?j#?nD?X#?C??P?C??Q?C??"?C??jP#?:?\?:?R?:?X#?:?j#?^5?H>]?4?S?4?$?4?j0%?*1?Į^?/?fU?/?*&?/?6&?:*?9W?Z,? b?*?9W?:*?(?:*?^*+?*?(?_T?9W?,R? b?OS?9W?_T?(?OS?^*+?OS?(?_rM?`?mN?4U?mN?$)?mN?j&?,H?g_?I?S?I?'?I?j0%?C?B^?nD?R?nD?Ƅ&?nD?j#?C??Q?C??S?C??jP#?C??%?:?R?:?B^?:?j#?:?Ƅ&?4?S?^5?g_?4?j0%?4?'?/?fU?*1?`?/?6&?/?W)?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?/?6&?/?W)?/?fU?*1?`?4?j0%?4?'?4?S?^5?g_?:?j#?:?Ƅ&?:?R?:?B^?C??jP#?C??%?C??Q?C??S?nD?Ƅ&?nD?j#?C?B^?nD?R?I?'?I?j0%?,H?g_?I?S?mN?$)?mN?j&?_rM?`?mN?4U?_T?(?OS?^*+?OS?(?_T?9W?,R? b?OS?9W?:*?(?:*?^*+?*?(?:*?9W?Z,? b?*?9W?/?*&?/?6&?*1?Į^?/?fU?4?$?4?j0%?^5?H>]?4?S?:?X#?:?j#?:?\?:?R?C??"?C??jP#?C??P?C??Q?nD?j#?nD?X#?nD?R?C?\?I?j0%?I?$?I?S?,H?H>]?mN?j&?mN?%?mN?4U?_rM?L^?OS?(?R?(?OS?'?OS?9W?R?9W?,R?Y`?:*?'?/+?(?:*?(?Z,?Y`?/+?9W?:*?9W?S?Y=ǫ?E= ? L= ? L='Z?>='Z?>=9?@1=9?@1=i?#=i?#=P?=P?=$7? =$7? =?=?=?=?=*8`=I>=*8`=I>=xms=xms=B?y>>>Cj$_>=$)>Ϋ?^>A{#Y=A{#Y=\? >n?>r#>}!>}!>.[ ?T?;?0ص(>F@#'>c $D'>$ ?nԫ?/?F$>y?>|?h!>꼫?Nj>Ef?h>?Lh>f ?#G?8?7:Ծζ ?~?a5?S ?Ӂ?2?\` ?`4j?.? ?P?+?\ ?M7?A(?=7 ??$?^=> ?G?!?&S: +?a? ?ƽ> ?=>N?,?r>Ӿ>ՠp>r\>Gl>܆>=h >&=> >/+0(>IӾ(>3(>>[H(>3h(>(>U=T)>x=>d )>Dvd> Ծ>)>\ >>lOJ>-r= +>t=>T>&a?`><ɑ>>F`? =XX> =F`? =XX> =O=>~=O=>~=5>==5>== hG= hG=D=D=[=[=qPc=qPc=E"Ӿ¿=E"Ӿ¿=R =R =G9tn>CA>Ul>?Pk>?k>.7?4k>P?Hj>_i?uj>況?j>h?Xi>V?Xi>?| +>?H +>*7?8 +>P? +>i? +>ᭁ?. >`?g >?l >.? > +x?P>y?٦>j?>P?>;7?B>]?~z>?a>9>>>4J>`D?|x> +? w>с?u>0j?,t>P?r>nK7?Lq>?o>3?bn>E:Pd>=>l>_:>CӾ>=>V\x>=8>\4>=>n=>|>ya?>7ʑ><>d+0=d+0=LA?)i>*8?4 > ?n?>:?4>t(>7!>/?R=T?>k?.y>>ܰ>+ ?Q?7?'>쾌(>{>szPq=szPq=?`E=:”?i>R? >TӔ?0>?w>;Q>ƺs ?0?3??0><(>AD>ʹ=ʹ=0?8=?i>\?@K >?l>`.?Tv>AuX>M ?v?u0?ik>P(>>==v?*=v?PFj>̨v? >^v?ͦ>v?t>C>n) ?z]?,-?.),>*)(>z)l>(`U=(`U=:]?@=%K]?j>B]?h +>9_]?赦>nw]?ts>z)س>LJ ?pD?)?{ +>ʆL(>և>䆽=䆽=C?=C?k>C? +>C?$>D?r>>= ?$*?&?"=( >r=(>Z^= >====r*?=Fz*?@dk>w*?e +>*?`>*?p>=X> > ?d?G#?u > >N >)>ED > >>3=>3=?=?k>ݦ?(+ +>o?:n>? o>V >>p>? ?C>?p>(!>p>)>p>>Rp>P϶=Rp>P϶=>`=>%l>f> >ګ>V>>m>np>ܶ>,^=R" =R" =,^=f=f=Ӿj=Ӿj=S^n=S^n=i[q=i[q=-u=-u= x= x== |== |=h1=>pw=h1=>pw===y\쾸=y\쾸= @= @= = =^(P=^(P=چ=چ==`==`=">=">=o>0=o>0=,^=R" =,^=A{#Y=%p Q=p Q=p Q=ep Q=Ҿ Q=w Q=+ Q=% Q=([ Q=( Q=뽀 Q=Æ Q=LQ Q=5= Q=ʨ= Q=> Q=<> Q=rzo> Q=f=f=Ӿj=Ӿj=S^n=S^n=i[q=i[q=-u=-u= x= x== |== |=h1=>pw=h1=>pw===y\쾸=y\쾸= @= @= = =^(P=^(P=چ=چ==`==`=">=">=o>0=o>0=@h=Gʅ=ĭ< =I>=ĭ< =I>=>@=>@=t]>=t]>=W==W==ĭ< =ĭ< =os=os=*8`=*8`=K,=K,=u=u=b?0̩=b?0̩=`>?>\і?%>?*o>V?2>rb>?Sr=?Sr=mVt> 8O>?>>a?J ?+? ?Ɩ?x)>–?t)> ?M(>N?<(>n>f6? ?$'?F>Xo>-tn>;>P>~;>9 ?=>N?`W>?]>* ?\>?>s ?(=v?8? ?9͑>h!>X>!>v>d">%?">.?`#>G?#>#da?`$>Sz?$>C?Z%>d> )>wi>t+)>F?(6)>Ѓ.?@)>ZG?K)>Ra?8V)>nz?`)>?k)>>|>?>>6?>.?6>fH?>&a?`>z?>T5?>Ѷ?*=Ѷ?*=tz?x=tz?x=F`? =F`? =eG?F=eG?F= .?h= .?h=?=?=>b=>b=>`=>`=E¾Po>tn>G9tn>OL$2n>܏:=sm>?]>8m>fp>l>O¾>uKA>:8l{>Ϧܴ>d=' >_]>(a >{> >dzG> >ld>r2>D]>>a=>X<&>dӥ>9>Qܣ>¾>W>k>\>j>M4=h>{<2g>[e>E:Pd>Ab>¾ra>.?8>7ʑ><>5>>5>>/?z>.?8> H?>ya?>z?x>*?6>1> ?ʺ>?(8>!>2>p)>9>2>>p=>p=>=غ>Dl>>\ >Ѻ>R>>fʺ>:l>68>>>b?> ? >$">> &)>>>`>=`>=+>=>l>>} >G>&>>j>5>Z>)>? ? ?vp?">h?0)>~?X>?h=?h=*>@=2n*>Cm>*>xD >9*>>z)>Xi>x?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>}?e;? ?D;?#>7;?0F)>`;?>:?=:?=`=Uxn>n>Fߥ>^Wxf>T;?>lD ?T? ? +T?$>T?P)>T?>/T?p=/T?p=r=wan>`3$>ǥ>`e>T?X>9m?OLn?6 ?:n?$>n?[)>An?>]im?8=]im?8=k=ln>k^>Vl>.+mc>0n?>y?߃?~ ??%>?Hf)>$ك?<>`?(ګ=`?(ګ='@|=?ݨh o>aD%>w&>z(b> σ?ؼ>jܾl?t? ?v?%>j?p)>?>W۾o=ܾ:>A`ܾ`> ?> ?{= ?{=۾o>;}۾>?຀=0? rh=?຀=0? rh=-?=#B>z=-?=#B>z=>~=>~=>=>=:?=:?=-?=-?=HG?=HG?=b`? =b`? =y?=y?=i?8=i?8=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=N:? +=N:? +=S?X=S?X=Gm?=Gm?=:N?h=:N?h=?=?=?຀=0? rh=0? rh=?Sr=h? Q=uď? Q=T> Q=> Q=w> Q=H8> Q= ? Q=g? Q= !? Q=ó-? Q=Y:? Q=F? Q={S? Q=cK`? Q=Jl? Q=2y? Q=? Q=q? Q=-?=#B>z=-?=#B>z=>~=>~=>=>=:?=:?=-?=-?=HG?=HG?=b`? =b`? =y?=y?=i?8=i?8=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=N:? +=N:? +=S?X=S?X=Gm?=Gm?=:N?h=:N?h=?=?=W==I>=W==I>=>@=>@=t]>=t]>=W==W==(=v?8? ?ƽ> ?=>N?`W>?]>* ?\>?>s ?(=v?8? ?%?">͑>h!>X>!>v>d">%?">F?(6)>Qˑ>)>d> )>wi>t+)>F?(6)>Ѓ.?@)>Qˑ>)>6?><ɑ>>>|>?>>6?>.?6><ɑ>> .?h=XX> = .?h=XX> =?=?=>b=>b=>`=>`=?=XX> =?=XX> =܏CA>Ul>:=sm>?]>8m>fp>l>:=sm>CA>Ul>=' >_]>(a >{> >=' >zG> >a=>>>4J>ld>r2>D]>>a=>X<&>>>4J>M4=h>=>l>W>k>\>j>M4=h>{<2g>=>l>/?z>7ʑ><>5>>5>>/?z>1> ?ʺ>?(8>!>2>p)>9>2>>p=>p=>=غ>Dl>>\ >Ѻ>R>>fʺ>:l>68>>>b?> ? >$">> &)>>>`>=`>=+>=>l>>} >G>&>>j>5>Z>)>? ? ?vp?">h?0)>~?X>?h=?h=*>@=2n*>Cm>*>xD >9*>>z)>Xi>x?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>:?=#B>z=:?=#B>z=>~=>~=>=>=:?=:?=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=g? Q= > Q=T> Q=> Q=w> Q=H8> Q= ? Q=g? Q= !? Q=ó-? Q= > Q=:?=#B>z=:?=#B>z=>~=>~=>=>=:?=:?=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=ĭ< =ĭ< =os=os=9G?#>#da?`$>͑>h!>Ѓ.?@)>ZG?K)>Ra?8V)>Qˑ>)>.?6>fH?>eG?F=eG?F= .?h= .?h=OL$2n>܏:8l{>zG> >Ϧܴ>dX<&>dӥ>{<2g>[e>.?8> H?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>}?e;? ?D;?#>7;?0F)>`;?>:?=:?=`=Uxn>n>Fߥ>^Wxf>T;?>lD ?T? ? +T?$>T?P)>T?>/T?p=/T?p=r=wan>`3$>ǥ>`e>T?X>-?=-?=HG?=HG?=b`? =#B>z=b`? =#B>z=I!?H=I!?H=N:? +=N:? +=S?X=S?X= !? Q=ó-? Q=Y:? Q=F? Q={S? Q=cK`? Q= > Q=-?=-?=HG?=HG?=b`? =#B>z=b`? =#B>z=I!?H=I!?H=N:? +=N:? +=S?X=S?X=xms=xms=B?y>>>Cj$_>=$)>Ϋ?^>A{#Y=A{#Y=\? >n?>r#>}!>}!>.[ ?T?;?0ص(>F@#'>c $D'>$ ?nԫ?/?F$>y?>|?h!>꼫?Nj>Ef?h>?Lh>f ?#G?8?7:Ծζ ?~?a5?S ?Ӂ?2?\` ?`4j?.? ?P?+?\ ?M7?A(?=7 ??$?^=> ?G?!?&S: +?a? ?ƽ> ?=>N?,?r>Ӿ>ՠp>r\>Gl>܆>=h >&=> >/+0(>IӾ(>3(>>[H(>3h(>(>U=T)>x=>d )>Dvd> Ծ>)>\ >>lOJ>-r= +>t=>T>&a?`><ɑ>>F`? =XX> =F`? =XX> =O=>~=O=>~=5>==5>== hG= hG=D=D=[=[=qPc=qPc=E"Ӿ¿=E"Ӿ¿=R =R =G9tn>CA>Ul>?Pk>?k>.7?4k>P?Hj>_i?uj>況?j>h?Xi>V?Xi>?| +>?H +>*7?8 +>P? +>i? +>ᭁ?. >`?g >?l >.? > +x?P>y?٦>j?>P?>;7?B>]?~z>?a>9>>>4J>`D?|x> +? w>с?u>0j?,t>P?r>nK7?Lq>?o>3?bn>E:Pd>=>l>_:>CӾ>=>V\x>=8>\4>=>n=>|>ya?>7ʑ><>d+0=d+0=LA?)i>*8?4 > ?n?>:?4>t(>7!>/?R=T?>k?.y>>ܰ>+ ?Q?7?'>쾌(>{>szPq=szPq=?`E=:”?i>R? >TӔ?0>?w>;Q>ƺs ?0?3??0><(>AD>ʹ=ʹ=0?8=?i>\?@K >?l>`.?Tv>AuX>M ?v?u0?ik>P(>>==v?*=v?PFj>̨v? >^v?ͦ>v?t>C>n) ?z]?,-?.),>*)(>z)l>(`U=(`U=:]?@=%K]?j>B]?h +>9_]?赦>nw]?ts>z)س>LJ ?pD?)?{ +>ʆL(>և>䆽=䆽=C?=C?k>C? +>C?$>D?r>>= ?$*?&?"=( >r=(>Z^= >====r*?=Fz*?@dk>w*?e +>*?`>*?p>=X> > ?d?G#?u > >N >)>ED > >>3=>3=?=?k>ݦ?(+ +>o?:n>? o>V >>p>? ?C>?p>(!>p>)>p>>Rp>P϶=Rp>P϶=>`=>%l>f> >ګ>V>>m>np>ܶ>,^=R" =,^=R" =f=f=Ӿj=Ӿj=S^n=S^n=i[q=i[q=-u=-u= x= x== |== |=h1=>pw=h1=>pw===y\쾸=y\쾸= @= @= = =^(P=^(P=چ=چ==`==`=">=">=o>0=o>0=,^=,^=R" =%p Q=A{#Y=p Q=p Q=ep Q=Ҿ Q=w Q=+ Q=% Q=([ Q=( Q=뽀 Q=Æ Q=LQ Q=5= Q=ʨ= Q=> Q=<> Q=rzo> Q=f=f=Ӿj=Ӿj=S^n=S^n=i[q=i[q=-u=-u= x= x== |== |=h1=>pw=h1=>pw===y\쾸=y\쾸= @= @= = =^(P=^(P=چ=چ==`==`=">=">=o>0=o>0=b?0̩=b?0̩=`>?>\і?%>?*o>V?2>rb>?Sr=?Sr=mVt> 8O>?>>a?J ?+? ?Ɩ?x)>–?t)> ?M(>N?<(>n>f6? ?$'?F>Xo>-tn>;>P>~;>9 ?=>N?`W>?]>* ?\>?>s ?(=v?8? ?9͑>h!>X>!>v>d">%?">.?`#>G?#>#da?`$>Sz?$>C?Z%>d> )>wi>t+)>F?(6)>Ѓ.?@)>ZG?K)>Ra?8V)>nz?`)>?k)>>|>?>>6?>.?6>fH?>&a?`>z?>T5?>Ѷ?*=Ѷ?*=tz?x=tz?x=F`? =F`? =eG?F=eG?F= .?h= .?h=?=?=>b=>b=>`=>`=E¾Po>tn>G9tn>OL$2n>܏:=sm>?]>8m>fp>l>O¾>uKA>:8l{>Ϧܴ>d=' >_]>(a >{> >dzG> >ld>r2>D]>>a=>X<&>dӥ>9>Qܣ>¾>W>k>\>j>M4=h>{<2g>[e>E:Pd>Ab>¾ra>.?8>7ʑ><>5>>5>>/?z>.?8> H?>ya?>z?x>*?6>1> ?ʺ>?(8>!>2>p)>9>2>>p=>p=>=غ>Dl>>\ >Ѻ>R>>fʺ>:l>68>>>b?> ? >$">> &)>>>`>=`>=+>=>l>>} >G>&>>j>5>Z>)>? ? ?vp?">h?0)>~?X>?h=?h=*>@=2n*>Cm>*>xD >9*>>z)>Xi>x?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>}?e;? ?D;?#>7;?0F)>`;?>:?=:?=`=Uxn>n>Fߥ>^Wxf>T;?>lD ?T? ? +T?$>T?P)>T?>/T?p=/T?p=r=wan>`3$>ǥ>`e>T?X>9m?OLn?6 ?:n?$>n?[)>An?>]im?8=]im?8=k=ln>k^>Vl>.+mc>0n?>y?߃?~ ??%>?Hf)>$ك?<>`?(ګ=`?(ګ='@|=?ݨh o>aD%>w&>z(b> σ?ؼ>jܾl?t? ?v?%>j?p)>?>W۾o=ܾ:>A`ܾ`> ?> ?{= ?{=۾o>;}۾>0? rh=?຀=?຀=0? rh=-?=#B>z=-?=#B>z=>~=>~=>=>=:?=:?=-?=-?=HG?=HG?=b`? =b`? =y?=y?=i?8=i?8=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=N:? +=N:? +=S?X=S?X=Gm?=Gm?=:N?h=:N?h=?=?=0? rh=?຀=0? rh=h? Q=?Sr=uď? Q=T> Q=> Q=w> Q=H8> Q= ? Q=g? Q= !? Q=ó-? Q=Y:? Q=F? Q={S? Q=cK`? Q=Jl? Q=2y? Q=? Q=q? Q=-?=#B>z=-?=#B>z=>~=>~=>=>=:?=:?=-?=-?=HG?=HG?=b`? =b`? =y?=y?=i?8=i?8=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=N:? +=N:? +=S?X=S?X=Gm?=Gm?=:N?h=:N?h=?=?=(=v?8? ?ƽ> ?=>N?`W>?]>* ?\>?>s ?(=v?8? ?%?">͑>h!>X>!>v>d">%?">F?(6)>Qˑ>)>d> )>wi>t+)>F?(6)>Ѓ.?@)>Qˑ>)>6?><ɑ>>>|>?>>6?>.?6><ɑ>> .?h=XX> = .?h=XX> =?=?=>b=>b=>`=>`=?=XX> =?=XX> =܏CA>Ul>:=sm>?]>8m>fp>l>:=sm>CA>Ul>=' >_]>(a >{> >=' >zG> >a=>>>4J>ld>r2>D]>>a=>X<&>>>4J>M4=h>=>l>W>k>\>j>M4=h>{<2g>=>l>/?z>7ʑ><>5>>5>>/?z>1> ?ʺ>?(8>!>2>p)>9>2>>p=>p=>=غ>Dl>>\ >Ѻ>R>>fʺ>:l>68>>>b?> ? >$">> &)>>>`>=`>=+>=>l>>} >G>&>>j>5>Z>)>? ? ?vp?">h?0)>~?X>?h=?h=*>@=2n*>Cm>*>xD >9*>>z)>Xi>x?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>:?=#B>z=:?=#B>z=>~=>~=>=>=:?=:?=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=g? Q= > Q=T> Q=> Q=w> Q=H8> Q= ? Q=g? Q= !? Q=ó-? Q= > Q=:?=#B>z=:?=#B>z=>~=>~=>=>=:?=:?=ۖ>=ۖ>=K@>H=K@>H=?=?=I!?H=I!?H=9G?#>#da?`$>͑>h!>Ѓ.?@)>ZG?K)>Ra?8V)>Qˑ>)>.?6>fH?>eG?F=eG?F= .?h= .?h=OL$2n>܏:8l{>zG> >Ϧܴ>dX<&>dӥ>{<2g>[e>.?8> H?>[=?l!?^ ?!?"#> +!?;)>D!?>`!?T=`!?T=:=б=혉=,m> = > +=>i=g>!?ڹ>}?e;? ?D;?#>7;?0F)>`;?>:?=:?=`=Uxn>n>Fߥ>^Wxf>T;?>lD ?T? ? +T?$>T?P)>T?>/T?p=/T?p=r=wan>`3$>ǥ>`e>T?X>-?=-?=HG?=HG?=b`? =#B>z=b`? =#B>z=I!?H=I!?H=N:? +=N:? +=S?X=S?X= !? Q=ó-? Q=Y:? Q=F? Q={S? Q=cK`? Q= > Q=-?=-?=HG?=HG?=b`? =#B>z=b`? =#B>z=I!?H=I!?H=N:? +=N:? +=S?X=S?X=????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????'('//. ! &+&,,#),*%,%#01!0! 'UMMTLLSKKRJJQIIPHHOGGNFF2VV4WW6XX8YY:ZZ<[[>\\@]] D_ _VWXYZ[\] _33557799;;==?? +A +AEE }}||{{zzyyxxww v vuu}}||{{zzyyxxww~vvuuNNrOOpPPnQQlRRjSShTTfUUdaFFGGHHIIJJKKLL M M.s.s0q0q 2o2o"4m4m$6k6k&8i8i(:g:g*<e<e,>c>c ~~   +.. .' 0-0-&$$%%"NNFs0FrNr}}3VV22VOOG q 2GpOp||5WW44WPPH"o"4HnPn{{7XX66XQQI $m$6IlQlzz9YY88YRRJ &k&8JjRjyy;ZZ::ZSSK (i(:KhShxx=[[<<[TTL  + +*g*< LfTfww  +?\ \ >>\UUM~,e,>MdUd~~vv  A]]@ @]-e?-?/gU/U1iW1W3kY3Y!5m[5[#@BB7o]7]%9q_9_';sa;a)=uc=c+''(SdvSvTQbtQtRO`rOrPM^pMpNK\nKnLIZlIlJGXjGjHEVhEhFCAfCfDTv +T +RtdRdSPrbPbQNp`N`OLn^L^MJl\J\KHjZHZIFhXFXGDfVDVEuu=+cs+s;)aq)q9'_o'o7%]m%m5#[k#k3!Yi!i1Wgg/Uee-0./0/1w}~wxx{||~~}qqpddcWWVJJI==<00/##" !!$..1;;>HHKUUXbbeoor  $ $ ,1 1 9>>FKKSXX`eemrrz++ 88-EE:RRG__Tllayyn*(*757DBDQOQ^\^kikxvx))(665CCBPPO]]\jjiwwv%#%202?=?LJLYWYfdfsqs , ,"9 9/FF<SSI``Vmmczzp&3@MZgt~'')446AACNNP[[]hhjuuw**+778DDEQQR^^_kklxxy55<|| + + $5$5<< +*++~')~)&& ," "##%)((((*+  $,, !$$#""78846633 9/ /0026555578--199 .110//DEEACC@@ F< <==?CBBBBDE::>FF ;>>=<<QRRNPPMMSIIJJLPOOOOQRGGKSSHKKJII^__[]]ZZ`VVWWY]\\\\^_TTX``UXXWVVkllhjjggmccddfjiiiiklaaemmbeedccxyyuwwttzppqqswvvvvxynnrzzorrqpp~}}|{{~~}}l lk_ +_^R RQEEDBBFPPS]]`jjmF?F?NS@S@[`A`Ahm m uM8MCZ9ZOg:g\t;tiLJ'L'1YW&Y&2fd%f%3sq#s#4K,'K'JX+&X&We*%e%dr#r#qGE G TR +T +a_ a nl n N?ND[@[QhAh^u ukH{U}boI,I,KV+V+Xc*c*ep{prL18L8MY29Y9Zf3:f:gs4;s;t0LM0M7IKK.y"HyH>ND>D E EG.KJ.J)0)J0JL7MC7CFNN>BFF ED D1YZ1Z8VXX,{U{U?[Q?Q RRT,XW,W'1'W1WY8ZO8OS[[?PSS +RQ +Q2fg2g9cee+}b}b@h^@^ +__a+ed+d&2&d2df9g\9\`hh@]`` _^ ^3st3t:prr*ooAukAk lln*rq*q%3%q3qs:ti:imuuAjmm lk k~~||zz~|zw^^C^BBtttt`bb/6/-xx!==-(-//(66=          v ""#)**!!&''$' ' %++," + H +HPGGOFFNEEMDDLCCKBBJAAIQQ-RR/SS1TT3UU5VV7WW9XX; ZZ?QRSTUVWX  Z..0022446688::<<@@xxwwvvuuttssrrqqppxxwwvv~uu}tt|ss{rrzqqyppnIIlJJjKKhLLfMMdNNbOO`PP ^  +AABBCCDDEEFFGGHH (m(m*k*k,i,i.g.g0 e0e2"c2c4$a4a6&_6_8\8\ ~~}}|| +{{ zzyy))("+((+!  IAI*mAnnIxx.QQ-Q-JBJ,kBllJww0RR/R/KCK~.iCjjK~v~v2SS1S1LDL}0gDhhL}u}u4TT3T3MEM +| + 2 eEffM|t|t6UU5U5NFN { "4"cFddN{s{s8VV7V7OGOz$6$aGbbOzrzr:WW9W9PHPy&8 & _H  `  +` +Pyqyq<XX ;X ;    +););a+Q+Qc-S-Se/U/Ug1W1Wi>><3!Y3Yk5#[5[m7%]7]o9'_9_q"#"NOpNp^LMnLn\JKlJlZHIjHjXFGhFhVDEfDfTBCdBdR@Ab@bP=?`=`:OOpMN^M^nKL\K\lIJZIZjGHXGXhEFVEVfCDTCTdABRARb?@P?P`9qq'7o'o_%5m%m]#3k#k[!1i!iY/ggW-eeU+ccS)aaQ+,*+*)fgtft|xxvvxwvwuelewmrrihbvhvujsjc~~yytlklxxwty}t}||}|f|fkg`gtdhudu~ssnuwu~ad~a~cbcVUVIHI<;</./"!"  # -0-:=:GJGTWT  #+#080=E=JRJW_W**7,7D9DQFQ^S^ ))'664CCAPPN]][ ('(545BABONO\[\  %%"22/??<LLIYYV+!+8.8E;ERHR_U_uw +y{$}1>KX}  &(&353@B@MOMZ\Z)*)676CDCPQP]^]zzrr}} u +u +        ww**)((&y$y$!!+%""''()''*++### !!"776553{1{1..82//445644,,788000-../DDCBB@}>}>;;E?<<AABCAA99DEE===:;;<QQPOOMKKHHRLIINNOPNNFFQRRJJJGHHI^^]\\ZXXUU_YVV[[\][[SS^__WWWTUUVvbbcddahhd``gfkkkkljccbbhiilleggf~~ppnzmm||zz{o{xxvv~|zxvtGFG:9:-,-  !+.+8;8EHE!)!.6.;C;HPH((5*5B7BODO' '%4 42AA?NNL&%&323@?@MLM## 00-==:JJG))6,6C9CPFP[U["]W]/_Y_<aqaI$&$131>@>KMKy'(' 454 ABANON ( (' &&$R["R")#   % %& '% %())!!!  5 54331U]/U/,,60--223 42 2**566...+,,- B BA@@>W_<W<99C=::??@ A? ?77BCC;;;899:OONMMKYaIYIFFPJGGLLMNLLDDOPPHHHEFFGjk~j~vhi|h|tfgzfzrdexdxoklk~ijviv|ghtgtzefrerxsbsZ`}Z}wX^{X{uV\yVysbZwbw`Xu`u}^Vs^s{\Tq\qy>YYY==oooo][[ + +QQ + +cncppS         !##!%'!'#%(*%*'(,.(.*,02,2.046062446  "$$ ""&))$&&+--)++/11- +/ +/3 551 +337  577>AF>FDDFJDJHHJNHNLLNSLSQQSWQWUUW[U[YY[_Y_]]_=]=:hmohokmqsmsoquwqwsuxzuzwx|~x~z||~`cc9<e9ebB?fBfi@El@lgGCjGjnEIpEplKGnKnrIMtItpOKrOrvMPyMytROvRv{PT}P}yVR{V{TXT}ZVZX\X^Z^\8a\a;^;d                           "  "  $ & & " $  $  &          +  +                         ! !    # % % ! # # '   % ' '  . 1 6 . 6 4 4 6 : 4 : 8 8 : > 8 > < < > C < C A A C G A G E E G K E K I I K O I O M M O - M - * X ] _ X _ [ ] a c ] c _ a e g a g c e h j e j g h l n h n j l p r l r n p t v p v r t P S t S v ) , U ) U R 2 / V 2 V Y 0 5 \ 0 \ W 7 3 Z 7 Z ^ 5 9 ` 5 ` \ ; 7 ^ ; ^ b 9 = d 9 d ` ? ; b ? b f = @ i = i d B ? f B f k @ D m @ m i F B k F k o D H q D q m J F o J o s H L u H u q N J s N s w L ( Q L Q u + N w + w T ~ ~ } } z y | y  x { {  + +  +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  +  + + +  +  +  + +  +  + + + + +  +  + + + + + + + +  +  + +  +  + +  +  + +  +  + +  +  +  +  +! +& + +& +$ +$ +& +* +$ +* +( +( +* +. +( +. +, +, +. +3 +, +3 +1 +1 +3 +7 +1 +7 +5 +5 +7 +; +5 +; +9 +9 +; +? +9 +? += += +? + += + + +H +M +O +H +O +K +M +Q +S +M +S +O +Q +U +W +Q +W +S +U +X +Z +U +Z +W +X +\ +^ +X +^ +Z +\ +` +b +\ +b +^ +` +d +f +` +f +b +d +@ +C +d +C +f + + +E + +E +B +" + +F +" +F +I + +% +L + +L +G +' +# +J +' +J +N +% +) +P +% +P +L ++ +' +N ++ +N +R +) +- +T +) +T +P +/ ++ +R +/ +R +V +- +0 +Y +- +Y +T +2 +/ +V +2 +V +[ +0 +4 +] +0 +] +Y +6 +2 +[ +6 +[ +_ +4 +8 +a +4 +a +] +: +6 +_ +: +_ +c +8 +< +e +8 +e +a +> +: +c +> +c +g +< + +A +< +A +e + +> +g + +g +D +n +q +v +n +v +t +t +v +z +t +z +x +x +z +~ +x +~ +| +| +~ + +| + + + + + + + + + + + + + + + + + + + + + + +m + +m +j + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +i +l + +i + + +r +o + +r + + +p +u + +p + + +w +s + +w + + +u +y + +u + + +{ +w + +{ + + +y +} + +y + + + +{ + + + + +} + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +h + + + + +k + + +k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + +      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + +  + + + + + + + + +                    #  # ! ! # ' ! ' % % ' + % + ) ) + / ) / - - / - + 8 = ? 8 ? ; = A C = C ? A E G A G C E H J E J G H L N H N J L P R L R N P T V P V R T 0 3 T 3 V 5 5 2   6  6 9   <  < 7   :  : >   @  @ <   >  > B   D  D @   B  B F  I  I D "  F " F K $ M M I & " K & K O $ ( Q $ Q M * & O * O S ( , U ( U Q . * S . S W ,  1 , 1 U . W W 4 _ _ c h h e j j n u u p | |  b ^ \ b \ ` o k i o i m ~ ~ [ Y Y { a a ] e e a c c g g g j l l h p p l n n r r r x w w t Z } z Z z X ^ Z X ^ X \ f b ` f ` d k f d k d i s o m s m q y s q y q v ] ] Y [ [ _ * & *  , 1  ,   7 3 + 7 +  9 >  9   F C  F       " E  "  ' % ! ' ! # + ) % + % ' / - ) / ) + 2 0 - 2 - / 6 4 0 6 0 2 : 8 4 : 4 6 ? < 8 ? 8 : # ! D # D G B B  $ (  $  ( ,  (   . *  .   3 .  3  + 1 5 1  5 9  5  ; 7  ;   A ;  A   = @  =                       $ & " & z v O z O S | X | X U Z Z ^ e e ` l l o R N L R L P _ [ Y _ Y ] r n r n K w u q w q s { y u { u w  } y  y { } }  s q s p I I k t x Q t Q M x | U x U Q ~ z S ~ S W ~ W W Z \ \ X ` ` \ ^ ^ b b b h g g d J m j J j H N J H N H L V R P V P T [ V T [ T Y c _ ] c ] a i c a i a f p t M p M I v r K v K O     !  ' # ' ) .  )  6 3 6   5                      "  "   & $ & " * ( $ * $ & / , ( / ( *   4  4 7 2  2          #  # ! % ! % ) % + ' +  1 +  1   - 0  -   + +              \ No newline at end of file diff --git a/meshes/village/Roof_RoundTiles_6x12.gltf b/meshes/village/Roof_RoundTiles_6x12.gltf new file mode 100644 index 0000000..5dda33e --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x12.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x12" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.021", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1640, + "max":[ + 3.958951234817505, + 4.342607498168945, + 6.828753471374512 + ], + "min":[ + -3.958951234817505, + -0.7821269035339355, + -6.828753471374512 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1640, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":3384, + "max":[ + 4.124891757965088, + 4.890044689178467, + 6.670813083648682 + ], + "min":[ + -4.124891757965088, + -0.6384454965591431, + -6.7070417404174805 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":3384, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":3384, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":3384, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":11544, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19680, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19680, + "byteOffset":19680, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":39360, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":52480, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65600, + "target":34963 + }, + { + "buffer":0, + "byteLength":40608, + "byteOffset":71024, + "target":34962 + }, + { + "buffer":0, + "byteLength":40608, + "byteOffset":111632, + "target":34962 + }, + { + "buffer":0, + "byteLength":27072, + "byteOffset":152240, + "target":34962 + }, + { + "buffer":0, + "byteLength":27072, + "byteOffset":179312, + "target":34962 + }, + { + "buffer":0, + "byteLength":23088, + "byteOffset":206384, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":229472, + "uri":"Roof_RoundTiles_6x12.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x12.gltf.import b/meshes/village/Roof_RoundTiles_6x12.gltf.import new file mode 100644 index 0000000..a20d0da --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x12.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dkdx12rq2432p" +path="res://.godot/imported/Roof_RoundTiles_6x12.gltf-7b583d72163f8b57b57bc5ff614a1b95.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x12.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x12.gltf-7b583d72163f8b57b57bc5ff614a1b95.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x14.bin b/meshes/village/Roof_RoundTiles_6x14.bin new file mode 100644 index 0000000..a449416 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_6x14.bin differ diff --git a/meshes/village/Roof_RoundTiles_6x14.gltf b/meshes/village/Roof_RoundTiles_6x14.gltf new file mode 100644 index 0000000..5c7d834 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x14.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x14" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.077", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1640, + "max":[ + 3.958951234817505, + 4.342607498168945, + 7.82875394821167 + ], + "min":[ + -3.958951234817505, + -0.7821269035339355, + -7.82875394821167 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1640, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1640, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":3872, + "max":[ + 4.124891757965088, + 4.890044689178467, + 7.775058746337891 + ], + "min":[ + -4.124891757965088, + -0.6384454965591431, + -7.877129077911377 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":3872, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":3872, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":3872, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":13404, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19680, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19680, + "byteOffset":19680, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":39360, + "target":34962 + }, + { + "buffer":0, + "byteLength":13120, + "byteOffset":52480, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65600, + "target":34963 + }, + { + "buffer":0, + "byteLength":46464, + "byteOffset":71024, + "target":34962 + }, + { + "buffer":0, + "byteLength":46464, + "byteOffset":117488, + "target":34962 + }, + { + "buffer":0, + "byteLength":30976, + "byteOffset":163952, + "target":34962 + }, + { + "buffer":0, + "byteLength":30976, + "byteOffset":194928, + "target":34962 + }, + { + "buffer":0, + "byteLength":26808, + "byteOffset":225904, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":252712, + "uri":"Roof_RoundTiles_6x14.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x14.gltf.import b/meshes/village/Roof_RoundTiles_6x14.gltf.import new file mode 100644 index 0000000..f6347ad --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x14.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b1g5jbtcfjw0a" +path="res://.godot/imported/Roof_RoundTiles_6x14.gltf-79c6a72beb1448a227a376617a37c9dd.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x14.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x14.gltf-79c6a72beb1448a227a376617a37c9dd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x4.bin b/meshes/village/Roof_RoundTiles_6x4.bin new file mode 100644 index 0000000..6ee5da6 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_6x4.bin differ diff --git a/meshes/village/Roof_RoundTiles_6x4.gltf b/meshes/village/Roof_RoundTiles_6x4.gltf new file mode 100644 index 0000000..3e3278c --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x4.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x4" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Plane.028", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1232, + "max":[ + 4.124891757965088, + 4.890044689178467, + 4.853985786437988 + ], + "min":[ + -4.124891757965088, + -0.6355158090591431, + -0.13820242881774902 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1232, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1232, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1232, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":4308, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":1298, + "max":[ + 3.958950996398926, + 4.341731071472168, + 4.828753471374512 + ], + "min":[ + -3.958950996398926, + -0.7821268439292908, + -0.11829806864261627 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":1298, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":1298, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":1298, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":2268, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":14784, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":14784, + "byteOffset":14784, + "target":34962 + }, + { + "buffer":0, + "byteLength":9856, + "byteOffset":29568, + "target":34962 + }, + { + "buffer":0, + "byteLength":9856, + "byteOffset":39424, + "target":34962 + }, + { + "buffer":0, + "byteLength":8616, + "byteOffset":49280, + "target":34963 + }, + { + "buffer":0, + "byteLength":15576, + "byteOffset":57896, + "target":34962 + }, + { + "buffer":0, + "byteLength":15576, + "byteOffset":73472, + "target":34962 + }, + { + "buffer":0, + "byteLength":10384, + "byteOffset":89048, + "target":34962 + }, + { + "buffer":0, + "byteLength":10384, + "byteOffset":99432, + "target":34962 + }, + { + "buffer":0, + "byteLength":4536, + "byteOffset":109816, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":114352, + "uri":"Roof_RoundTiles_6x4.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x4.gltf.import b/meshes/village/Roof_RoundTiles_6x4.gltf.import new file mode 100644 index 0000000..763d046 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x4.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://0ppr7cjdnbsp" +path="res://.godot/imported/Roof_RoundTiles_6x4.gltf-939ae3337b023e1d53803bea92730ee3.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x4.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x4.gltf-939ae3337b023e1d53803bea92730ee3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x6.bin b/meshes/village/Roof_RoundTiles_6x6.bin new file mode 100644 index 0000000..2ddb485 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_6x6.bin differ diff --git a/meshes/village/Roof_RoundTiles_6x6.gltf b/meshes/village/Roof_RoundTiles_6x6.gltf new file mode 100644 index 0000000..2aff0cc --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x6.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x6" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.152", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1740, + "max":[ + 3.958951234817505, + 4.342607498168945, + 3.7993175983428955 + ], + "min":[ + -3.958951234817505, + -0.7821269035339355, + -3.7874298095703125 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1740, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1740, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1740, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":3048, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":1960, + "max":[ + 4.124891757965088, + 4.890044689178467, + 4.093986511230469 + ], + "min":[ + -4.124891757965088, + -0.6384454965591431, + -3.9382028579711914 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":1960, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":1960, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":1960, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":6684, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":20880, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":20880, + "byteOffset":20880, + "target":34962 + }, + { + "buffer":0, + "byteLength":13920, + "byteOffset":41760, + "target":34962 + }, + { + "buffer":0, + "byteLength":13920, + "byteOffset":55680, + "target":34962 + }, + { + "buffer":0, + "byteLength":6096, + "byteOffset":69600, + "target":34963 + }, + { + "buffer":0, + "byteLength":23520, + "byteOffset":75696, + "target":34962 + }, + { + "buffer":0, + "byteLength":23520, + "byteOffset":99216, + "target":34962 + }, + { + "buffer":0, + "byteLength":15680, + "byteOffset":122736, + "target":34962 + }, + { + "buffer":0, + "byteLength":15680, + "byteOffset":138416, + "target":34962 + }, + { + "buffer":0, + "byteLength":13368, + "byteOffset":154096, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":167464, + "uri":"Roof_RoundTiles_6x6.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x6.gltf.import b/meshes/village/Roof_RoundTiles_6x6.gltf.import new file mode 100644 index 0000000..09816bc --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x6.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://41nu048k0utu" +path="res://.godot/imported/Roof_RoundTiles_6x6.gltf-0356bb8567f8c13a3fba2230973648d3.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x6.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x6.gltf-0356bb8567f8c13a3fba2230973648d3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_6x8.bin b/meshes/village/Roof_RoundTiles_6x8.bin new file mode 100644 index 0000000..d8e5b52 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_6x8.bin differ diff --git a/meshes/village/Roof_RoundTiles_6x8.gltf b/meshes/village/Roof_RoundTiles_6x8.gltf new file mode 100644 index 0000000..c3823db --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x8.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_6x8" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.015", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1752, + "max":[ + 3.958951234817505, + 4.342607498168945, + 4.828753471374512 + ], + "min":[ + -3.958951234817505, + -0.7821269035339355, + -4.828753471374512 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1752, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1752, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1752, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":3048, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":2372, + "max":[ + 4.124891757965088, + 4.890044689178467, + 4.8539862632751465 + ], + "min":[ + -4.124891757965088, + -0.6384454965591431, + -4.756110191345215 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":2372, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":2372, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":2372, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":8340, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":21024, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":21024, + "byteOffset":21024, + "target":34962 + }, + { + "buffer":0, + "byteLength":14016, + "byteOffset":42048, + "target":34962 + }, + { + "buffer":0, + "byteLength":14016, + "byteOffset":56064, + "target":34962 + }, + { + "buffer":0, + "byteLength":6096, + "byteOffset":70080, + "target":34963 + }, + { + "buffer":0, + "byteLength":28464, + "byteOffset":76176, + "target":34962 + }, + { + "buffer":0, + "byteLength":28464, + "byteOffset":104640, + "target":34962 + }, + { + "buffer":0, + "byteLength":18976, + "byteOffset":133104, + "target":34962 + }, + { + "buffer":0, + "byteLength":18976, + "byteOffset":152080, + "target":34962 + }, + { + "buffer":0, + "byteLength":16680, + "byteOffset":171056, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":187736, + "uri":"Roof_RoundTiles_6x8.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_6x8.gltf.import b/meshes/village/Roof_RoundTiles_6x8.gltf.import new file mode 100644 index 0000000..6de4a31 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_6x8.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ceoua3w211fge" +path="res://.godot/imported/Roof_RoundTiles_6x8.gltf-649170579b4e19d88e614d070c0cef55.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_6x8.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_6x8.gltf-649170579b4e19d88e614d070c0cef55.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_8x10.bin b/meshes/village/Roof_RoundTiles_8x10.bin new file mode 100644 index 0000000..8f24cc5 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_8x10.bin differ diff --git a/meshes/village/Roof_RoundTiles_8x10.gltf b/meshes/village/Roof_RoundTiles_8x10.gltf new file mode 100644 index 0000000..da195dd --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x10.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_8x10" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.066", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1632, + "max":[ + 4.9567179679870605, + 5.600559711456299, + 5.858181953430176 + ], + "min":[ + -4.9567179679870605, + -0.7799561023712158, + -5.851998329162598 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1632, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":3340, + "max":[ + 4.975997447967529, + 6.001367092132568, + 6.0074462890625 + ], + "min":[ + -4.975997447967529, + -0.5717926621437073, + -5.844740390777588 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":3340, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":3340, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":3340, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":10728, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19584, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19584, + "byteOffset":19584, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":39168, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":52224, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65280, + "target":34963 + }, + { + "buffer":0, + "byteLength":40080, + "byteOffset":70704, + "target":34962 + }, + { + "buffer":0, + "byteLength":40080, + "byteOffset":110784, + "target":34962 + }, + { + "buffer":0, + "byteLength":26720, + "byteOffset":150864, + "target":34962 + }, + { + "buffer":0, + "byteLength":26720, + "byteOffset":177584, + "target":34962 + }, + { + "buffer":0, + "byteLength":21456, + "byteOffset":204304, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":225760, + "uri":"Roof_RoundTiles_8x10.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_8x10.gltf.import b/meshes/village/Roof_RoundTiles_8x10.gltf.import new file mode 100644 index 0000000..b676221 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x10.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bcb4k2qnfp71t" +path="res://.godot/imported/Roof_RoundTiles_8x10.gltf-37e3ee8b9e3e52722c5e989a5b87b762.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_8x10.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_8x10.gltf-37e3ee8b9e3e52722c5e989a5b87b762.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_8x12.bin b/meshes/village/Roof_RoundTiles_8x12.bin new file mode 100644 index 0000000..ac3354e Binary files /dev/null and b/meshes/village/Roof_RoundTiles_8x12.bin differ diff --git a/meshes/village/Roof_RoundTiles_8x12.gltf b/meshes/village/Roof_RoundTiles_8x12.gltf new file mode 100644 index 0000000..ef3c6c5 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x12.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_8x12" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.047", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1632, + "max":[ + 4.9567179679870605, + 5.600559711456299, + 6.971505165100098 + ], + "min":[ + -4.9567179679870605, + -0.7799561023712158, + -6.918720722198486 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1632, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":5372, + "max":[ + 4.975997447967529, + 6.001367092132568, + 7.015059471130371 + ], + "min":[ + -4.975997447967529, + -0.5717926621437073, + -7.117128372192383 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":5372, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":5372, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":5372, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":16356, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19584, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19584, + "byteOffset":19584, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":39168, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":52224, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65280, + "target":34963 + }, + { + "buffer":0, + "byteLength":64464, + "byteOffset":70704, + "target":34962 + }, + { + "buffer":0, + "byteLength":64464, + "byteOffset":135168, + "target":34962 + }, + { + "buffer":0, + "byteLength":42976, + "byteOffset":199632, + "target":34962 + }, + { + "buffer":0, + "byteLength":42976, + "byteOffset":242608, + "target":34962 + }, + { + "buffer":0, + "byteLength":32712, + "byteOffset":285584, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":318296, + "uri":"Roof_RoundTiles_8x12.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_8x12.gltf.import b/meshes/village/Roof_RoundTiles_8x12.gltf.import new file mode 100644 index 0000000..b23d8aa --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x12.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7k3v8jax2b0i" +path="res://.godot/imported/Roof_RoundTiles_8x12.gltf-c5980c9ae4875a15ab400cc28e15a002.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_8x12.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_8x12.gltf-c5980c9ae4875a15ab400cc28e15a002.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_8x14.bin b/meshes/village/Roof_RoundTiles_8x14.bin new file mode 100644 index 0000000..3385fd3 Binary files /dev/null and b/meshes/village/Roof_RoundTiles_8x14.bin differ diff --git a/meshes/village/Roof_RoundTiles_8x14.gltf b/meshes/village/Roof_RoundTiles_8x14.gltf new file mode 100644 index 0000000..84aec67 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x14.gltf @@ -0,0 +1,302 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_8x14" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0, + "texCoord":1 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1, + "texCoord":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2, + "texCoord":1 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3, + "texCoord":1 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4, + "texCoord":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5, + "texCoord":1 + } + } + } + ], + "meshes":[ + { + "name":"Cube.086", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1632, + "max":[ + 4.9567179679870605, + 5.600559711456299, + 7.82875394821167 + ], + "min":[ + -4.9567179679870605, + -0.7799561023712158, + -7.82875394821167 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1632, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1632, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2712, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":4123, + "max":[ + 4.975997447967529, + 6.001367092132568, + 7.775058746337891 + ], + "min":[ + -4.975997447967529, + -0.5717926621437073, + -7.877129077911377 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4123, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":4123, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":4123, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":13740, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19584, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19584, + "byteOffset":19584, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":39168, + "target":34962 + }, + { + "buffer":0, + "byteLength":13056, + "byteOffset":52224, + "target":34962 + }, + { + "buffer":0, + "byteLength":5424, + "byteOffset":65280, + "target":34963 + }, + { + "buffer":0, + "byteLength":49476, + "byteOffset":70704, + "target":34962 + }, + { + "buffer":0, + "byteLength":49476, + "byteOffset":120180, + "target":34962 + }, + { + "buffer":0, + "byteLength":32984, + "byteOffset":169656, + "target":34962 + }, + { + "buffer":0, + "byteLength":32984, + "byteOffset":202640, + "target":34962 + }, + { + "buffer":0, + "byteLength":27480, + "byteOffset":235624, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":263104, + "uri":"Roof_RoundTiles_8x14.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_8x14.gltf.import b/meshes/village/Roof_RoundTiles_8x14.gltf.import new file mode 100644 index 0000000..b81348f --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x14.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dya7l00541wtx" +path="res://.godot/imported/Roof_RoundTiles_8x14.gltf-72ee4600ef74af158500109464f7169b.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_8x14.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_8x14.gltf-72ee4600ef74af158500109464f7169b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_RoundTiles_8x8.bin b/meshes/village/Roof_RoundTiles_8x8.bin new file mode 100644 index 0000000..16ace0c Binary files /dev/null and b/meshes/village/Roof_RoundTiles_8x8.bin differ diff --git a/meshes/village/Roof_RoundTiles_8x8.gltf b/meshes/village/Roof_RoundTiles_8x8.gltf new file mode 100644 index 0000000..edebd53 --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x8.gltf @@ -0,0 +1,296 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_RoundTiles_8x8" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.020", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1604, + "max":[ + 4.9567179679870605, + 5.600559711456299, + 4.856163024902344 + ], + "min":[ + -4.9567179679870605, + -0.7799561023712158, + -4.856163024902344 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1604, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1604, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1604, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2688, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":2696, + "max":[ + 4.975997447967529, + 6.001367092132568, + 5.247446537017822 + ], + "min":[ + -4.975997447967529, + -0.5717926621437073, + -5.08474063873291 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":2696, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":2696, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":2696, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":8976, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":19248, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":19248, + "byteOffset":19248, + "target":34962 + }, + { + "buffer":0, + "byteLength":12832, + "byteOffset":38496, + "target":34962 + }, + { + "buffer":0, + "byteLength":12832, + "byteOffset":51328, + "target":34962 + }, + { + "buffer":0, + "byteLength":5376, + "byteOffset":64160, + "target":34963 + }, + { + "buffer":0, + "byteLength":32352, + "byteOffset":69536, + "target":34962 + }, + { + "buffer":0, + "byteLength":32352, + "byteOffset":101888, + "target":34962 + }, + { + "buffer":0, + "byteLength":21568, + "byteOffset":134240, + "target":34962 + }, + { + "buffer":0, + "byteLength":21568, + "byteOffset":155808, + "target":34962 + }, + { + "buffer":0, + "byteLength":17952, + "byteOffset":177376, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":195328, + "uri":"Roof_RoundTiles_8x8.bin" + } + ] +} diff --git a/meshes/village/Roof_RoundTiles_8x8.gltf.import b/meshes/village/Roof_RoundTiles_8x8.gltf.import new file mode 100644 index 0000000..f1fb71e --- /dev/null +++ b/meshes/village/Roof_RoundTiles_8x8.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b0pjo7hna5kdm" +path="res://.godot/imported/Roof_RoundTiles_8x8.gltf-d032ab010722fd545d337fcf32f9ff7d.scn" + +[deps] + +source_file="res://meshes/village/Roof_RoundTiles_8x8.gltf" +dest_files=["res://.godot/imported/Roof_RoundTiles_8x8.gltf-d032ab010722fd545d337fcf32f9ff7d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Support2.bin b/meshes/village/Roof_Support2.bin new file mode 100644 index 0000000..16741cb Binary files /dev/null and b/meshes/village/Roof_Support2.bin differ diff --git a/meshes/village/Roof_Support2.gltf b/meshes/village/Roof_Support2.gltf new file mode 100644 index 0000000..8caa0ea --- /dev/null +++ b/meshes/village/Roof_Support2.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Support2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.013", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":124, + "max":[ + 0.09985005855560303, + 0.06566542387008667, + 0.7651262283325195 + ], + "min":[ + -0.09984996169805527, + -0.6772639155387878, + -1.62676236925563e-08 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":124, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":124, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":252, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1488, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1488, + "byteOffset":1488, + "target":34962 + }, + { + "buffer":0, + "byteLength":992, + "byteOffset":2976, + "target":34962 + }, + { + "buffer":0, + "byteLength":504, + "byteOffset":3968, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4472, + "uri":"Roof_Support2.bin" + } + ] +} diff --git a/meshes/village/Roof_Support2.gltf.import b/meshes/village/Roof_Support2.gltf.import new file mode 100644 index 0000000..9ee870c --- /dev/null +++ b/meshes/village/Roof_Support2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://da2joqs3u0apu" +path="res://.godot/imported/Roof_Support2.gltf-e9b633d8220fd134b363f7df5c82b15a.scn" + +[deps] + +source_file="res://meshes/village/Roof_Support2.gltf" +dest_files=["res://.godot/imported/Roof_Support2.gltf-e9b633d8220fd134b363f7df5c82b15a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Tower_RoundTiles.bin b/meshes/village/Roof_Tower_RoundTiles.bin new file mode 100644 index 0000000..913879b Binary files /dev/null and b/meshes/village/Roof_Tower_RoundTiles.bin differ diff --git a/meshes/village/Roof_Tower_RoundTiles.gltf b/meshes/village/Roof_Tower_RoundTiles.gltf new file mode 100644 index 0000000..a6aff85 --- /dev/null +++ b/meshes/village/Roof_Tower_RoundTiles.gltf @@ -0,0 +1,528 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Tower_RoundTiles" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_RoundTiles", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + }, + { + "doubleSided":true, + "name":"MI_MetalOrnaments", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":9 + }, + "metallicRoughnessTexture":{ + "index":10 + } + } + } + ], + "meshes":[ + { + "name":"Cube.037", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + }, + { + "attributes":{ + "POSITION":15, + "NORMAL":16, + "TEXCOORD_0":17, + "TEXCOORD_1":18 + }, + "indices":19, + "material":3 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + }, + { + "sampler":0, + "source":9 + }, + { + "sampler":0, + "source":10 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Normal", + "uri":"T_RoundTiles_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_BaseColor", + "uri":"T_RoundTiles_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RoundTiles_Roughness", + "uri":"T_RoundTiles_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_BaseColor", + "uri":"T_MetalOrnaments_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_MetalOrnaments_Roughness", + "uri":"T_MetalOrnaments_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1084, + "max":[ + 2.6192500591278076, + 2.8834104537963867, + 2.5960004329681396 + ], + "min":[ + -2.6192500591278076, + -0.5719583630561829, + -2.6032395362854004 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1084, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1084, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":1084, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":2304, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":71, + "max":[ + 0.8499592542648315, + 4.8593950271606445, + 0.8499592542648315 + ], + "min":[ + -0.8499592542648315, + 2.8834099769592285, + -0.8499592542648315 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":71, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":71, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":71, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":186, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":3060, + "max":[ + 2.825260639190674, + 4.718158721923828, + 2.713549852371216 + ], + "min":[ + -2.825260639190674, + -0.3076852560043335, + -2.713549852371216 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":3060, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":3060, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":3060, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":8880, + "type":"SCALAR" + }, + { + "bufferView":15, + "componentType":5126, + "count":264, + "max":[ + 0.12427186965942383, + 6.788815498352051, + 0.12506477534770966 + ], + "min":[ + -0.12427186965942383, + 4.511778354644775, + -0.12319160252809525 + ], + "type":"VEC3" + }, + { + "bufferView":16, + "componentType":5126, + "count":264, + "type":"VEC3" + }, + { + "bufferView":17, + "componentType":5126, + "count":264, + "type":"VEC2" + }, + { + "bufferView":18, + "componentType":5126, + "count":264, + "type":"VEC2" + }, + { + "bufferView":19, + "componentType":5123, + "count":702, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":13008, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":13008, + "byteOffset":13008, + "target":34962 + }, + { + "buffer":0, + "byteLength":8672, + "byteOffset":26016, + "target":34962 + }, + { + "buffer":0, + "byteLength":8672, + "byteOffset":34688, + "target":34962 + }, + { + "buffer":0, + "byteLength":4608, + "byteOffset":43360, + "target":34963 + }, + { + "buffer":0, + "byteLength":852, + "byteOffset":47968, + "target":34962 + }, + { + "buffer":0, + "byteLength":852, + "byteOffset":48820, + "target":34962 + }, + { + "buffer":0, + "byteLength":568, + "byteOffset":49672, + "target":34962 + }, + { + "buffer":0, + "byteLength":568, + "byteOffset":50240, + "target":34962 + }, + { + "buffer":0, + "byteLength":372, + "byteOffset":50808, + "target":34963 + }, + { + "buffer":0, + "byteLength":36720, + "byteOffset":51180, + "target":34962 + }, + { + "buffer":0, + "byteLength":36720, + "byteOffset":87900, + "target":34962 + }, + { + "buffer":0, + "byteLength":24480, + "byteOffset":124620, + "target":34962 + }, + { + "buffer":0, + "byteLength":24480, + "byteOffset":149100, + "target":34962 + }, + { + "buffer":0, + "byteLength":17760, + "byteOffset":173580, + "target":34963 + }, + { + "buffer":0, + "byteLength":3168, + "byteOffset":191340, + "target":34962 + }, + { + "buffer":0, + "byteLength":3168, + "byteOffset":194508, + "target":34962 + }, + { + "buffer":0, + "byteLength":2112, + "byteOffset":197676, + "target":34962 + }, + { + "buffer":0, + "byteLength":2112, + "byteOffset":199788, + "target":34962 + }, + { + "buffer":0, + "byteLength":1404, + "byteOffset":201900, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":203304, + "uri":"Roof_Tower_RoundTiles.bin" + } + ] +} diff --git a/meshes/village/Roof_Tower_RoundTiles.gltf.import b/meshes/village/Roof_Tower_RoundTiles.gltf.import new file mode 100644 index 0000000..044b463 --- /dev/null +++ b/meshes/village/Roof_Tower_RoundTiles.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d22fktq1awviy" +path="res://.godot/imported/Roof_Tower_RoundTiles.gltf-06109f8d748f96f54e5ce67ef758dcbf.scn" + +[deps] + +source_file="res://meshes/village/Roof_Tower_RoundTiles.gltf" +dest_files=["res://.godot/imported/Roof_Tower_RoundTiles.gltf-06109f8d748f96f54e5ce67ef758dcbf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1.bin b/meshes/village/Roof_Wooden_2x1.bin new file mode 100644 index 0000000..cc94d9b Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1.bin differ diff --git a/meshes/village/Roof_Wooden_2x1.gltf b/meshes/village/Roof_Wooden_2x1.gltf new file mode 100644 index 0000000..fb79d2c --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.019", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 1.1289291381835938, + 1.0871591567993164, + 1.1612662076950073 + ], + "min":[ + -1.1289291381835938, + -0.14222341775894165, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":114, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":372, + "max":[ + 1.0024120807647705, + 1.0871591567993164, + 1.5191494226455688 + ], + "min":[ + -1.0054757595062256, + -0.1611957550048828, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":372, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":372, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":372, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":558, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":2304, + "target":34962 + }, + { + "buffer":0, + "byteLength":228, + "byteOffset":2880, + "target":34963 + }, + { + "buffer":0, + "byteLength":4464, + "byteOffset":3108, + "target":34962 + }, + { + "buffer":0, + "byteLength":4464, + "byteOffset":7572, + "target":34962 + }, + { + "buffer":0, + "byteLength":2976, + "byteOffset":12036, + "target":34962 + }, + { + "buffer":0, + "byteLength":2976, + "byteOffset":15012, + "target":34962 + }, + { + "buffer":0, + "byteLength":1116, + "byteOffset":17988, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":19104, + "uri":"Roof_Wooden_2x1.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1.gltf.import b/meshes/village/Roof_Wooden_2x1.gltf.import new file mode 100644 index 0000000..8eddd9d --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3ry7rlnh6emq" +path="res://.godot/imported/Roof_Wooden_2x1.gltf-3132e079a35d8c7d956f8b76851b77f8.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1.gltf-3132e079a35d8c7d956f8b76851b77f8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_Center.bin b/meshes/village/Roof_Wooden_2x1_Center.bin new file mode 100644 index 0000000..c1d1d4f Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_Center.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_Center.gltf b/meshes/village/Roof_Wooden_2x1_Center.gltf new file mode 100644 index 0000000..b1edf0c --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Center.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_Center" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.050", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 1, + 1.0622429847717285, + 1.1612662076950073 + ], + "min":[ + -1, + -0.14222341775894165, + -6.397578289352168e-08 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":68, + "max":[ + 1.000000238418579, + 1.0622429847717285, + 1.4989914894104004 + ], + "min":[ + -1, + -0.14530563354492188, + -6.397578289352168e-08 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":102, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1440, + "target":34963 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":1548, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":2364, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":3180, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":3724, + "target":34962 + }, + { + "buffer":0, + "byteLength":204, + "byteOffset":4268, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4472, + "uri":"Roof_Wooden_2x1_Center.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_Center.gltf.import b/meshes/village/Roof_Wooden_2x1_Center.gltf.import new file mode 100644 index 0000000..1ccc179 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Center.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cuy2kff2ocvkm" +path="res://.godot/imported/Roof_Wooden_2x1_Center.gltf-20b24656ce696c8c47546b615eae6efe.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_Center.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_Center.gltf-20b24656ce696c8c47546b615eae6efe.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_Center_Mirror.bin b/meshes/village/Roof_Wooden_2x1_Center_Mirror.bin new file mode 100644 index 0000000..95ee911 Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_Center_Mirror.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf b/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf new file mode 100644 index 0000000..8e8ae9c --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_Center_Mirror" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.125", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":36, + "max":[ + 1, + 1.0622429847717285, + 6.397578289352168e-08 + ], + "min":[ + -1, + -0.14222341775894165, + -1.1612662076950073 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":54, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":68, + "max":[ + 1.000000238418579, + 1.0622429847717285, + 6.397578289352168e-08 + ], + "min":[ + -1, + -0.14530563354492188, + -1.4989914894104004 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":102, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":432, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":108, + "byteOffset":1440, + "target":34963 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":1548, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":2364, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":3180, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":3724, + "target":34962 + }, + { + "buffer":0, + "byteLength":204, + "byteOffset":4268, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4472, + "uri":"Roof_Wooden_2x1_Center_Mirror.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf.import b/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf.import new file mode 100644 index 0000000..9ce0b9c --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dspq2v0nvdfg4" +path="res://.godot/imported/Roof_Wooden_2x1_Center_Mirror.gltf-b3d9e0ba99ae00efc49d9e93f1f9834d.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_Center_Mirror.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_Center_Mirror.gltf-b3d9e0ba99ae00efc49d9e93f1f9834d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_Corner.bin b/meshes/village/Roof_Wooden_2x1_Corner.bin new file mode 100644 index 0000000..d7425d5 Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_Corner.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_Corner.gltf b/meshes/village/Roof_Wooden_2x1_Corner.gltf new file mode 100644 index 0000000..e7d141e --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Corner.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_Corner" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.084", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":16, + "max":[ + 1.1612663269042969, + 0.12281771749258041, + 0 + ], + "min":[ + -8.940696716308594e-08, + -0.14222341775894165, + -1.1612663269042969 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":24, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":144, + "max":[ + 1.4433565139770508, + 1.014207124710083, + 0.11389486491680145 + ], + "min":[ + -0.10090384632349014, + -0.16884352266788483, + -1.4429664611816406 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":144, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":144, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":144, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":222, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":192, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":192, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":512, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":640, + "target":34963 + }, + { + "buffer":0, + "byteLength":1728, + "byteOffset":688, + "target":34962 + }, + { + "buffer":0, + "byteLength":1728, + "byteOffset":2416, + "target":34962 + }, + { + "buffer":0, + "byteLength":1152, + "byteOffset":4144, + "target":34962 + }, + { + "buffer":0, + "byteLength":1152, + "byteOffset":5296, + "target":34962 + }, + { + "buffer":0, + "byteLength":444, + "byteOffset":6448, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6892, + "uri":"Roof_Wooden_2x1_Corner.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_Corner.gltf.import b/meshes/village/Roof_Wooden_2x1_Corner.gltf.import new file mode 100644 index 0000000..1821e80 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Corner.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://4lmfmwc7ks17" +path="res://.godot/imported/Roof_Wooden_2x1_Corner.gltf-da3eeb8e0ad3ddf286ec5b51986b96e8.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_Corner.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_Corner.gltf-da3eeb8e0ad3ddf286ec5b51986b96e8.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_L.bin b/meshes/village/Roof_Wooden_2x1_L.bin new file mode 100644 index 0000000..32e3226 Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_L.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_L.gltf b/meshes/village/Roof_Wooden_2x1_L.gltf new file mode 100644 index 0000000..6fa6cea --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_L.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.039", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":56, + "max":[ + 1, + 1.0871591567993164, + 1.1612662076950073 + ], + "min":[ + -1.1289291381835938, + -0.14222341775894165, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":56, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":56, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":56, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":90, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":256, + "max":[ + 0.9964578151702881, + 1.0871591567993164, + 1.5191494226455688 + ], + "min":[ + -1.0054757595062256, + -0.1611957550048828, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":256, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":256, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":256, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":384, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":672, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":672, + "target":34962 + }, + { + "buffer":0, + "byteLength":448, + "byteOffset":1344, + "target":34962 + }, + { + "buffer":0, + "byteLength":448, + "byteOffset":1792, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":2240, + "target":34963 + }, + { + "buffer":0, + "byteLength":3072, + "byteOffset":2420, + "target":34962 + }, + { + "buffer":0, + "byteLength":3072, + "byteOffset":5492, + "target":34962 + }, + { + "buffer":0, + "byteLength":2048, + "byteOffset":8564, + "target":34962 + }, + { + "buffer":0, + "byteLength":2048, + "byteOffset":10612, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":12660, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13428, + "uri":"Roof_Wooden_2x1_L.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_L.gltf.import b/meshes/village/Roof_Wooden_2x1_L.gltf.import new file mode 100644 index 0000000..337ecd5 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://wln5klpxjuno" +path="res://.godot/imported/Roof_Wooden_2x1_L.gltf-cbc8d0ec90aa3455e1c5b1fb1177b7d1.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_L.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_L.gltf-cbc8d0ec90aa3455e1c5b1fb1177b7d1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_Middle.bin b/meshes/village/Roof_Wooden_2x1_Middle.bin new file mode 100644 index 0000000..c66c533 Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_Middle.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_Middle.gltf b/meshes/village/Roof_Wooden_2x1_Middle.gltf new file mode 100644 index 0000000..cc74004 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Middle.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_Middle" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.138", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":48, + "max":[ + 1, + 1.0622429847717285, + 1 + ], + "min":[ + -0.9999999403953552, + 0.9243063926696777, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":48, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":48, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":48, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":72, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":576, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":1920, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2064, + "uri":"Roof_Wooden_2x1_Middle.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_Middle.gltf.import b/meshes/village/Roof_Wooden_2x1_Middle.gltf.import new file mode 100644 index 0000000..fa40ae8 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_Middle.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b5jy2se73u6sm" +path="res://.godot/imported/Roof_Wooden_2x1_Middle.gltf-d61335dfb0e6525d5e52ecfb767dc5ff.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_Middle.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_Middle.gltf-d61335dfb0e6525d5e52ecfb767dc5ff.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Roof_Wooden_2x1_R.bin b/meshes/village/Roof_Wooden_2x1_R.bin new file mode 100644 index 0000000..b9ce03f Binary files /dev/null and b/meshes/village/Roof_Wooden_2x1_R.bin differ diff --git a/meshes/village/Roof_Wooden_2x1_R.gltf b/meshes/village/Roof_Wooden_2x1_R.gltf new file mode 100644 index 0000000..5c38407 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_R.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Roof_Wooden_2x1_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.055", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":56, + "max":[ + 1.1289291381835938, + 1.0871591567993164, + 1.1612662076950073 + ], + "min":[ + -1, + -0.14222341775894165, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":56, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":56, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":56, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":90, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":256, + "max":[ + 1.0054757595062256, + 1.0871591567993164, + 1.5191494226455688 + ], + "min":[ + -0.9964578151702881, + -0.1611957550048828, + -0.04117286205291748 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":256, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":256, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":256, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":384, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":672, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":672, + "target":34962 + }, + { + "buffer":0, + "byteLength":448, + "byteOffset":1344, + "target":34962 + }, + { + "buffer":0, + "byteLength":448, + "byteOffset":1792, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":2240, + "target":34963 + }, + { + "buffer":0, + "byteLength":3072, + "byteOffset":2420, + "target":34962 + }, + { + "buffer":0, + "byteLength":3072, + "byteOffset":5492, + "target":34962 + }, + { + "buffer":0, + "byteLength":2048, + "byteOffset":8564, + "target":34962 + }, + { + "buffer":0, + "byteLength":2048, + "byteOffset":10612, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":12660, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13428, + "uri":"Roof_Wooden_2x1_R.bin" + } + ] +} diff --git a/meshes/village/Roof_Wooden_2x1_R.gltf.import b/meshes/village/Roof_Wooden_2x1_R.gltf.import new file mode 100644 index 0000000..4405cc1 --- /dev/null +++ b/meshes/village/Roof_Wooden_2x1_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c68l4a40rlmw4" +path="res://.godot/imported/Roof_Wooden_2x1_R.gltf-bf5ecc6fa6bc83ae65cf7c79cd36f9c9.scn" + +[deps] + +source_file="res://meshes/village/Roof_Wooden_2x1_R.gltf" +dest_files=["res://.godot/imported/Roof_Wooden_2x1_R.gltf-bf5ecc6fa6bc83ae65cf7c79cd36f9c9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stair_Interior_Rails.bin b/meshes/village/Stair_Interior_Rails.bin new file mode 100644 index 0000000..95b28c5 Binary files /dev/null and b/meshes/village/Stair_Interior_Rails.bin differ diff --git a/meshes/village/Stair_Interior_Rails.gltf b/meshes/village/Stair_Interior_Rails.gltf new file mode 100644 index 0000000..38386a6 --- /dev/null +++ b/meshes/village/Stair_Interior_Rails.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stair_Interior_Rails" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.073", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":3640, + "max":[ + 0.8583554625511169, + 3.9530751705169678, + 0.24431560933589935 + ], + "min":[ + -0.8583554625511169, + 0.02250903844833374, + -4.31890869140625 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":3640, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":3640, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":9432, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":43680, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":43680, + "byteOffset":43680, + "target":34962 + }, + { + "buffer":0, + "byteLength":29120, + "byteOffset":87360, + "target":34962 + }, + { + "buffer":0, + "byteLength":18864, + "byteOffset":116480, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":135344, + "uri":"Stair_Interior_Rails.bin" + } + ] +} diff --git a/meshes/village/Stair_Interior_Rails.gltf.import b/meshes/village/Stair_Interior_Rails.gltf.import new file mode 100644 index 0000000..c07b887 --- /dev/null +++ b/meshes/village/Stair_Interior_Rails.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d1imd6qqtgy2e" +path="res://.godot/imported/Stair_Interior_Rails.gltf-1d865a262d42efe32bef746b4623a4aa.scn" + +[deps] + +source_file="res://meshes/village/Stair_Interior_Rails.gltf" +dest_files=["res://.godot/imported/Stair_Interior_Rails.gltf-1d865a262d42efe32bef746b4623a4aa.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stair_Interior_Simple.bin b/meshes/village/Stair_Interior_Simple.bin new file mode 100644 index 0000000..3066619 Binary files /dev/null and b/meshes/village/Stair_Interior_Simple.bin differ diff --git a/meshes/village/Stair_Interior_Simple.gltf b/meshes/village/Stair_Interior_Simple.gltf new file mode 100644 index 0000000..0668bcd --- /dev/null +++ b/meshes/village/Stair_Interior_Simple.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stair_Interior_Simple" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.062", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":416, + "max":[ + 0.8413064479827881, + 3.024588108062744, + 0.03472897782921791 + ], + "min":[ + -0.8348733186721802, + -0.01040551345795393, + -4.584810256958008 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":416, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":416, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":624, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4992, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4992, + "byteOffset":4992, + "target":34962 + }, + { + "buffer":0, + "byteLength":3328, + "byteOffset":9984, + "target":34962 + }, + { + "buffer":0, + "byteLength":1248, + "byteOffset":13312, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":14560, + "uri":"Stair_Interior_Simple.bin" + } + ] +} diff --git a/meshes/village/Stair_Interior_Simple.gltf.import b/meshes/village/Stair_Interior_Simple.gltf.import new file mode 100644 index 0000000..b578d5b --- /dev/null +++ b/meshes/village/Stair_Interior_Simple.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://fn48jlm8ur7e" +path="res://.godot/imported/Stair_Interior_Simple.gltf-92009b884aadaada175e04ac7918092c.scn" + +[deps] + +source_file="res://meshes/village/Stair_Interior_Simple.gltf" +dest_files=["res://.godot/imported/Stair_Interior_Simple.gltf-92009b884aadaada175e04ac7918092c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stair_Interior_Solid.bin b/meshes/village/Stair_Interior_Solid.bin new file mode 100644 index 0000000..5f62c7c Binary files /dev/null and b/meshes/village/Stair_Interior_Solid.bin differ diff --git a/meshes/village/Stair_Interior_Solid.gltf b/meshes/village/Stair_Interior_Solid.gltf new file mode 100644 index 0000000..6bb28df --- /dev/null +++ b/meshes/village/Stair_Interior_Solid.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stair_Interior_Solid" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.058", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":606, + "max":[ + 0.8843992948532104, + 3.0278208255767822, + 0.35783979296684265 + ], + "min":[ + -0.8843992948532104, + -0.018151555210351944, + -4.351832866668701 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":606, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":606, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":918, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":7272, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":7272, + "byteOffset":7272, + "target":34962 + }, + { + "buffer":0, + "byteLength":4848, + "byteOffset":14544, + "target":34962 + }, + { + "buffer":0, + "byteLength":1836, + "byteOffset":19392, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":21228, + "uri":"Stair_Interior_Solid.bin" + } + ] +} diff --git a/meshes/village/Stair_Interior_Solid.gltf.import b/meshes/village/Stair_Interior_Solid.gltf.import new file mode 100644 index 0000000..4a37f65 --- /dev/null +++ b/meshes/village/Stair_Interior_Solid.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bt4cn0hu4cbsv" +path="res://.godot/imported/Stair_Interior_Solid.gltf-fb9f542757e68e1d7239644dbef2a7f6.scn" + +[deps] + +source_file="res://meshes/village/Stair_Interior_Solid.gltf" +dest_files=["res://.godot/imported/Stair_Interior_Solid.gltf-fb9f542757e68e1d7239644dbef2a7f6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stair_Interior_SolidExtended.bin b/meshes/village/Stair_Interior_SolidExtended.bin new file mode 100644 index 0000000..8f1c81d Binary files /dev/null and b/meshes/village/Stair_Interior_SolidExtended.bin differ diff --git a/meshes/village/Stair_Interior_SolidExtended.gltf b/meshes/village/Stair_Interior_SolidExtended.gltf new file mode 100644 index 0000000..d835ea6 --- /dev/null +++ b/meshes/village/Stair_Interior_SolidExtended.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stair_Interior_SolidExtended" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.016", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":722, + "max":[ + 0.8843992948532104, + 3.0278208255767822, + 0.35783979296684265 + ], + "min":[ + -0.8843992948532104, + -0.018151553347706795, + -5.80046272277832 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":722, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":722, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":1128, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":8664, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":8664, + "byteOffset":8664, + "target":34962 + }, + { + "buffer":0, + "byteLength":5776, + "byteOffset":17328, + "target":34962 + }, + { + "buffer":0, + "byteLength":2256, + "byteOffset":23104, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":25360, + "uri":"Stair_Interior_SolidExtended.bin" + } + ] +} diff --git a/meshes/village/Stair_Interior_SolidExtended.gltf.import b/meshes/village/Stair_Interior_SolidExtended.gltf.import new file mode 100644 index 0000000..8e0285e --- /dev/null +++ b/meshes/village/Stair_Interior_SolidExtended.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://blaba7vpajd15" +path="res://.godot/imported/Stair_Interior_SolidExtended.gltf-3666c727b5f9d229648224eec5b1d19d.scn" + +[deps] + +source_file="res://meshes/village/Stair_Interior_SolidExtended.gltf" +dest_files=["res://.godot/imported/Stair_Interior_SolidExtended.gltf-3666c727b5f9d229648224eec5b1d19d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_NoFirstStep.bin b/meshes/village/Stairs_Exterior_NoFirstStep.bin new file mode 100644 index 0000000..b989064 Binary files /dev/null and b/meshes/village/Stairs_Exterior_NoFirstStep.bin differ diff --git a/meshes/village/Stairs_Exterior_NoFirstStep.gltf b/meshes/village/Stairs_Exterior_NoFirstStep.gltf new file mode 100644 index 0000000..6df3634 --- /dev/null +++ b/meshes/village/Stairs_Exterior_NoFirstStep.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_NoFirstStep" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.048", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":72, + "max":[ + 0.9000001549720764, + 0.8184158205986023, + 0.5372328758239746 + ], + "min":[ + -0.9000000357627869, + 0.0003792792558670044, + -1.0772459506988525 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":72, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":72, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":120, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":28, + "max":[ + 1.000000238418579, + 0.9999998807907104, + 1 + ], + "min":[ + -1.000000238418579, + -5.094234021706286e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":864, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":864, + "byteOffset":864, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":2304, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":2544, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":2880, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":3216, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":3440, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3512, + "uri":"Stairs_Exterior_NoFirstStep.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_NoFirstStep.gltf.import b/meshes/village/Stairs_Exterior_NoFirstStep.gltf.import new file mode 100644 index 0000000..d50cc73 --- /dev/null +++ b/meshes/village/Stairs_Exterior_NoFirstStep.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c7iywpwlige6n" +path="res://.godot/imported/Stairs_Exterior_NoFirstStep.gltf-bc5363aac5c52060e87b25c54157c940.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_NoFirstStep.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_NoFirstStep.gltf-bc5363aac5c52060e87b25c54157c940.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Platform.bin b/meshes/village/Stairs_Exterior_Platform.bin new file mode 100644 index 0000000..7662278 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Platform.bin differ diff --git a/meshes/village/Stairs_Exterior_Platform.gltf b/meshes/village/Stairs_Exterior_Platform.gltf new file mode 100644 index 0000000..170f565 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Platform" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.090", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":31, + "max":[ + 0.8126132488250732, + 0.9886521697044373, + 1.00067138671875 + ], + "min":[ + -0.8126130700111389, + 0.7817401885986328, + -1.00067138671875 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":31, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":31, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":32, + "max":[ + 1.000000238418579, + 1, + 1 + ], + "min":[ + -1.000000238418579, + -3.820675516279714e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":372, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":372, + "byteOffset":372, + "target":34962 + }, + { + "buffer":0, + "byteLength":248, + "byteOffset":744, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":992, + "target":34963 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1088, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1472, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":1856, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2112, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2208, + "uri":"Stairs_Exterior_Platform.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Platform.gltf.import b/meshes/village/Stairs_Exterior_Platform.gltf.import new file mode 100644 index 0000000..0b59ffd --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cxe8uth0d2hr0" +path="res://.godot/imported/Stairs_Exterior_Platform.gltf-15bab3757b145c0cd543398def245866.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Platform.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Platform.gltf-15bab3757b145c0cd543398def245866.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Platform45.bin b/meshes/village/Stairs_Exterior_Platform45.bin new file mode 100644 index 0000000..f3c8160 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Platform45.bin differ diff --git a/meshes/village/Stairs_Exterior_Platform45.gltf b/meshes/village/Stairs_Exterior_Platform45.gltf new file mode 100644 index 0000000..9d988f7 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform45.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Platform45" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.089", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":25, + "max":[ + 1, + 0.9886521697044373, + 1.00067138671875 + ], + "min":[ + -0.8999999761581421, + 0.7817401885986328, + -0.8027989864349365 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":25, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":25, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":51, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":62, + "max":[ + 1.0006709098815918, + 1, + 1 + ], + "min":[ + -1.000000238418579, + -3.820675516279714e-16, + -1.0000001192092896 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":62, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":62, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":114, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":300, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":300, + "target":34962 + }, + { + "buffer":0, + "byteLength":200, + "byteOffset":600, + "target":34962 + }, + { + "buffer":0, + "byteLength":102, + "byteOffset":800, + "target":34963 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":904, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":1648, + "target":34962 + }, + { + "buffer":0, + "byteLength":496, + "byteOffset":2392, + "target":34962 + }, + { + "buffer":0, + "byteLength":228, + "byteOffset":2888, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3116, + "uri":"Stairs_Exterior_Platform45.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Platform45.gltf.import b/meshes/village/Stairs_Exterior_Platform45.gltf.import new file mode 100644 index 0000000..a6922eb --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform45.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dsanmd0mtueqd" +path="res://.godot/imported/Stairs_Exterior_Platform45.gltf-b01e2f2515b24a3be63eb0dfee7c9932.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Platform45.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Platform45.gltf-b01e2f2515b24a3be63eb0dfee7c9932.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Platform45Clean.bin b/meshes/village/Stairs_Exterior_Platform45Clean.bin new file mode 100644 index 0000000..8a27e60 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Platform45Clean.bin differ diff --git a/meshes/village/Stairs_Exterior_Platform45Clean.gltf b/meshes/village/Stairs_Exterior_Platform45Clean.gltf new file mode 100644 index 0000000..050db7c --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform45Clean.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Platform45Clean" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.171", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":25, + "max":[ + 1, + 0.9886521697044373, + 1.00067138671875 + ], + "min":[ + -0.8999999761581421, + 0.7817401885986328, + -0.8027989864349365 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":25, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":25, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":51, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":42, + "max":[ + 0.9999997615814209, + 1, + 1 + ], + "min":[ + -1.000000238418579, + -3.820675516279714e-16, + -1.0000001192092896 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":42, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":42, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":84, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":300, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":300, + "target":34962 + }, + { + "buffer":0, + "byteLength":200, + "byteOffset":600, + "target":34962 + }, + { + "buffer":0, + "byteLength":102, + "byteOffset":800, + "target":34963 + }, + { + "buffer":0, + "byteLength":504, + "byteOffset":904, + "target":34962 + }, + { + "buffer":0, + "byteLength":504, + "byteOffset":1408, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":1912, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":2248, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2416, + "uri":"Stairs_Exterior_Platform45Clean.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Platform45Clean.gltf.import b/meshes/village/Stairs_Exterior_Platform45Clean.gltf.import new file mode 100644 index 0000000..b352805 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Platform45Clean.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d3c0x2knsfebv" +path="res://.godot/imported/Stairs_Exterior_Platform45Clean.gltf-b8ad83cf556e8e106eaf57118ebea8f7.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Platform45Clean.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Platform45Clean.gltf-b8ad83cf556e8e106eaf57118ebea8f7.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_PlatformU.bin b/meshes/village/Stairs_Exterior_PlatformU.bin new file mode 100644 index 0000000..860d5e3 Binary files /dev/null and b/meshes/village/Stairs_Exterior_PlatformU.bin differ diff --git a/meshes/village/Stairs_Exterior_PlatformU.gltf b/meshes/village/Stairs_Exterior_PlatformU.gltf new file mode 100644 index 0000000..a0e6ae4 --- /dev/null +++ b/meshes/village/Stairs_Exterior_PlatformU.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_PlatformU" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.026", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":18, + "max":[ + 0.9589185118675232, + 0.9886521697044373, + 1.00067138671875 + ], + "min":[ + -0.8999999761581421, + 0.7817401885986328, + -0.8027989864349365 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":18, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":18, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":76, + "max":[ + 1.0000001192092896, + 1, + 0.9999998211860657 + ], + "min":[ + -1.0000001192092896, + -3.820675516279714e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":76, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":76, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":216, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":216, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":432, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":576, + "target":34963 + }, + { + "buffer":0, + "byteLength":912, + "byteOffset":648, + "target":34962 + }, + { + "buffer":0, + "byteLength":912, + "byteOffset":1560, + "target":34962 + }, + { + "buffer":0, + "byteLength":608, + "byteOffset":2472, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":3080, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3416, + "uri":"Stairs_Exterior_PlatformU.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_PlatformU.gltf.import b/meshes/village/Stairs_Exterior_PlatformU.gltf.import new file mode 100644 index 0000000..0adc823 --- /dev/null +++ b/meshes/village/Stairs_Exterior_PlatformU.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://buqj3dmc3x7yc" +path="res://.godot/imported/Stairs_Exterior_PlatformU.gltf-86f66985fb3ae266a3c46281ca7d30cc.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_PlatformU.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_PlatformU.gltf-86f66985fb3ae266a3c46281ca7d30cc.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_SidePlatform.bin b/meshes/village/Stairs_Exterior_SidePlatform.bin new file mode 100644 index 0000000..bf481ed Binary files /dev/null and b/meshes/village/Stairs_Exterior_SidePlatform.bin differ diff --git a/meshes/village/Stairs_Exterior_SidePlatform.gltf b/meshes/village/Stairs_Exterior_SidePlatform.gltf new file mode 100644 index 0000000..8e68cb2 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SidePlatform.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_SidePlatform" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.174", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":39, + "max":[ + 0.9999998807907104, + 0.9886521697044373, + 1.00067138671875 + ], + "min":[ + -0.8126130700111389, + 0.7817401885986328, + -1.00067138671875 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":39, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":39, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":66, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":16, + "max":[ + -0.7999998331069946, + 1, + 1 + ], + "min":[ + -1.000000238418579, + -3.820675516279714e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":24, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":468, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":468, + "byteOffset":468, + "target":34962 + }, + { + "buffer":0, + "byteLength":312, + "byteOffset":936, + "target":34962 + }, + { + "buffer":0, + "byteLength":132, + "byteOffset":1248, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1380, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1572, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":1764, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":1892, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1940, + "uri":"Stairs_Exterior_SidePlatform.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_SidePlatform.gltf.import b/meshes/village/Stairs_Exterior_SidePlatform.gltf.import new file mode 100644 index 0000000..3b6b070 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SidePlatform.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://du440gftsojiy" +path="res://.godot/imported/Stairs_Exterior_SidePlatform.gltf-509180a08cd1fd2cb78c56fc16a8fd4a.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_SidePlatform.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_SidePlatform.gltf-509180a08cd1fd2cb78c56fc16a8fd4a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Sides.bin b/meshes/village/Stairs_Exterior_Sides.bin new file mode 100644 index 0000000..5449b55 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Sides.bin differ diff --git a/meshes/village/Stairs_Exterior_Sides.gltf b/meshes/village/Stairs_Exterior_Sides.gltf new file mode 100644 index 0000000..ac36837 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Sides.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Sides" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.092", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 1.000000238418579, + 1, + 1 + ], + "min":[ + -1.000000238418579, + -3.820675516279714e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":48, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1024, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1120, + "uri":"Stairs_Exterior_Sides.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Sides.gltf.import b/meshes/village/Stairs_Exterior_Sides.gltf.import new file mode 100644 index 0000000..7b9488c --- /dev/null +++ b/meshes/village/Stairs_Exterior_Sides.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bh6680sapq8eq" +path="res://.godot/imported/Stairs_Exterior_Sides.gltf-33bb70520ccdbf7ac81d71117cc33964.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Sides.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Sides.gltf-33bb70520ccdbf7ac81d71117cc33964.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Sides45.bin b/meshes/village/Stairs_Exterior_Sides45.bin new file mode 100644 index 0000000..91a8232 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Sides45.bin differ diff --git a/meshes/village/Stairs_Exterior_Sides45.gltf b/meshes/village/Stairs_Exterior_Sides45.gltf new file mode 100644 index 0000000..18d8f63 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Sides45.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Sides45" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.007", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":42, + "max":[ + 1.0000001192092896, + 1, + 0.9999998211860657 + ], + "min":[ + -0.9999999403953552, + -3.820675516279714e-16, + -1.000000238418579 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":42, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":42, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":84, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":504, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":504, + "byteOffset":504, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":1008, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":1344, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1512, + "uri":"Stairs_Exterior_Sides45.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Sides45.gltf.import b/meshes/village/Stairs_Exterior_Sides45.gltf.import new file mode 100644 index 0000000..da91c8b --- /dev/null +++ b/meshes/village/Stairs_Exterior_Sides45.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://is58av5nfbuh" +path="res://.godot/imported/Stairs_Exterior_Sides45.gltf-55efd8106d79064e6c99ee790aa47c61.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Sides45.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Sides45.gltf-55efd8106d79064e6c99ee790aa47c61.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_SidesU.bin b/meshes/village/Stairs_Exterior_SidesU.bin new file mode 100644 index 0000000..eb9f845 Binary files /dev/null and b/meshes/village/Stairs_Exterior_SidesU.bin differ diff --git a/meshes/village/Stairs_Exterior_SidesU.gltf b/meshes/village/Stairs_Exterior_SidesU.gltf new file mode 100644 index 0000000..821f86f --- /dev/null +++ b/meshes/village/Stairs_Exterior_SidesU.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_SidesU" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.008", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":76, + "max":[ + 1.0000001192092896, + 1, + 0.9999998211860657 + ], + "min":[ + -1.0000001192092896, + -3.820675516279714e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":76, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":76, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":168, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":912, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":912, + "byteOffset":912, + "target":34962 + }, + { + "buffer":0, + "byteLength":608, + "byteOffset":1824, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":2432, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2768, + "uri":"Stairs_Exterior_SidesU.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_SidesU.gltf.import b/meshes/village/Stairs_Exterior_SidesU.gltf.import new file mode 100644 index 0000000..cff73cb --- /dev/null +++ b/meshes/village/Stairs_Exterior_SidesU.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cw3rgsv77tjt7" +path="res://.godot/imported/Stairs_Exterior_SidesU.gltf-13922753460ddd00147ed7a2c595906e.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_SidesU.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_SidesU.gltf-13922753460ddd00147ed7a2c595906e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_SingleSide.bin b/meshes/village/Stairs_Exterior_SingleSide.bin new file mode 100644 index 0000000..9f06b52 Binary files /dev/null and b/meshes/village/Stairs_Exterior_SingleSide.bin differ diff --git a/meshes/village/Stairs_Exterior_SingleSide.gltf b/meshes/village/Stairs_Exterior_SingleSide.gltf new file mode 100644 index 0000000..3c9fda0 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SingleSide.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_SingleSide" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.179", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + -0.8000001907348633, + 1, + 1 + ], + "min":[ + -1.000000238418579, + 0, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"Stairs_Exterior_SingleSide.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_SingleSide.gltf.import b/meshes/village/Stairs_Exterior_SingleSide.gltf.import new file mode 100644 index 0000000..0ef8631 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SingleSide.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bpkcbe6lj8irt" +path="res://.godot/imported/Stairs_Exterior_SingleSide.gltf-385a7b59054f21d2f6593cd51050dc6e.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_SingleSide.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_SingleSide.gltf-385a7b59054f21d2f6593cd51050dc6e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_SingleSideThick.bin b/meshes/village/Stairs_Exterior_SingleSideThick.bin new file mode 100644 index 0000000..358e4eb Binary files /dev/null and b/meshes/village/Stairs_Exterior_SingleSideThick.bin differ diff --git a/meshes/village/Stairs_Exterior_SingleSideThick.gltf b/meshes/village/Stairs_Exterior_SingleSideThick.gltf new file mode 100644 index 0000000..794f4c9 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SingleSideThick.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_SingleSideThick" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.188", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 0.19999980926513672, + 1, + 1 + ], + "min":[ + -0.20000028610229492, + 0, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"Stairs_Exterior_SingleSideThick.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_SingleSideThick.gltf.import b/meshes/village/Stairs_Exterior_SingleSideThick.gltf.import new file mode 100644 index 0000000..c495294 --- /dev/null +++ b/meshes/village/Stairs_Exterior_SingleSideThick.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dg601wclobdio" +path="res://.godot/imported/Stairs_Exterior_SingleSideThick.gltf-d96c59124be7b5ae62d6bdf420be238a.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_SingleSideThick.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_SingleSideThick.gltf-d96c59124be7b5ae62d6bdf420be238a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Straight.bin b/meshes/village/Stairs_Exterior_Straight.bin new file mode 100644 index 0000000..10137f7 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Straight.bin differ diff --git a/meshes/village/Stairs_Exterior_Straight.gltf b/meshes/village/Stairs_Exterior_Straight.gltf new file mode 100644 index 0000000..29a21d2 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.069", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":90, + "max":[ + 0.9000001549720764, + 0.8184158205986023, + 1.00067138671875 + ], + "min":[ + -0.9000000357627869, + -0.20368799567222595, + -1.0772459506988525 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":90, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":90, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":28, + "max":[ + 1.000000238418579, + 0.9999998807907104, + 1 + ], + "min":[ + -1.000000238418579, + -5.094234021706286e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":28, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":28, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1080, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":1080, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2880, + "target":34963 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":3180, + "target":34962 + }, + { + "buffer":0, + "byteLength":336, + "byteOffset":3516, + "target":34962 + }, + { + "buffer":0, + "byteLength":224, + "byteOffset":3852, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":4076, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4148, + "uri":"Stairs_Exterior_Straight.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Straight.gltf.import b/meshes/village/Stairs_Exterior_Straight.gltf.import new file mode 100644 index 0000000..3744046 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cylmfio4yq58r" +path="res://.godot/imported/Stairs_Exterior_Straight.gltf-b16278af4d4d03911bc7d81b24732c9d.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Straight.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Straight.gltf-b16278af4d4d03911bc7d81b24732c9d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Straight_Center.bin b/meshes/village/Stairs_Exterior_Straight_Center.bin new file mode 100644 index 0000000..75e4f95 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Straight_Center.bin differ diff --git a/meshes/village/Stairs_Exterior_Straight_Center.gltf b/meshes/village/Stairs_Exterior_Straight_Center.gltf new file mode 100644 index 0000000..8d5a573 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_Center.gltf @@ -0,0 +1,159 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Straight_Center" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.056", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":90, + "max":[ + 1, + 0.8184158205986023, + 1.00067138671875 + ], + "min":[ + -1.000000238418579, + -0.20368799567222595, + -1.0772459506988525 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":90, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":90, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1080, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":1080, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2880, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3180, + "uri":"Stairs_Exterior_Straight_Center.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Straight_Center.gltf.import b/meshes/village/Stairs_Exterior_Straight_Center.gltf.import new file mode 100644 index 0000000..8214dc9 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_Center.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dhvqyxomdxyda" +path="res://.godot/imported/Stairs_Exterior_Straight_Center.gltf-1306f15ef9c367bd885e894a26ecd376.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Straight_Center.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Straight_Center.gltf-1306f15ef9c367bd885e894a26ecd376.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Straight_L.bin b/meshes/village/Stairs_Exterior_Straight_L.bin new file mode 100644 index 0000000..9a67df9 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Straight_L.bin differ diff --git a/meshes/village/Stairs_Exterior_Straight_L.gltf b/meshes/village/Stairs_Exterior_Straight_L.gltf new file mode 100644 index 0000000..3509412 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_L.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Straight_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.046", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":90, + "max":[ + 1.000000238418579, + 0.8184158205986023, + 1.00067138671875 + ], + "min":[ + -0.9000001549720764, + -0.20368799567222595, + -1.0772459506988525 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":90, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":90, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":14, + "max":[ + -0.7999997735023499, + 0.9999998807907104, + 1 + ], + "min":[ + -1.000000238418579, + -5.094234021706286e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":14, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":14, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1080, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":1080, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2880, + "target":34963 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":3180, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":3348, + "target":34962 + }, + { + "buffer":0, + "byteLength":112, + "byteOffset":3516, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":3628, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3664, + "uri":"Stairs_Exterior_Straight_L.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Straight_L.gltf.import b/meshes/village/Stairs_Exterior_Straight_L.gltf.import new file mode 100644 index 0000000..11cf330 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://381q0mye5b0b" +path="res://.godot/imported/Stairs_Exterior_Straight_L.gltf-e8653228cbbf4a140d7b6e4373fce7de.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Straight_L.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Straight_L.gltf-e8653228cbbf4a140d7b6e4373fce7de.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Stairs_Exterior_Straight_R.bin b/meshes/village/Stairs_Exterior_Straight_R.bin new file mode 100644 index 0000000..ab11a21 Binary files /dev/null and b/meshes/village/Stairs_Exterior_Straight_R.bin differ diff --git a/meshes/village/Stairs_Exterior_Straight_R.gltf b/meshes/village/Stairs_Exterior_Straight_R.gltf new file mode 100644 index 0000000..3215910 --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_R.gltf @@ -0,0 +1,269 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Stairs_Exterior_Straight_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.036", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":90, + "max":[ + 0.9000001549720764, + 0.8184158205986023, + 1.00067138671875 + ], + "min":[ + -1.000000238418579, + -0.20368799567222595, + -1.0772459506988525 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":90, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":90, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":14, + "max":[ + 1.000000238418579, + 0.9999998807907104, + 1 + ], + "min":[ + 0.7999997735023499, + -5.094234021706286e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":14, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":14, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1080, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1080, + "byteOffset":1080, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":2160, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2880, + "target":34963 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":3180, + "target":34962 + }, + { + "buffer":0, + "byteLength":168, + "byteOffset":3348, + "target":34962 + }, + { + "buffer":0, + "byteLength":112, + "byteOffset":3516, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":3628, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3664, + "uri":"Stairs_Exterior_Straight_R.bin" + } + ] +} diff --git a/meshes/village/Stairs_Exterior_Straight_R.gltf.import b/meshes/village/Stairs_Exterior_Straight_R.gltf.import new file mode 100644 index 0000000..b5fe97f --- /dev/null +++ b/meshes/village/Stairs_Exterior_Straight_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bpfe6f30ql6hm" +path="res://.godot/imported/Stairs_Exterior_Straight_R.gltf-158dff391ffd65c2ac2c15db7baec1f4.scn" + +[deps] + +source_file="res://meshes/village/Stairs_Exterior_Straight_R.gltf" +dest_files=["res://.godot/imported/Stairs_Exterior_Straight_R.gltf-158dff391ffd65c2ac2c15db7baec1f4.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/T_Brick_BaseColor.png b/meshes/village/T_Brick_BaseColor.png new file mode 100644 index 0000000..fdef46f Binary files /dev/null and b/meshes/village/T_Brick_BaseColor.png differ diff --git a/meshes/village/T_Brick_BaseColor.png.import b/meshes/village/T_Brick_BaseColor.png.import new file mode 100644 index 0000000..a7ab824 --- /dev/null +++ b/meshes/village/T_Brick_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2w17im62wa2u" +path.s3tc="res://.godot/imported/T_Brick_BaseColor.png-86f4490ea07f0cbec6feba2070830538.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Brick_BaseColor.png" +dest_files=["res://.godot/imported/T_Brick_BaseColor.png-86f4490ea07f0cbec6feba2070830538.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_Brick_Normal.png b/meshes/village/T_Brick_Normal.png new file mode 100644 index 0000000..d0fcc06 Binary files /dev/null and b/meshes/village/T_Brick_Normal.png differ diff --git a/meshes/village/T_Brick_Normal.png.import b/meshes/village/T_Brick_Normal.png.import new file mode 100644 index 0000000..3a89dbb --- /dev/null +++ b/meshes/village/T_Brick_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br3a12lopad2b" +path.s3tc="res://.godot/imported/T_Brick_Normal.png-b21364f0a763b837c65fc0c6921b2649.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Brick_Normal.png" +dest_files=["res://.godot/imported/T_Brick_Normal.png-b21364f0a763b837c65fc0c6921b2649.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_Brick_Normal.png" +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/meshes/village/T_Brick_Roughness.png b/meshes/village/T_Brick_Roughness.png new file mode 100644 index 0000000..61b328e Binary files /dev/null and b/meshes/village/T_Brick_Roughness.png differ diff --git a/meshes/village/T_Brick_Roughness.png.import b/meshes/village/T_Brick_Roughness.png.import new file mode 100644 index 0000000..30cdc6f --- /dev/null +++ b/meshes/village/T_Brick_Roughness.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ekmk6dtc8o0l" +path.s3tc="res://.godot/imported/T_Brick_Roughness.png-d209bb5c2af6330603b41d69b7fb4641.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Brick_Roughness.png" +dest_files=["res://.godot/imported/T_Brick_Roughness.png-d209bb5c2af6330603b41d69b7fb4641.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_MetalOrnaments_BaseColor.png b/meshes/village/T_MetalOrnaments_BaseColor.png new file mode 100644 index 0000000..29ce82d Binary files /dev/null and b/meshes/village/T_MetalOrnaments_BaseColor.png differ diff --git a/meshes/village/T_MetalOrnaments_BaseColor.png.import b/meshes/village/T_MetalOrnaments_BaseColor.png.import new file mode 100644 index 0000000..2447e9d --- /dev/null +++ b/meshes/village/T_MetalOrnaments_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://udhu7feayran" +path.s3tc="res://.godot/imported/T_MetalOrnaments_BaseColor.png-cb04106513fd097f7c6d240471287b7a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_MetalOrnaments_BaseColor.png" +dest_files=["res://.godot/imported/T_MetalOrnaments_BaseColor.png-cb04106513fd097f7c6d240471287b7a.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_MetalOrnaments_Roughness.png b/meshes/village/T_MetalOrnaments_Roughness.png new file mode 100644 index 0000000..4a52983 Binary files /dev/null and b/meshes/village/T_MetalOrnaments_Roughness.png differ diff --git a/meshes/village/T_MetalOrnaments_Roughness.png.import b/meshes/village/T_MetalOrnaments_Roughness.png.import new file mode 100644 index 0000000..6f91720 --- /dev/null +++ b/meshes/village/T_MetalOrnaments_Roughness.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co72x3pqtfpj0" +path.s3tc="res://.godot/imported/T_MetalOrnaments_Roughness.png-9c258d10772d9c98acdaf17b4919e4ae.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_MetalOrnaments_Roughness.png" +dest_files=["res://.godot/imported/T_MetalOrnaments_Roughness.png-9c258d10772d9c98acdaf17b4919e4ae.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_Plaster_BaseColor.png b/meshes/village/T_Plaster_BaseColor.png new file mode 100644 index 0000000..14ff755 Binary files /dev/null and b/meshes/village/T_Plaster_BaseColor.png differ diff --git a/meshes/village/T_Plaster_BaseColor.png.import b/meshes/village/T_Plaster_BaseColor.png.import new file mode 100644 index 0000000..a386d54 --- /dev/null +++ b/meshes/village/T_Plaster_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3l76oxg6rifh" +path.s3tc="res://.godot/imported/T_Plaster_BaseColor.png-be3036e3b6be12fdb922aec1ce4f9b7f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Plaster_BaseColor.png" +dest_files=["res://.godot/imported/T_Plaster_BaseColor.png-be3036e3b6be12fdb922aec1ce4f9b7f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_Plaster_Normal.png b/meshes/village/T_Plaster_Normal.png new file mode 100644 index 0000000..2acb6dc Binary files /dev/null and b/meshes/village/T_Plaster_Normal.png differ diff --git a/meshes/village/T_Plaster_Normal.png.import b/meshes/village/T_Plaster_Normal.png.import new file mode 100644 index 0000000..e7663f6 --- /dev/null +++ b/meshes/village/T_Plaster_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctuybxdi5skbg" +path.s3tc="res://.godot/imported/T_Plaster_Normal.png-b26fbc238afda1d34a1493418443f2e0.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Plaster_Normal.png" +dest_files=["res://.godot/imported/T_Plaster_Normal.png-b26fbc238afda1d34a1493418443f2e0.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_Plaster_Normal.png" +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/meshes/village/T_Plaster_ORM.png b/meshes/village/T_Plaster_ORM.png new file mode 100644 index 0000000..460dbd5 Binary files /dev/null and b/meshes/village/T_Plaster_ORM.png differ diff --git a/meshes/village/T_Plaster_ORM.png.import b/meshes/village/T_Plaster_ORM.png.import new file mode 100644 index 0000000..a23a0cd --- /dev/null +++ b/meshes/village/T_Plaster_ORM.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bobtg8xxbs3nb" +path.s3tc="res://.godot/imported/T_Plaster_ORM.png-943ce277ee21aaad267371f73886ad91.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_Plaster_ORM.png" +dest_files=["res://.godot/imported/T_Plaster_ORM.png-943ce277ee21aaad267371f73886ad91.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_RedBrick_BaseColor.png b/meshes/village/T_RedBrick_BaseColor.png new file mode 100644 index 0000000..0ffb65c Binary files /dev/null and b/meshes/village/T_RedBrick_BaseColor.png differ diff --git a/meshes/village/T_RedBrick_BaseColor.png.import b/meshes/village/T_RedBrick_BaseColor.png.import new file mode 100644 index 0000000..9d10106 --- /dev/null +++ b/meshes/village/T_RedBrick_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1grr4vwcokob" +path.s3tc="res://.godot/imported/T_RedBrick_BaseColor.png-e3daed050721f5eb09b928fa1b72bf29.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RedBrick_BaseColor.png" +dest_files=["res://.godot/imported/T_RedBrick_BaseColor.png-e3daed050721f5eb09b928fa1b72bf29.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_RockTrim_BaseColor.png b/meshes/village/T_RockTrim_BaseColor.png new file mode 100644 index 0000000..66d38c3 Binary files /dev/null and b/meshes/village/T_RockTrim_BaseColor.png differ diff --git a/meshes/village/T_RockTrim_BaseColor.png.import b/meshes/village/T_RockTrim_BaseColor.png.import new file mode 100644 index 0000000..b072d20 --- /dev/null +++ b/meshes/village/T_RockTrim_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnko7rrsmyfs8" +path.s3tc="res://.godot/imported/T_RockTrim_BaseColor.png-7e34e7c4b549a58290988948f93dbfe4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RockTrim_BaseColor.png" +dest_files=["res://.godot/imported/T_RockTrim_BaseColor.png-7e34e7c4b549a58290988948f93dbfe4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_RockTrim_Normal.png b/meshes/village/T_RockTrim_Normal.png new file mode 100644 index 0000000..83d9f1a Binary files /dev/null and b/meshes/village/T_RockTrim_Normal.png differ diff --git a/meshes/village/T_RockTrim_Normal.png.import b/meshes/village/T_RockTrim_Normal.png.import new file mode 100644 index 0000000..2721e9d --- /dev/null +++ b/meshes/village/T_RockTrim_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfh4f15v2rtmr" +path.s3tc="res://.godot/imported/T_RockTrim_Normal.png-145fa46d11f66376b1519a69501df6ee.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RockTrim_Normal.png" +dest_files=["res://.godot/imported/T_RockTrim_Normal.png-145fa46d11f66376b1519a69501df6ee.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_RockTrim_Normal.png" +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/meshes/village/T_RockTrim_ORM.png b/meshes/village/T_RockTrim_ORM.png new file mode 100644 index 0000000..b50e49d Binary files /dev/null and b/meshes/village/T_RockTrim_ORM.png differ diff --git a/meshes/village/T_RockTrim_ORM.png.import b/meshes/village/T_RockTrim_ORM.png.import new file mode 100644 index 0000000..3d00bee --- /dev/null +++ b/meshes/village/T_RockTrim_ORM.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbrb8qhdfs1g5" +path.s3tc="res://.godot/imported/T_RockTrim_ORM.png-bc981f8c6a3f0108bdea3ffc1d43610c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RockTrim_ORM.png" +dest_files=["res://.godot/imported/T_RockTrim_ORM.png-bc981f8c6a3f0108bdea3ffc1d43610c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_RoundTiles_BaseColor.png b/meshes/village/T_RoundTiles_BaseColor.png new file mode 100644 index 0000000..1499f2b Binary files /dev/null and b/meshes/village/T_RoundTiles_BaseColor.png differ diff --git a/meshes/village/T_RoundTiles_BaseColor.png.import b/meshes/village/T_RoundTiles_BaseColor.png.import new file mode 100644 index 0000000..179adff --- /dev/null +++ b/meshes/village/T_RoundTiles_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://p3t83payyrpu" +path.s3tc="res://.godot/imported/T_RoundTiles_BaseColor.png-1460a5f6114c931252518a219415d66b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RoundTiles_BaseColor.png" +dest_files=["res://.godot/imported/T_RoundTiles_BaseColor.png-1460a5f6114c931252518a219415d66b.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_RoundTiles_Normal.png b/meshes/village/T_RoundTiles_Normal.png new file mode 100644 index 0000000..abf6b84 Binary files /dev/null and b/meshes/village/T_RoundTiles_Normal.png differ diff --git a/meshes/village/T_RoundTiles_Normal.png.import b/meshes/village/T_RoundTiles_Normal.png.import new file mode 100644 index 0000000..8aefb6a --- /dev/null +++ b/meshes/village/T_RoundTiles_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbbs8e87opfnu" +path.s3tc="res://.godot/imported/T_RoundTiles_Normal.png-445b737f247fa6ee09e05cb91faa5acd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RoundTiles_Normal.png" +dest_files=["res://.godot/imported/T_RoundTiles_Normal.png-445b737f247fa6ee09e05cb91faa5acd.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_RoundTiles_Normal.png" +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/meshes/village/T_RoundTiles_Roughness.png b/meshes/village/T_RoundTiles_Roughness.png new file mode 100644 index 0000000..625b67a Binary files /dev/null and b/meshes/village/T_RoundTiles_Roughness.png differ diff --git a/meshes/village/T_RoundTiles_Roughness.png.import b/meshes/village/T_RoundTiles_Roughness.png.import new file mode 100644 index 0000000..264c3d2 --- /dev/null +++ b/meshes/village/T_RoundTiles_Roughness.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0e5tdd85g1o0" +path.s3tc="res://.godot/imported/T_RoundTiles_Roughness.png-2bb21c6b90d93f22d2f1c3be367c2d3d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_RoundTiles_Roughness.png" +dest_files=["res://.godot/imported/T_RoundTiles_Roughness.png-2bb21c6b90d93f22d2f1c3be367c2d3d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_UnevenBrick_BaseColor.png b/meshes/village/T_UnevenBrick_BaseColor.png new file mode 100644 index 0000000..fd30c54 Binary files /dev/null and b/meshes/village/T_UnevenBrick_BaseColor.png differ diff --git a/meshes/village/T_UnevenBrick_BaseColor.png.import b/meshes/village/T_UnevenBrick_BaseColor.png.import new file mode 100644 index 0000000..165b2ca --- /dev/null +++ b/meshes/village/T_UnevenBrick_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgnicaggbhopg" +path.s3tc="res://.godot/imported/T_UnevenBrick_BaseColor.png-278ea2b33c14afe41978d2c0d6afe810.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_UnevenBrick_BaseColor.png" +dest_files=["res://.godot/imported/T_UnevenBrick_BaseColor.png-278ea2b33c14afe41978d2c0d6afe810.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_UnevenBrick_Normal.png b/meshes/village/T_UnevenBrick_Normal.png new file mode 100644 index 0000000..ad41fd2 Binary files /dev/null and b/meshes/village/T_UnevenBrick_Normal.png differ diff --git a/meshes/village/T_UnevenBrick_Normal.png.import b/meshes/village/T_UnevenBrick_Normal.png.import new file mode 100644 index 0000000..16be45f --- /dev/null +++ b/meshes/village/T_UnevenBrick_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyqtk1upws86r" +path.s3tc="res://.godot/imported/T_UnevenBrick_Normal.png-6430cd5e3f9aaef8f675425efcd13ad4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_UnevenBrick_Normal.png" +dest_files=["res://.godot/imported/T_UnevenBrick_Normal.png-6430cd5e3f9aaef8f675425efcd13ad4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_UnevenBrick_Normal.png" +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/meshes/village/T_UnevenBrick_Roughness.png b/meshes/village/T_UnevenBrick_Roughness.png new file mode 100644 index 0000000..150eaa0 Binary files /dev/null and b/meshes/village/T_UnevenBrick_Roughness.png differ diff --git a/meshes/village/T_UnevenBrick_Roughness.png.import b/meshes/village/T_UnevenBrick_Roughness.png.import new file mode 100644 index 0000000..cc96a03 --- /dev/null +++ b/meshes/village/T_UnevenBrick_Roughness.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d16cfmoq13jq2" +path.s3tc="res://.godot/imported/T_UnevenBrick_Roughness.png-c4d280c5c21c4f608395724ecdae3e16.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_UnevenBrick_Roughness.png" +dest_files=["res://.godot/imported/T_UnevenBrick_Roughness.png-c4d280c5c21c4f608395724ecdae3e16.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_VineLeaf_png.png b/meshes/village/T_VineLeaf_png.png new file mode 100644 index 0000000..64d615c Binary files /dev/null and b/meshes/village/T_VineLeaf_png.png differ diff --git a/meshes/village/T_VineLeaf_png.png.import b/meshes/village/T_VineLeaf_png.png.import new file mode 100644 index 0000000..7ec05f3 --- /dev/null +++ b/meshes/village/T_VineLeaf_png.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv83u1crt11xp" +path.s3tc="res://.godot/imported/T_VineLeaf_png.png-56c10823ae5559743050d6726eb1546c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_VineLeaf_png.png" +dest_files=["res://.godot/imported/T_VineLeaf_png.png-56c10823ae5559743050d6726eb1546c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_WoodTrim_BaseColor.png b/meshes/village/T_WoodTrim_BaseColor.png new file mode 100644 index 0000000..3547da8 Binary files /dev/null and b/meshes/village/T_WoodTrim_BaseColor.png differ diff --git a/meshes/village/T_WoodTrim_BaseColor.png.import b/meshes/village/T_WoodTrim_BaseColor.png.import new file mode 100644 index 0000000..da3d166 --- /dev/null +++ b/meshes/village/T_WoodTrim_BaseColor.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fgdq5qq8ger0" +path.s3tc="res://.godot/imported/T_WoodTrim_BaseColor.png-f6d621e8ce67bb02edfcf82df920c126.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_WoodTrim_BaseColor.png" +dest_files=["res://.godot/imported/T_WoodTrim_BaseColor.png-f6d621e8ce67bb02edfcf82df920c126.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/T_WoodTrim_Normal.png b/meshes/village/T_WoodTrim_Normal.png new file mode 100644 index 0000000..f959c63 Binary files /dev/null and b/meshes/village/T_WoodTrim_Normal.png differ diff --git a/meshes/village/T_WoodTrim_Normal.png.import b/meshes/village/T_WoodTrim_Normal.png.import new file mode 100644 index 0000000..e3eabf9 --- /dev/null +++ b/meshes/village/T_WoodTrim_Normal.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qpqnvpauhgky" +path.s3tc="res://.godot/imported/T_WoodTrim_Normal.png-dee483271e174fe829cd39c4f185425c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_WoodTrim_Normal.png" +dest_files=["res://.godot/imported/T_WoodTrim_Normal.png-dee483271e174fe829cd39c4f185425c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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://meshes/village/T_WoodTrim_Normal.png" +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/meshes/village/T_WoodTrim_Roughness.png b/meshes/village/T_WoodTrim_Roughness.png new file mode 100644 index 0000000..ce396e8 Binary files /dev/null and b/meshes/village/T_WoodTrim_Roughness.png differ diff --git a/meshes/village/T_WoodTrim_Roughness.png.import b/meshes/village/T_WoodTrim_Roughness.png.import new file mode 100644 index 0000000..498d394 --- /dev/null +++ b/meshes/village/T_WoodTrim_Roughness.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjmeqbs2q6clc" +path.s3tc="res://.godot/imported/T_WoodTrim_Roughness.png-7c3f67b4b30489952abd96c98dc2c0fd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://meshes/village/T_WoodTrim_Roughness.png" +dest_files=["res://.godot/imported/T_WoodTrim_Roughness.png-7c3f67b4b30489952abd96c98dc2c0fd.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/meshes/village/Wall_Arch.bin b/meshes/village/Wall_Arch.bin new file mode 100644 index 0000000..680d970 Binary files /dev/null and b/meshes/village/Wall_Arch.bin differ diff --git a/meshes/village/Wall_Arch.gltf b/meshes/village/Wall_Arch.gltf new file mode 100644 index 0000000..eeb8745 --- /dev/null +++ b/meshes/village/Wall_Arch.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Arch" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Plane.007", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":260, + "max":[ + 1, + 3, + 0.06404569000005722 + ], + "min":[ + -1, + -1.1920928955078125e-07, + -3.725290298461914e-08 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":260, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":260, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":588, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3120, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3120, + "byteOffset":3120, + "target":34962 + }, + { + "buffer":0, + "byteLength":2080, + "byteOffset":6240, + "target":34962 + }, + { + "buffer":0, + "byteLength":1176, + "byteOffset":8320, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":9496, + "uri":"Wall_Arch.bin" + } + ] +} diff --git a/meshes/village/Wall_Arch.gltf.import b/meshes/village/Wall_Arch.gltf.import new file mode 100644 index 0000000..a98b418 --- /dev/null +++ b/meshes/village/Wall_Arch.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cafvsobiypbxy" +path="res://.godot/imported/Wall_Arch.gltf-f58e52d7a372aa263570c6e0795be25a.scn" + +[deps] + +source_file="res://meshes/village/Wall_Arch.gltf" +dest_files=["res://.godot/imported/Wall_Arch.gltf-f58e52d7a372aa263570c6e0795be25a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_BottomCover.bin b/meshes/village/Wall_BottomCover.bin new file mode 100644 index 0000000..834f0a8 Binary files /dev/null and b/meshes/village/Wall_BottomCover.bin differ diff --git a/meshes/village/Wall_BottomCover.gltf b/meshes/village/Wall_BottomCover.gltf new file mode 100644 index 0000000..be6d2f4 --- /dev/null +++ b/meshes/village/Wall_BottomCover.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_BottomCover" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.192", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":48, + "max":[ + 1, + 0.12076050788164139, + 0.11757006496191025 + ], + "min":[ + -1.0000001192092896, + -0.11676454544067383, + -0.3140353560447693 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":48, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":48, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":108, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":576, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":1536, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":1752, + "uri":"Wall_BottomCover.bin" + } + ] +} diff --git a/meshes/village/Wall_BottomCover.gltf.import b/meshes/village/Wall_BottomCover.gltf.import new file mode 100644 index 0000000..810492d --- /dev/null +++ b/meshes/village/Wall_BottomCover.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cs60deiwlegku" +path="res://.godot/imported/Wall_BottomCover.gltf-050574e03020642bfd0d7389ded1a95c.scn" + +[deps] + +source_file="res://meshes/village/Wall_BottomCover.gltf" +dest_files=["res://.godot/imported/Wall_BottomCover.gltf-050574e03020642bfd0d7389ded1a95c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Door_Flat.bin b/meshes/village/Wall_Plaster_Door_Flat.bin new file mode 100644 index 0000000..7124e32 Binary files /dev/null and b/meshes/village/Wall_Plaster_Door_Flat.bin differ diff --git a/meshes/village/Wall_Plaster_Door_Flat.gltf b/meshes/village/Wall_Plaster_Door_Flat.gltf new file mode 100644 index 0000000..4f95061 --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_Flat.gltf @@ -0,0 +1,417 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Door_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.221", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":124, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":124, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":124, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":124, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":204, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":60, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1488, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1488, + "byteOffset":1488, + "target":34962 + }, + { + "buffer":0, + "byteLength":992, + "byteOffset":2976, + "target":34962 + }, + { + "buffer":0, + "byteLength":992, + "byteOffset":3968, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":4960, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5368, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5656, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":5944, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":6136, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":6328, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":6448, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":6544, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":6640, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":6704, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":6768, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6792, + "uri":"Wall_Plaster_Door_Flat.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Door_Flat.gltf.import b/meshes/village/Wall_Plaster_Door_Flat.gltf.import new file mode 100644 index 0000000..fde094b --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bt587os8lkyq0" +path="res://.godot/imported/Wall_Plaster_Door_Flat.gltf-22c7740ea35c03d9d7966454ba9815e1.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Door_Flat.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Door_Flat.gltf-22c7740ea35c03d9d7966454ba9815e1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Door_Round.bin b/meshes/village/Wall_Plaster_Door_Round.bin new file mode 100644 index 0000000..d39127b Binary files /dev/null and b/meshes/village/Wall_Plaster_Door_Round.bin differ diff --git a/meshes/village/Wall_Plaster_Door_Round.gltf b/meshes/village/Wall_Plaster_Door_Round.gltf new file mode 100644 index 0000000..6ed409b --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_Round.gltf @@ -0,0 +1,417 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Door_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.227", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":124, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":124, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":124, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":124, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":204, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":69, + "max":[ + 1, + 3, + 1.3113417196564114e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":69, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":69, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":69, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":195, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.9100615382194519, + 4.3711395392165286e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1488, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1488, + "byteOffset":1488, + "target":34962 + }, + { + "buffer":0, + "byteLength":992, + "byteOffset":2976, + "target":34962 + }, + { + "buffer":0, + "byteLength":992, + "byteOffset":3968, + "target":34962 + }, + { + "buffer":0, + "byteLength":408, + "byteOffset":4960, + "target":34963 + }, + { + "buffer":0, + "byteLength":828, + "byteOffset":5368, + "target":34962 + }, + { + "buffer":0, + "byteLength":828, + "byteOffset":6196, + "target":34962 + }, + { + "buffer":0, + "byteLength":552, + "byteOffset":7024, + "target":34962 + }, + { + "buffer":0, + "byteLength":552, + "byteOffset":7576, + "target":34962 + }, + { + "buffer":0, + "byteLength":390, + "byteOffset":8128, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":8520, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":8616, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":8712, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":8776, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":8840, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8864, + "uri":"Wall_Plaster_Door_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Door_Round.gltf.import b/meshes/village/Wall_Plaster_Door_Round.gltf.import new file mode 100644 index 0000000..f9cb4c6 --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dvb72no2vl11g" +path="res://.godot/imported/Wall_Plaster_Door_Round.gltf-9d34d7f505c42c42ec4331297b71c6c6.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Door_Round.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Door_Round.gltf-9d34d7f505c42c42ec4331297b71c6c6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Door_RoundInset.bin b/meshes/village/Wall_Plaster_Door_RoundInset.bin new file mode 100644 index 0000000..a087421 Binary files /dev/null and b/meshes/village/Wall_Plaster_Door_RoundInset.bin differ diff --git a/meshes/village/Wall_Plaster_Door_RoundInset.gltf b/meshes/village/Wall_Plaster_Door_RoundInset.gltf new file mode 100644 index 0000000..f08956d --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_RoundInset.gltf @@ -0,0 +1,417 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Door_RoundInset" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_RockTrim", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.038", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_Normal", + "uri":"T_RockTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_BaseColor", + "uri":"T_RockTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_RockTrim_ORM", + "uri":"T_RockTrim_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":68, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":68, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":68, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":156, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":121, + "max":[ + 1, + 3, + 1.3113417196564114e-07 + ], + "min":[ + -1, + 0, + -0.9999999403953552 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":121, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":121, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":121, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":348, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":20, + "max":[ + 1, + 0.9100615382194519, + 4.3711395392165286e-08 + ], + "min":[ + -1, + -1.1278182812197925e-16, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":20, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":20, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":20, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":816, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":816, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":1632, + "target":34962 + }, + { + "buffer":0, + "byteLength":544, + "byteOffset":2176, + "target":34962 + }, + { + "buffer":0, + "byteLength":312, + "byteOffset":2720, + "target":34963 + }, + { + "buffer":0, + "byteLength":1452, + "byteOffset":3032, + "target":34962 + }, + { + "buffer":0, + "byteLength":1452, + "byteOffset":4484, + "target":34962 + }, + { + "buffer":0, + "byteLength":968, + "byteOffset":5936, + "target":34962 + }, + { + "buffer":0, + "byteLength":968, + "byteOffset":6904, + "target":34962 + }, + { + "buffer":0, + "byteLength":696, + "byteOffset":7872, + "target":34963 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":8568, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":8808, + "target":34962 + }, + { + "buffer":0, + "byteLength":160, + "byteOffset":9048, + "target":34962 + }, + { + "buffer":0, + "byteLength":160, + "byteOffset":9208, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":9368, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":9440, + "uri":"Wall_Plaster_Door_RoundInset.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Door_RoundInset.gltf.import b/meshes/village/Wall_Plaster_Door_RoundInset.gltf.import new file mode 100644 index 0000000..6165df0 --- /dev/null +++ b/meshes/village/Wall_Plaster_Door_RoundInset.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dmccaswrgw3ha" +path="res://.godot/imported/Wall_Plaster_Door_RoundInset.gltf-c4308267d23ebcd475ea2ff9a2f0e451.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Door_RoundInset.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Door_RoundInset.gltf-c4308267d23ebcd475ea2ff9a2f0e451.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Straight.bin b/meshes/village/Wall_Plaster_Straight.bin new file mode 100644 index 0000000..55b3919 Binary files /dev/null and b/meshes/village/Wall_Plaster_Straight.bin differ diff --git a/meshes/village/Wall_Plaster_Straight.gltf b/meshes/village/Wall_Plaster_Straight.gltf new file mode 100644 index 0000000..fb8b38f --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.027", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":122, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + -0.0020958781242370605, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":122, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":122, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":122, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":240, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1464, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1464, + "byteOffset":1464, + "target":34962 + }, + { + "buffer":0, + "byteLength":976, + "byteOffset":2928, + "target":34962 + }, + { + "buffer":0, + "byteLength":976, + "byteOffset":3904, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":4880, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":5360, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":5504, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":5648, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":5744, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":5840, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5876, + "uri":"Wall_Plaster_Straight.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Straight.gltf.import b/meshes/village/Wall_Plaster_Straight.gltf.import new file mode 100644 index 0000000..90b8cbd --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://wuyow1kncihq" +path="res://.godot/imported/Wall_Plaster_Straight.gltf-ef5443fe1a68fd3fcfd2928f20a896a9.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Straight.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Straight.gltf-ef5443fe1a68fd3fcfd2928f20a896a9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Straight_Base.bin b/meshes/village/Wall_Plaster_Straight_Base.bin new file mode 100644 index 0000000..a530e73 Binary files /dev/null and b/meshes/village/Wall_Plaster_Straight_Base.bin differ diff --git a/meshes/village/Wall_Plaster_Straight_Base.gltf b/meshes/village/Wall_Plaster_Straight_Base.gltf new file mode 100644 index 0000000..f30afc5 --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_Base.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Straight_Base" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.006", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":80, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":80, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":174, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":12, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":4, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":960, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":960, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":1920, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":2560, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":3200, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":3548, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":3644, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":3740, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":3804, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":3868, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":3892, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":3940, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":3988, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":4020, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":4052, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4064, + "uri":"Wall_Plaster_Straight_Base.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Straight_Base.gltf.import b/meshes/village/Wall_Plaster_Straight_Base.gltf.import new file mode 100644 index 0000000..4f6ab8a --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_Base.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://du203gdm047o4" +path="res://.godot/imported/Wall_Plaster_Straight_Base.gltf-e7a877049d28ac843e78048b34760756.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Straight_Base.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Straight_Base.gltf-e7a877049d28ac843e78048b34760756.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Straight_L.bin b/meshes/village/Wall_Plaster_Straight_L.bin new file mode 100644 index 0000000..0440f5b Binary files /dev/null and b/meshes/village/Wall_Plaster_Straight_L.bin differ diff --git a/meshes/village/Wall_Plaster_Straight_L.gltf b/meshes/village/Wall_Plaster_Straight_L.gltf new file mode 100644 index 0000000..e8b639b --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_L.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Straight_L" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.131", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":96, + "max":[ + 1.0017778873443604, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":96, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":96, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":96, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":198, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":12, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":4, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1152, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1152, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":2304, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":3072, + "target":34962 + }, + { + "buffer":0, + "byteLength":396, + "byteOffset":3840, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":4236, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":4332, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":4428, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":4492, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":4556, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":4580, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":4628, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":4676, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":4708, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":4740, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4752, + "uri":"Wall_Plaster_Straight_L.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Straight_L.gltf.import b/meshes/village/Wall_Plaster_Straight_L.gltf.import new file mode 100644 index 0000000..c5c9c67 --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_L.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dsgr64itfudyd" +path="res://.godot/imported/Wall_Plaster_Straight_L.gltf-7e818ae60a71a2a0409308fd9eaed400.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Straight_L.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Straight_L.gltf-7e818ae60a71a2a0409308fd9eaed400.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Straight_R.bin b/meshes/village/Wall_Plaster_Straight_R.bin new file mode 100644 index 0000000..c2c28a6 Binary files /dev/null and b/meshes/village/Wall_Plaster_Straight_R.bin differ diff --git a/meshes/village/Wall_Plaster_Straight_R.gltf b/meshes/village/Wall_Plaster_Straight_R.gltf new file mode 100644 index 0000000..23c8a4f --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_R.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Straight_R" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.010", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":96, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0017778873443604, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":96, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":96, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":96, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":198, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":12, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":4, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1152, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1152, + "byteOffset":1152, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":2304, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":3072, + "target":34962 + }, + { + "buffer":0, + "byteLength":396, + "byteOffset":3840, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":4236, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":4332, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":4428, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":4492, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":4556, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":4580, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":4628, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":4676, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":4708, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":4740, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4752, + "uri":"Wall_Plaster_Straight_R.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Straight_R.gltf.import b/meshes/village/Wall_Plaster_Straight_R.gltf.import new file mode 100644 index 0000000..c077236 --- /dev/null +++ b/meshes/village/Wall_Plaster_Straight_R.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bhtwl7xnh8uao" +path="res://.godot/imported/Wall_Plaster_Straight_R.gltf-2d863f1c2db9d87e472b18c71c98aa74.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Straight_R.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Straight_R.gltf-2d863f1c2db9d87e472b18c71c98aa74.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Window_Thin_Round.bin b/meshes/village/Wall_Plaster_Window_Thin_Round.bin new file mode 100644 index 0000000..c2a87e8 Binary files /dev/null and b/meshes/village/Wall_Plaster_Window_Thin_Round.bin differ diff --git a/meshes/village/Wall_Plaster_Window_Thin_Round.gltf b/meshes/village/Wall_Plaster_Window_Thin_Round.gltf new file mode 100644 index 0000000..9c03630 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Thin_Round.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Window_Thin_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Plane.022", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":88, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":88, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":88, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":88, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":264, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":22, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":22, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":22, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":22, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":60, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":104, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":104, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":104, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":104, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":174, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1056, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1056, + "byteOffset":1056, + "target":34962 + }, + { + "buffer":0, + "byteLength":704, + "byteOffset":2112, + "target":34962 + }, + { + "buffer":0, + "byteLength":704, + "byteOffset":2816, + "target":34962 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":3520, + "target":34963 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":4048, + "target":34962 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":4312, + "target":34962 + }, + { + "buffer":0, + "byteLength":176, + "byteOffset":4576, + "target":34962 + }, + { + "buffer":0, + "byteLength":176, + "byteOffset":4752, + "target":34962 + }, + { + "buffer":0, + "byteLength":120, + "byteOffset":4928, + "target":34963 + }, + { + "buffer":0, + "byteLength":1248, + "byteOffset":5048, + "target":34962 + }, + { + "buffer":0, + "byteLength":1248, + "byteOffset":6296, + "target":34962 + }, + { + "buffer":0, + "byteLength":832, + "byteOffset":7544, + "target":34962 + }, + { + "buffer":0, + "byteLength":832, + "byteOffset":8376, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":9208, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":9556, + "uri":"Wall_Plaster_Window_Thin_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Window_Thin_Round.gltf.import b/meshes/village/Wall_Plaster_Window_Thin_Round.gltf.import new file mode 100644 index 0000000..11ff210 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Thin_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bs3un44o6lfr1" +path="res://.godot/imported/Wall_Plaster_Window_Thin_Round.gltf-13cfc8865cd1dd18ea615917982b05ff.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Window_Thin_Round.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Window_Thin_Round.gltf-13cfc8865cd1dd18ea615917982b05ff.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat.bin b/meshes/village/Wall_Plaster_Window_Wide_Flat.bin new file mode 100644 index 0000000..f5aa010 Binary files /dev/null and b/meshes/village/Wall_Plaster_Window_Wide_Flat.bin differ diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf b/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf new file mode 100644 index 0000000..e71f5e5 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Window_Wide_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Plane.030", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 1, + 3, + 1.3113417196564114e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":96, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":18, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":80, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":80, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":174, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":1024, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1280, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1472, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1568, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":1664, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":1728, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":1792, + "target":34963 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":1828, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":2788, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":3748, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":4388, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":5028, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5376, + "uri":"Wall_Plaster_Window_Wide_Flat.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf.import b/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf.import new file mode 100644 index 0000000..19d2788 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bbs5ymhy0oddm" +path="res://.godot/imported/Wall_Plaster_Window_Wide_Flat.gltf-48c14f2b03cfe8b427ae5485c89f6fdb.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Window_Wide_Flat.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Window_Wide_Flat.gltf-48c14f2b03cfe8b427ae5485c89f6fdb.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat2.bin b/meshes/village/Wall_Plaster_Window_Wide_Flat2.bin new file mode 100644 index 0000000..11a3051 Binary files /dev/null and b/meshes/village/Wall_Plaster_Window_Wide_Flat2.bin differ diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf b/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf new file mode 100644 index 0000000..157e9c9 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Window_Wide_Flat2" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.064", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":130, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + -0.023045778274536133, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":130, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":130, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":130, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":252, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":40, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":40, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":40, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":40, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":114, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":1560, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":1560, + "byteOffset":1560, + "target":34962 + }, + { + "buffer":0, + "byteLength":1040, + "byteOffset":3120, + "target":34962 + }, + { + "buffer":0, + "byteLength":1040, + "byteOffset":4160, + "target":34962 + }, + { + "buffer":0, + "byteLength":504, + "byteOffset":5200, + "target":34963 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":5704, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":6184, + "target":34962 + }, + { + "buffer":0, + "byteLength":320, + "byteOffset":6664, + "target":34962 + }, + { + "buffer":0, + "byteLength":320, + "byteOffset":6984, + "target":34962 + }, + { + "buffer":0, + "byteLength":228, + "byteOffset":7304, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":7532, + "uri":"Wall_Plaster_Window_Wide_Flat2.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf.import b/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf.import new file mode 100644 index 0000000..a86b7dd --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dy8rqtmwls36g" +path="res://.godot/imported/Wall_Plaster_Window_Wide_Flat2.gltf-feb62436db3318fbf2fd8098b61008c0.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Window_Wide_Flat2.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Window_Wide_Flat2.gltf-feb62436db3318fbf2fd8098b61008c0.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_Window_Wide_Round.bin b/meshes/village/Wall_Plaster_Window_Wide_Round.bin new file mode 100644 index 0000000..1904c63 Binary files /dev/null and b/meshes/village/Wall_Plaster_Window_Wide_Round.bin differ diff --git a/meshes/village/Wall_Plaster_Window_Wide_Round.gltf b/meshes/village/Wall_Plaster_Window_Wide_Round.gltf new file mode 100644 index 0000000..343e874 --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Round.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_Window_Wide_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_Brick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.220", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Normal", + "uri":"T_Brick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_BaseColor", + "uri":"T_Brick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Brick_Roughness", + "uri":"T_Brick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":80, + "max":[ + 1, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.0000001192092896, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":80, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":80, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":174, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":60, + "max":[ + 1, + 3, + 1.3113417196564114e-07 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":60, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":180, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.8799999952316284, + 4.371138828673793e-08 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":18, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":960, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":960, + "byteOffset":960, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":1920, + "target":34962 + }, + { + "buffer":0, + "byteLength":640, + "byteOffset":2560, + "target":34962 + }, + { + "buffer":0, + "byteLength":348, + "byteOffset":3200, + "target":34963 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":3548, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":4268, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":4988, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":5468, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":5948, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":6308, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":6404, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":6500, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":6564, + "target":34962 + }, + { + "buffer":0, + "byteLength":36, + "byteOffset":6628, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":6664, + "uri":"Wall_Plaster_Window_Wide_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_Window_Wide_Round.gltf.import b/meshes/village/Wall_Plaster_Window_Wide_Round.gltf.import new file mode 100644 index 0000000..00ca92f --- /dev/null +++ b/meshes/village/Wall_Plaster_Window_Wide_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://vs4cvdh1whsy" +path="res://.godot/imported/Wall_Plaster_Window_Wide_Round.gltf-38f67780cd6b2d79556639785b974208.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_Window_Wide_Round.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_Window_Wide_Round.gltf-38f67780cd6b2d79556639785b974208.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_Plaster_WoodGrid.bin b/meshes/village/Wall_Plaster_WoodGrid.bin new file mode 100644 index 0000000..3d95506 Binary files /dev/null and b/meshes/village/Wall_Plaster_WoodGrid.bin differ diff --git a/meshes/village/Wall_Plaster_WoodGrid.gltf b/meshes/village/Wall_Plaster_WoodGrid.gltf new file mode 100644 index 0000000..f7b8c8a --- /dev/null +++ b/meshes/village/Wall_Plaster_WoodGrid.gltf @@ -0,0 +1,295 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_Plaster_WoodGrid" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.118", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":386, + "max":[ + 1.000000238418579, + 3.1226887702941895, + 0.0924467146396637 + ], + "min":[ + -1.000000238418579, + 0.6495776176452637, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":386, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":386, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":386, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":732, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":8, + "max":[ + 1, + 0.8360880613327026, + 5.960464477539063e-08 + ], + "min":[ + -1, + 0, + -0.2000001072883606 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4632, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4632, + "byteOffset":4632, + "target":34962 + }, + { + "buffer":0, + "byteLength":3088, + "byteOffset":9264, + "target":34962 + }, + { + "buffer":0, + "byteLength":3088, + "byteOffset":12352, + "target":34962 + }, + { + "buffer":0, + "byteLength":1464, + "byteOffset":15440, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":16904, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":17000, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":17096, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":17160, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":17224, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":17248, + "uri":"Wall_Plaster_WoodGrid.bin" + } + ] +} diff --git a/meshes/village/Wall_Plaster_WoodGrid.gltf.import b/meshes/village/Wall_Plaster_WoodGrid.gltf.import new file mode 100644 index 0000000..504a1e0 --- /dev/null +++ b/meshes/village/Wall_Plaster_WoodGrid.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bhbl8c6cntkwg" +path="res://.godot/imported/Wall_Plaster_WoodGrid.gltf-06ba3ff0366ff8d0a6be53085486ed7b.scn" + +[deps] + +source_file="res://meshes/village/Wall_Plaster_WoodGrid.gltf" +dest_files=["res://.godot/imported/Wall_Plaster_WoodGrid.gltf-06ba3ff0366ff8d0a6be53085486ed7b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Door_Flat.bin b/meshes/village/Wall_UnevenBrick_Door_Flat.bin new file mode 100644 index 0000000..31d9845 Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Door_Flat.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Door_Flat.gltf b/meshes/village/Wall_UnevenBrick_Door_Flat.gltf new file mode 100644 index 0000000..371d4fb --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Door_Flat.gltf @@ -0,0 +1,379 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Door_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.070", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":12, + "max":[ + 1, + 3, + -0.19999991357326508 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":12, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":12, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":30, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":20, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":20, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":20, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":42, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2048, + "target":34963 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":2348, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":2492, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2636, + "target":34962 + }, + { + "buffer":0, + "byteLength":60, + "byteOffset":2732, + "target":34963 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":2792, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":3032, + "target":34962 + }, + { + "buffer":0, + "byteLength":160, + "byteOffset":3272, + "target":34962 + }, + { + "buffer":0, + "byteLength":84, + "byteOffset":3432, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3516, + "uri":"Wall_UnevenBrick_Door_Flat.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Door_Flat.gltf.import b/meshes/village/Wall_UnevenBrick_Door_Flat.gltf.import new file mode 100644 index 0000000..0bfa4e5 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Door_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dmuauiryytxq7" +path="res://.godot/imported/Wall_UnevenBrick_Door_Flat.gltf-97caeb75c3cca34f0861942292646663.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Door_Flat.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Door_Flat.gltf-97caeb75c3cca34f0861942292646663.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Door_Round.bin b/meshes/village/Wall_UnevenBrick_Door_Round.bin new file mode 100644 index 0000000..49ad92c Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Door_Round.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Door_Round.gltf b/meshes/village/Wall_UnevenBrick_Door_Round.gltf new file mode 100644 index 0000000..58d9e25 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Door_Round.gltf @@ -0,0 +1,379 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Door_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.009", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":35, + "max":[ + 1, + 3, + -0.19999991357326508 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":35, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":35, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":123, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":43, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":43, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":43, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":135, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2048, + "target":34963 + }, + { + "buffer":0, + "byteLength":420, + "byteOffset":2348, + "target":34962 + }, + { + "buffer":0, + "byteLength":420, + "byteOffset":2768, + "target":34962 + }, + { + "buffer":0, + "byteLength":280, + "byteOffset":3188, + "target":34962 + }, + { + "buffer":0, + "byteLength":246, + "byteOffset":3468, + "target":34963 + }, + { + "buffer":0, + "byteLength":516, + "byteOffset":3716, + "target":34962 + }, + { + "buffer":0, + "byteLength":516, + "byteOffset":4232, + "target":34962 + }, + { + "buffer":0, + "byteLength":344, + "byteOffset":4748, + "target":34962 + }, + { + "buffer":0, + "byteLength":270, + "byteOffset":5092, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5364, + "uri":"Wall_UnevenBrick_Door_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Door_Round.gltf.import b/meshes/village/Wall_UnevenBrick_Door_Round.gltf.import new file mode 100644 index 0000000..f3f421b --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Door_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://clysjxno24doq" +path="res://.godot/imported/Wall_UnevenBrick_Door_Round.gltf-51c4c7c7f377f685d5e31eeaab41de5e.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Door_Round.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Door_Round.gltf-51c4c7c7f377f685d5e31eeaab41de5e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Straight.bin b/meshes/village/Wall_UnevenBrick_Straight.bin new file mode 100644 index 0000000..e81f178 Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Straight.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Straight.gltf b/meshes/village/Wall_UnevenBrick_Straight.gltf new file mode 100644 index 0000000..5b88693 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Straight.gltf @@ -0,0 +1,379 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Straight" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.059", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + }, + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 1, + 3, + -0.19999991357326508 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":8, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":8, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":8, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":12, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2048, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2348, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":2396, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":2444, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":2476, + "target":34963 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2488, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":2584, + "target":34962 + }, + { + "buffer":0, + "byteLength":64, + "byteOffset":2680, + "target":34962 + }, + { + "buffer":0, + "byteLength":24, + "byteOffset":2744, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":2768, + "uri":"Wall_UnevenBrick_Straight.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Straight.gltf.import b/meshes/village/Wall_UnevenBrick_Straight.gltf.import new file mode 100644 index 0000000..063099e --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Straight.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://wsu3b5udqtdu" +path="res://.godot/imported/Wall_UnevenBrick_Straight.gltf-84f3bf503355ddd5fe6d513ff3974515.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Straight.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Straight.gltf-84f3bf503355ddd5fe6d513ff3974515.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Window_Thin_Round.bin b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.bin new file mode 100644 index 0000000..7f75e46 Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf new file mode 100644 index 0000000..403926b --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Window_Thin_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.123", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":44, + "max":[ + 1, + 3, + -0.19999991357326508 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":44, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":44, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":44, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":132, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":57, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":57, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":57, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":57, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":192, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":2048, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2560, + "target":34963 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":2860, + "target":34962 + }, + { + "buffer":0, + "byteLength":528, + "byteOffset":3388, + "target":34962 + }, + { + "buffer":0, + "byteLength":352, + "byteOffset":3916, + "target":34962 + }, + { + "buffer":0, + "byteLength":352, + "byteOffset":4268, + "target":34962 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":4620, + "target":34963 + }, + { + "buffer":0, + "byteLength":684, + "byteOffset":4884, + "target":34962 + }, + { + "buffer":0, + "byteLength":684, + "byteOffset":5568, + "target":34962 + }, + { + "buffer":0, + "byteLength":456, + "byteOffset":6252, + "target":34962 + }, + { + "buffer":0, + "byteLength":456, + "byteOffset":6708, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":7164, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":7548, + "uri":"Wall_UnevenBrick_Window_Thin_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf.import b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf.import new file mode 100644 index 0000000..19f7d0e --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dy06hxoxpnnu8" +path="res://.godot/imported/Wall_UnevenBrick_Window_Thin_Round.gltf-fa0b9cde385256e12bc3ddd5f0d8a2cf.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Window_Thin_Round.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Window_Thin_Round.gltf-fa0b9cde385256e12bc3ddd5f0d8a2cf.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.bin b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.bin new file mode 100644 index 0000000..a570cfc Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf new file mode 100644 index 0000000..fba99b8 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Window_Wide_Flat" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.202", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":16, + "max":[ + 1, + 3, + -0.19999989867210388 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":16, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":16, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":48, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":22, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":22, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":22, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":22, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":66, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":2048, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2560, + "target":34963 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":2860, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":3052, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":3244, + "target":34962 + }, + { + "buffer":0, + "byteLength":128, + "byteOffset":3372, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":3500, + "target":34963 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":3596, + "target":34962 + }, + { + "buffer":0, + "byteLength":264, + "byteOffset":3860, + "target":34962 + }, + { + "buffer":0, + "byteLength":176, + "byteOffset":4124, + "target":34962 + }, + { + "buffer":0, + "byteLength":176, + "byteOffset":4300, + "target":34962 + }, + { + "buffer":0, + "byteLength":132, + "byteOffset":4476, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":4608, + "uri":"Wall_UnevenBrick_Window_Wide_Flat.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf.import b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf.import new file mode 100644 index 0000000..4cdc076 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dro3tm6ijcflv" +path="res://.godot/imported/Wall_UnevenBrick_Window_Wide_Flat.gltf-2ff784c96d9b02ad807e7db938cdfa63.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Window_Wide_Flat.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Window_Wide_Flat.gltf-2ff784c96d9b02ad807e7db938cdfa63.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Round.bin b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.bin new file mode 100644 index 0000000..63c9801 Binary files /dev/null and b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.bin differ diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf new file mode 100644 index 0000000..791a14a --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf @@ -0,0 +1,418 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Wall_UnevenBrick_Window_Wide_Round" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_Plaster", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicRoughnessTexture":{ + "index":5 + } + } + }, + { + "doubleSided":true, + "name":"MI_UnevenBrick", + "normalTexture":{ + "index":6 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":7 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":8 + } + } + } + ], + "meshes":[ + { + "name":"Cube.200", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + }, + { + "attributes":{ + "POSITION":10, + "NORMAL":11, + "TEXCOORD_0":12, + "TEXCOORD_1":13 + }, + "indices":14, + "material":2 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":3 + }, + { + "sampler":0, + "source":4 + }, + { + "sampler":0, + "source":5 + }, + { + "sampler":0, + "source":6 + }, + { + "sampler":0, + "source":7 + }, + { + "sampler":0, + "source":8 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_Normal", + "uri":"T_Plaster_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_BaseColor", + "uri":"T_Plaster_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_Plaster_ORM", + "uri":"T_Plaster_ORM.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Normal", + "uri":"T_UnevenBrick_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_BaseColor", + "uri":"T_UnevenBrick_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_UnevenBrick_Roughness", + "uri":"T_UnevenBrick_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":64, + "max":[ + 1, + 3.1226887702941895, + 0.09244640171527863 + ], + "min":[ + -1.0000001192092896, + 2.877309799194336, + -0.3140353262424469 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":64, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":64, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":150, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":30, + "max":[ + 1, + 3, + -0.19999989867210388 + ], + "min":[ + -1, + 0, + -0.2000000923871994 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":30, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":30, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":90, + "type":"SCALAR" + }, + { + "bufferView":10, + "componentType":5126, + "count":36, + "max":[ + 1, + 3, + 1.3113415775478643e-07 + ], + "min":[ + -1, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":36, + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":13, + "componentType":5126, + "count":36, + "type":"VEC2" + }, + { + "bufferView":14, + "componentType":5123, + "count":108, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":768, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":768, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":1536, + "target":34962 + }, + { + "buffer":0, + "byteLength":512, + "byteOffset":2048, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":2560, + "target":34963 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":2860, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":3220, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":3580, + "target":34962 + }, + { + "buffer":0, + "byteLength":240, + "byteOffset":3820, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":4060, + "target":34963 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":4240, + "target":34962 + }, + { + "buffer":0, + "byteLength":432, + "byteOffset":4672, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5104, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":5392, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":5680, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5896, + "uri":"Wall_UnevenBrick_Window_Wide_Round.bin" + } + ] +} diff --git a/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf.import b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf.import new file mode 100644 index 0000000..2248713 --- /dev/null +++ b/meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b1eeowrmy2b7j" +path="res://.godot/imported/Wall_UnevenBrick_Window_Wide_Round.gltf-0ffcc04e30d50ab2891a17ae6d243d12.scn" + +[deps] + +source_file="res://meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf" +dest_files=["res://.godot/imported/Wall_UnevenBrick_Window_Wide_Round.gltf-0ffcc04e30d50ab2891a17ae6d243d12.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Thin_Flat_Closed.bin b/meshes/village/WindowShutters_Thin_Flat_Closed.bin new file mode 100644 index 0000000..993d295 Binary files /dev/null and b/meshes/village/WindowShutters_Thin_Flat_Closed.bin differ diff --git a/meshes/village/WindowShutters_Thin_Flat_Closed.gltf b/meshes/village/WindowShutters_Thin_Flat_Closed.gltf new file mode 100644 index 0000000..4b4511c --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Flat_Closed.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Thin_Flat_Closed" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.181", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":192, + "max":[ + 0.4331279397010803, + 2.51727557182312, + 0.306753933429718 + ], + "min":[ + -0.4186466634273529, + 1.0932440757751465, + 0.17098437249660492 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":192, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":192, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":192, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":288, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2304, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":2304, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":4608, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":6144, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":7680, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8256, + "uri":"WindowShutters_Thin_Flat_Closed.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Thin_Flat_Closed.gltf.import b/meshes/village/WindowShutters_Thin_Flat_Closed.gltf.import new file mode 100644 index 0000000..64a1b48 --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Flat_Closed.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3uvpf6ad883d" +path="res://.godot/imported/WindowShutters_Thin_Flat_Closed.gltf-b00f6d3189b487fcc00953232da670b2.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Thin_Flat_Closed.gltf" +dest_files=["res://.godot/imported/WindowShutters_Thin_Flat_Closed.gltf-b00f6d3189b487fcc00953232da670b2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Thin_Flat_Open.bin b/meshes/village/WindowShutters_Thin_Flat_Open.bin new file mode 100644 index 0000000..4fe3378 Binary files /dev/null and b/meshes/village/WindowShutters_Thin_Flat_Open.bin differ diff --git a/meshes/village/WindowShutters_Thin_Flat_Open.gltf b/meshes/village/WindowShutters_Thin_Flat_Open.gltf new file mode 100644 index 0000000..52a15eb --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Flat_Open.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Thin_Flat_Open" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.180", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":192, + "max":[ + 0.6605413556098938, + 2.5174386501312256, + 0.5136077404022217 + ], + "min":[ + -0.6934646368026733, + 1.0932440757751465, + 0.13653387129306793 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":192, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":192, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":192, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":288, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2304, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":2304, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":4608, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":6144, + "target":34962 + }, + { + "buffer":0, + "byteLength":576, + "byteOffset":7680, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":8256, + "uri":"WindowShutters_Thin_Flat_Open.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Thin_Flat_Open.gltf.import b/meshes/village/WindowShutters_Thin_Flat_Open.gltf.import new file mode 100644 index 0000000..ee53118 --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Flat_Open.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://irn7a4t40mma" +path="res://.godot/imported/WindowShutters_Thin_Flat_Open.gltf-effc79eddacd8a6bf32a024fd9d34c3a.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Thin_Flat_Open.gltf" +dest_files=["res://.godot/imported/WindowShutters_Thin_Flat_Open.gltf-effc79eddacd8a6bf32a024fd9d34c3a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Thin_Round_Closed.bin b/meshes/village/WindowShutters_Thin_Round_Closed.bin new file mode 100644 index 0000000..c16f9ea Binary files /dev/null and b/meshes/village/WindowShutters_Thin_Round_Closed.bin differ diff --git a/meshes/village/WindowShutters_Thin_Round_Closed.gltf b/meshes/village/WindowShutters_Thin_Round_Closed.gltf new file mode 100644 index 0000000..aa5c8e4 --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Round_Closed.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Thin_Round_Closed" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.184", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":220, + "max":[ + 0.438720166683197, + 2.6116669178009033, + 0.2882345914840698 + ], + "min":[ + -0.428682804107666, + 1.0932440757751465, + 0.15246501564979553 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":220, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":220, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":220, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":336, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2640, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2640, + "byteOffset":2640, + "target":34962 + }, + { + "buffer":0, + "byteLength":1760, + "byteOffset":5280, + "target":34962 + }, + { + "buffer":0, + "byteLength":1760, + "byteOffset":7040, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":8800, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":9472, + "uri":"WindowShutters_Thin_Round_Closed.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Thin_Round_Closed.gltf.import b/meshes/village/WindowShutters_Thin_Round_Closed.gltf.import new file mode 100644 index 0000000..0c8eb60 --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Round_Closed.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ba6dixbdkuyfu" +path="res://.godot/imported/WindowShutters_Thin_Round_Closed.gltf-43a116fc24ba3d9677a19171332e3a5f.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Thin_Round_Closed.gltf" +dest_files=["res://.godot/imported/WindowShutters_Thin_Round_Closed.gltf-43a116fc24ba3d9677a19171332e3a5f.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Thin_Round_Open.bin b/meshes/village/WindowShutters_Thin_Round_Open.bin new file mode 100644 index 0000000..ce71033 Binary files /dev/null and b/meshes/village/WindowShutters_Thin_Round_Open.bin differ diff --git a/meshes/village/WindowShutters_Thin_Round_Open.gltf b/meshes/village/WindowShutters_Thin_Round_Open.gltf new file mode 100644 index 0000000..f24df0b --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Round_Open.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Thin_Round_Open" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.183", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":220, + "max":[ + 0.7867056131362915, + 2.6116669178009033, + 0.4355051815509796 + ], + "min":[ + -0.8195725083351135, + 1.0932440757751465, + 0.059017062187194824 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":220, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":220, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":220, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":336, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2640, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2640, + "byteOffset":2640, + "target":34962 + }, + { + "buffer":0, + "byteLength":1760, + "byteOffset":5280, + "target":34962 + }, + { + "buffer":0, + "byteLength":1760, + "byteOffset":7040, + "target":34962 + }, + { + "buffer":0, + "byteLength":672, + "byteOffset":8800, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":9472, + "uri":"WindowShutters_Thin_Round_Open.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Thin_Round_Open.gltf.import b/meshes/village/WindowShutters_Thin_Round_Open.gltf.import new file mode 100644 index 0000000..fe9278c --- /dev/null +++ b/meshes/village/WindowShutters_Thin_Round_Open.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cj1b5s0r1wnhv" +path="res://.godot/imported/WindowShutters_Thin_Round_Open.gltf-1bd3b66912ce8e4f63c6a20958949b50.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Thin_Round_Open.gltf" +dest_files=["res://.godot/imported/WindowShutters_Thin_Round_Open.gltf-1bd3b66912ce8e4f63c6a20958949b50.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Wide_Flat_Closed.bin b/meshes/village/WindowShutters_Wide_Flat_Closed.bin new file mode 100644 index 0000000..04f1a4c Binary files /dev/null and b/meshes/village/WindowShutters_Wide_Flat_Closed.bin differ diff --git a/meshes/village/WindowShutters_Wide_Flat_Closed.gltf b/meshes/village/WindowShutters_Wide_Flat_Closed.gltf new file mode 100644 index 0000000..bcd4fbd --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Flat_Closed.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Wide_Flat_Closed" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.175", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":240, + "max":[ + 0.6734675765037537, + 2.51727557182312, + 0.2882345914840698 + ], + "min":[ + -0.673467755317688, + 1.0932440757751465, + 0.15246501564979553 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":240, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":240, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":240, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":360, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2880, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2880, + "byteOffset":2880, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":5760, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":7680, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":9600, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":10320, + "uri":"WindowShutters_Wide_Flat_Closed.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Wide_Flat_Closed.gltf.import b/meshes/village/WindowShutters_Wide_Flat_Closed.gltf.import new file mode 100644 index 0000000..86f5793 --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Flat_Closed.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c3k05gd3kk102" +path="res://.godot/imported/WindowShutters_Wide_Flat_Closed.gltf-aa08638228eedf5353d987e10ddea5fd.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Wide_Flat_Closed.gltf" +dest_files=["res://.godot/imported/WindowShutters_Wide_Flat_Closed.gltf-aa08638228eedf5353d987e10ddea5fd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Wide_Flat_Open.bin b/meshes/village/WindowShutters_Wide_Flat_Open.bin new file mode 100644 index 0000000..7aad023 Binary files /dev/null and b/meshes/village/WindowShutters_Wide_Flat_Open.bin differ diff --git a/meshes/village/WindowShutters_Wide_Flat_Open.gltf b/meshes/village/WindowShutters_Wide_Flat_Open.gltf new file mode 100644 index 0000000..34d1d41 --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Flat_Open.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Wide_Flat_Open" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.172", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":240, + "max":[ + 1.2418603897094727, + 2.51727557182312, + 0.5931743383407593 + ], + "min":[ + -1.2387090921401978, + 1.0932440757751465, + 0.13665564358234406 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":240, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":240, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":240, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":360, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2880, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2880, + "byteOffset":2880, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":5760, + "target":34962 + }, + { + "buffer":0, + "byteLength":1920, + "byteOffset":7680, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":9600, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":10320, + "uri":"WindowShutters_Wide_Flat_Open.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Wide_Flat_Open.gltf.import b/meshes/village/WindowShutters_Wide_Flat_Open.gltf.import new file mode 100644 index 0000000..c54cf7c --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Flat_Open.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cdyyieo6wyqks" +path="res://.godot/imported/WindowShutters_Wide_Flat_Open.gltf-41deeb0c060ba0b6f55dd4a17feb1d5c.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Wide_Flat_Open.gltf" +dest_files=["res://.godot/imported/WindowShutters_Wide_Flat_Open.gltf-41deeb0c060ba0b6f55dd4a17feb1d5c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Wide_Round_Closed.bin b/meshes/village/WindowShutters_Wide_Round_Closed.bin new file mode 100644 index 0000000..799b63a Binary files /dev/null and b/meshes/village/WindowShutters_Wide_Round_Closed.bin differ diff --git a/meshes/village/WindowShutters_Wide_Round_Closed.gltf b/meshes/village/WindowShutters_Wide_Round_Closed.gltf new file mode 100644 index 0000000..e20374c --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Round_Closed.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Wide_Round_Closed" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.176", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":268, + "max":[ + 0.6734675765037537, + 2.740431785583496, + 0.2882345914840698 + ], + "min":[ + -0.673467755317688, + 1.0932440757751465, + 0.15246501564979553 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":268, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":268, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":268, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":408, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3216, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3216, + "byteOffset":3216, + "target":34962 + }, + { + "buffer":0, + "byteLength":2144, + "byteOffset":6432, + "target":34962 + }, + { + "buffer":0, + "byteLength":2144, + "byteOffset":8576, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":10720, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11536, + "uri":"WindowShutters_Wide_Round_Closed.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Wide_Round_Closed.gltf.import b/meshes/village/WindowShutters_Wide_Round_Closed.gltf.import new file mode 100644 index 0000000..2d9151e --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Round_Closed.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dujq7etes3pcv" +path="res://.godot/imported/WindowShutters_Wide_Round_Closed.gltf-197e2f5ee517d21288a9dfe88ecb93ad.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Wide_Round_Closed.gltf" +dest_files=["res://.godot/imported/WindowShutters_Wide_Round_Closed.gltf-197e2f5ee517d21288a9dfe88ecb93ad.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/WindowShutters_Wide_Round_Open.bin b/meshes/village/WindowShutters_Wide_Round_Open.bin new file mode 100644 index 0000000..9c96ef4 Binary files /dev/null and b/meshes/village/WindowShutters_Wide_Round_Open.bin differ diff --git a/meshes/village/WindowShutters_Wide_Round_Open.gltf b/meshes/village/WindowShutters_Wide_Round_Open.gltf new file mode 100644 index 0000000..db85ef4 --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Round_Open.gltf @@ -0,0 +1,173 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"WindowShutters_Wide_Round_Open" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + } + ], + "meshes":[ + { + "name":"Cube.178", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":268, + "max":[ + 1.1035263538360596, + 2.740431785583496, + 0.56315016746521 + ], + "min":[ + -1.199957251548767, + 1.0932440757751465, + 0.09079486131668091 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":268, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":268, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":268, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":408, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3216, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3216, + "byteOffset":3216, + "target":34962 + }, + { + "buffer":0, + "byteLength":2144, + "byteOffset":6432, + "target":34962 + }, + { + "buffer":0, + "byteLength":2144, + "byteOffset":8576, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":10720, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11536, + "uri":"WindowShutters_Wide_Round_Open.bin" + } + ] +} diff --git a/meshes/village/WindowShutters_Wide_Round_Open.gltf.import b/meshes/village/WindowShutters_Wide_Round_Open.gltf.import new file mode 100644 index 0000000..97777b3 --- /dev/null +++ b/meshes/village/WindowShutters_Wide_Round_Open.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://d3dw2tt18ncdt" +path="res://.godot/imported/WindowShutters_Wide_Round_Open.gltf-c10a86a1a6168099b1e0c66464963e40.scn" + +[deps] + +source_file="res://meshes/village/WindowShutters_Wide_Round_Open.gltf" +dest_files=["res://.godot/imported/WindowShutters_Wide_Round_Open.gltf-c10a86a1a6168099b1e0c66464963e40.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Roof_Thin.bin b/meshes/village/Window_Roof_Thin.bin new file mode 100644 index 0000000..dac6178 Binary files /dev/null and b/meshes/village/Window_Roof_Thin.bin differ diff --git a/meshes/village/Window_Roof_Thin.gltf b/meshes/village/Window_Roof_Thin.gltf new file mode 100644 index 0000000..25431bc --- /dev/null +++ b/meshes/village/Window_Roof_Thin.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Roof_Thin" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.186", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 0.3558761179447174, + 2.231660842895508, + 0.9254726767539978 + ], + "min":[ + -0.37540996074676514, + 1.3382160663604736, + -0.07780462503433228 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":48, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":60, + "max":[ + 0.46163690090179443, + 2.515549421310425, + 1.1012494564056396 + ], + "min":[ + -0.39018985629081726, + 2.0959017276763916, + 0.15802204608917236 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":60, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":60, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":90, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":1024, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1280, + "target":34963 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":1376, + "target":34962 + }, + { + "buffer":0, + "byteLength":720, + "byteOffset":2096, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":2816, + "target":34962 + }, + { + "buffer":0, + "byteLength":480, + "byteOffset":3296, + "target":34962 + }, + { + "buffer":0, + "byteLength":180, + "byteOffset":3776, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":3956, + "uri":"Window_Roof_Thin.bin" + } + ] +} diff --git a/meshes/village/Window_Roof_Thin.gltf.import b/meshes/village/Window_Roof_Thin.gltf.import new file mode 100644 index 0000000..ea13081 --- /dev/null +++ b/meshes/village/Window_Roof_Thin.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bfe2o1n4ekr7q" +path="res://.godot/imported/Window_Roof_Thin.gltf-9f560c92bb95bffb1ecbca26cbc4ae5a.scn" + +[deps] + +source_file="res://meshes/village/Window_Roof_Thin.gltf" +dest_files=["res://.godot/imported/Window_Roof_Thin.gltf-9f560c92bb95bffb1ecbca26cbc4ae5a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Roof_Wide.bin b/meshes/village/Window_Roof_Wide.bin new file mode 100644 index 0000000..fdcf7d6 Binary files /dev/null and b/meshes/village/Window_Roof_Wide.bin differ diff --git a/meshes/village/Window_Roof_Wide.gltf b/meshes/village/Window_Roof_Wide.gltf new file mode 100644 index 0000000..c095bb5 --- /dev/null +++ b/meshes/village/Window_Roof_Wide.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Roof_Wide" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":3 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":4 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":5 + } + } + } + ], + "meshes":[ + { + "name":"Cube.170", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + }, + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":32, + "max":[ + 0.6393694877624512, + 2.231660842895508, + 0.9254726767539978 + ], + "min":[ + -0.6393694877624512, + 1.3382160663604736, + -0.07780461013317108 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":32, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":32, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":48, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":100, + "max":[ + 0.755696713924408, + 2.5192716121673584, + 1.1012494564056396 + ], + "min":[ + -0.6607890129089355, + 2.0959017276763916, + 0.15802204608917236 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":100, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":100, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":100, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":150, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":384, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":384, + "byteOffset":384, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":256, + "byteOffset":1024, + "target":34962 + }, + { + "buffer":0, + "byteLength":96, + "byteOffset":1280, + "target":34963 + }, + { + "buffer":0, + "byteLength":1200, + "byteOffset":1376, + "target":34962 + }, + { + "buffer":0, + "byteLength":1200, + "byteOffset":2576, + "target":34962 + }, + { + "buffer":0, + "byteLength":800, + "byteOffset":3776, + "target":34962 + }, + { + "buffer":0, + "byteLength":800, + "byteOffset":4576, + "target":34962 + }, + { + "buffer":0, + "byteLength":300, + "byteOffset":5376, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":5676, + "uri":"Window_Roof_Wide.bin" + } + ] +} diff --git a/meshes/village/Window_Roof_Wide.gltf.import b/meshes/village/Window_Roof_Wide.gltf.import new file mode 100644 index 0000000..6972274 --- /dev/null +++ b/meshes/village/Window_Roof_Wide.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://blmqrpcwck30g" +path="res://.godot/imported/Window_Roof_Wide.gltf-f06bc1d091fe7274d4e4b710b9805064.scn" + +[deps] + +source_file="res://meshes/village/Window_Roof_Wide.gltf" +dest_files=["res://.godot/imported/Window_Roof_Wide.gltf-f06bc1d091fe7274d4e4b710b9805064.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Thin_Flat1.bin b/meshes/village/Window_Thin_Flat1.bin new file mode 100644 index 0000000..3d30b21 Binary files /dev/null and b/meshes/village/Window_Thin_Flat1.bin differ diff --git a/meshes/village/Window_Thin_Flat1.gltf b/meshes/village/Window_Thin_Flat1.gltf new file mode 100644 index 0000000..8f57298 --- /dev/null +++ b/meshes/village/Window_Thin_Flat1.gltf @@ -0,0 +1,242 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Thin_Flat1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.151", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":200, + "max":[ + 0.3829127252101898, + 2.532715082168579, + 0.16916218400001526 + ], + "min":[ + -0.4050583243370056, + 0.9747479557991028, + -0.26658084988594055 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":200, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":200, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":300, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":18, + "max":[ + 0.2618868350982666, + 2.3916547298431396, + 0.003888234496116638 + ], + "min":[ + -0.2717304825782776, + 1.1277093887329102, + 0.0038878247141838074 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":18, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":18, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":2400, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":2400, + "byteOffset":2400, + "target":34962 + }, + { + "buffer":0, + "byteLength":1600, + "byteOffset":4800, + "target":34962 + }, + { + "buffer":0, + "byteLength":600, + "byteOffset":6400, + "target":34963 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":7000, + "target":34962 + }, + { + "buffer":0, + "byteLength":216, + "byteOffset":7216, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":7432, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":7576, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":7648, + "uri":"Window_Thin_Flat1.bin" + } + ] +} diff --git a/meshes/village/Window_Thin_Flat1.gltf.import b/meshes/village/Window_Thin_Flat1.gltf.import new file mode 100644 index 0000000..3036b25 --- /dev/null +++ b/meshes/village/Window_Thin_Flat1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3txalkos82av" +path="res://.godot/imported/Window_Thin_Flat1.gltf-6984264a950c1b1b547328a0f579997a.scn" + +[deps] + +source_file="res://meshes/village/Window_Thin_Flat1.gltf" +dest_files=["res://.godot/imported/Window_Thin_Flat1.gltf-6984264a950c1b1b547328a0f579997a.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Thin_Round1.bin b/meshes/village/Window_Thin_Round1.bin new file mode 100644 index 0000000..3cf8920 Binary files /dev/null and b/meshes/village/Window_Thin_Round1.bin differ diff --git a/meshes/village/Window_Thin_Round1.gltf b/meshes/village/Window_Thin_Round1.gltf new file mode 100644 index 0000000..ec1e525 --- /dev/null +++ b/meshes/village/Window_Thin_Round1.gltf @@ -0,0 +1,268 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Thin_Round1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.128", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":440, + "max":[ + 0.44381028413772583, + 2.6207287311553955, + 0.0923665463924408 + ], + "min":[ + -0.44381028413772583, + 1.01604425907135, + -0.2520223557949066 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":440, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":440, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":440, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":900, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":143, + "max":[ + 0.277061402797699, + 2.478931427001953, + 0.003888234496116638 + ], + "min":[ + -0.27893951535224915, + 1.0875728130340576, + 0.0038879886269569397 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":143, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":143, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":143, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":354, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":5280, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":5280, + "byteOffset":5280, + "target":34962 + }, + { + "buffer":0, + "byteLength":3520, + "byteOffset":10560, + "target":34962 + }, + { + "buffer":0, + "byteLength":3520, + "byteOffset":14080, + "target":34962 + }, + { + "buffer":0, + "byteLength":1800, + "byteOffset":17600, + "target":34963 + }, + { + "buffer":0, + "byteLength":1716, + "byteOffset":19400, + "target":34962 + }, + { + "buffer":0, + "byteLength":1716, + "byteOffset":21116, + "target":34962 + }, + { + "buffer":0, + "byteLength":1144, + "byteOffset":22832, + "target":34962 + }, + { + "buffer":0, + "byteLength":1144, + "byteOffset":23976, + "target":34962 + }, + { + "buffer":0, + "byteLength":708, + "byteOffset":25120, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":25828, + "uri":"Window_Thin_Round1.bin" + } + ] +} diff --git a/meshes/village/Window_Thin_Round1.gltf.import b/meshes/village/Window_Thin_Round1.gltf.import new file mode 100644 index 0000000..219b7fe --- /dev/null +++ b/meshes/village/Window_Thin_Round1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bwcalmhshfke8" +path="res://.godot/imported/Window_Thin_Round1.gltf-138d4cb0300cab6c217ed6b0e3a51b45.scn" + +[deps] + +source_file="res://meshes/village/Window_Thin_Round1.gltf" +dest_files=["res://.godot/imported/Window_Thin_Round1.gltf-138d4cb0300cab6c217ed6b0e3a51b45.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Wide_Flat1.bin b/meshes/village/Window_Wide_Flat1.bin new file mode 100644 index 0000000..ea08142 Binary files /dev/null and b/meshes/village/Window_Wide_Flat1.bin differ diff --git a/meshes/village/Window_Wide_Flat1.gltf b/meshes/village/Window_Wide_Flat1.gltf new file mode 100644 index 0000000..e9d8d43 --- /dev/null +++ b/meshes/village/Window_Wide_Flat1.gltf @@ -0,0 +1,242 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Wide_Flat1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.153", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + }, + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":272, + "max":[ + 0.8041172027587891, + 2.5242888927459717, + 0.4168574810028076 + ], + "min":[ + -0.8041191101074219, + 0.94417804479599, + -0.26658084988594055 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":272, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":272, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":408, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":45, + "max":[ + 0.5054702758789062, + 2.355356216430664, + 0.003888234496116638 + ], + "min":[ + -0.5054721832275391, + 1.0971393585205078, + 0.0038878247141838074 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":45, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":45, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":72, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":3264, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":3264, + "byteOffset":3264, + "target":34962 + }, + { + "buffer":0, + "byteLength":2176, + "byteOffset":6528, + "target":34962 + }, + { + "buffer":0, + "byteLength":816, + "byteOffset":8704, + "target":34963 + }, + { + "buffer":0, + "byteLength":540, + "byteOffset":9520, + "target":34962 + }, + { + "buffer":0, + "byteLength":540, + "byteOffset":10060, + "target":34962 + }, + { + "buffer":0, + "byteLength":360, + "byteOffset":10600, + "target":34962 + }, + { + "buffer":0, + "byteLength":144, + "byteOffset":10960, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":11104, + "uri":"Window_Wide_Flat1.bin" + } + ] +} diff --git a/meshes/village/Window_Wide_Flat1.gltf.import b/meshes/village/Window_Wide_Flat1.gltf.import new file mode 100644 index 0000000..5315f81 --- /dev/null +++ b/meshes/village/Window_Wide_Flat1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c1i174ot5uybq" +path="res://.godot/imported/Window_Wide_Flat1.gltf-fdd0eb68d574055a7f288afdb9094e3c.scn" + +[deps] + +source_file="res://meshes/village/Window_Wide_Flat1.gltf" +dest_files=["res://.godot/imported/Window_Wide_Flat1.gltf-fdd0eb68d574055a7f288afdb9094e3c.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/meshes/village/Window_Wide_Round1.bin b/meshes/village/Window_Wide_Round1.bin new file mode 100644 index 0000000..dfde6c3 Binary files /dev/null and b/meshes/village/Window_Wide_Round1.bin differ diff --git a/meshes/village/Window_Wide_Round1.gltf b/meshes/village/Window_Wide_Round1.gltf new file mode 100644 index 0000000..bb6a642 --- /dev/null +++ b/meshes/village/Window_Wide_Round1.gltf @@ -0,0 +1,268 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.0.44", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Window_Wide_Round1" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"MI_WoodTrim_Wear", + "normalTexture":{ + "index":0 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "metallicRoughnessTexture":{ + "index":2 + } + } + }, + { + "alphaMode":"BLEND", + "doubleSided":true, + "name":"MI_WindowGlass", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 0.09545451402664185 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube.147", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0 + }, + { + "attributes":{ + "POSITION":5, + "NORMAL":6, + "TEXCOORD_0":7, + "TEXCOORD_1":8 + }, + "indices":9, + "material":1 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"T_WoodTrim_Normal", + "uri":"T_WoodTrim_Normal.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_BaseColor", + "uri":"T_WoodTrim_BaseColor.png" + }, + { + "mimeType":"image/png", + "name":"T_WoodTrim_Roughness", + "uri":"T_WoodTrim_Roughness.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":392, + "max":[ + 0.682457685470581, + 2.741780996322632, + 0.27729201316833496 + ], + "min":[ + -0.682457685470581, + 1.01604425907135, + -0.2522830367088318 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":392, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":392, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":392, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":828, + "type":"SCALAR" + }, + { + "bufferView":5, + "componentType":5126, + "count":100, + "max":[ + 0.5413169860839844, + 2.6192541122436523, + 0.0038883001543581486 + ], + "min":[ + -0.5445477962493896, + 1.0647618770599365, + 0.003887913655489683 + ], + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":100, + "type":"VEC3" + }, + { + "bufferView":7, + "componentType":5126, + "count":100, + "type":"VEC2" + }, + { + "bufferView":8, + "componentType":5126, + "count":100, + "type":"VEC2" + }, + { + "bufferView":9, + "componentType":5123, + "count":234, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4704, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4704, + "byteOffset":4704, + "target":34962 + }, + { + "buffer":0, + "byteLength":3136, + "byteOffset":9408, + "target":34962 + }, + { + "buffer":0, + "byteLength":3136, + "byteOffset":12544, + "target":34962 + }, + { + "buffer":0, + "byteLength":1656, + "byteOffset":15680, + "target":34963 + }, + { + "buffer":0, + "byteLength":1200, + "byteOffset":17336, + "target":34962 + }, + { + "buffer":0, + "byteLength":1200, + "byteOffset":18536, + "target":34962 + }, + { + "buffer":0, + "byteLength":800, + "byteOffset":19736, + "target":34962 + }, + { + "buffer":0, + "byteLength":800, + "byteOffset":20536, + "target":34962 + }, + { + "buffer":0, + "byteLength":468, + "byteOffset":21336, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":21804, + "uri":"Window_Wide_Round1.bin" + } + ] +} diff --git a/meshes/village/Window_Wide_Round1.gltf.import b/meshes/village/Window_Wide_Round1.gltf.import new file mode 100644 index 0000000..56de0f1 --- /dev/null +++ b/meshes/village/Window_Wide_Round1.gltf.import @@ -0,0 +1,37 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7bhh6aas0sxr" +path="res://.godot/imported/Window_Wide_Round1.gltf-82194e3da141ea36cbe219ffffcd27d3.scn" + +[deps] + +source_file="res://meshes/village/Window_Wide_Round1.gltf" +dest_files=["res://.godot/imported/Window_Wide_Round1.gltf-82194e3da141ea36cbe219ffffcd27d3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..cfbef73 --- /dev/null +++ b/project.godot @@ -0,0 +1,25 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="obhajoba-demo" +run/main_scene="uid://dtbrnxalat1d4" +config/features=PackedStringArray("4.4", "Forward Plus") +config/icon="res://icon.svg" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 + +[editor_plugins] + +enabled=PackedStringArray("res://addons/portals/plugin.cfg", "res://addons/proton_scatter/plugin.cfg") diff --git a/scenes/character_body_3d.gd b/scenes/character_body_3d.gd new file mode 100644 index 0000000..acb7fb2 --- /dev/null +++ b/scenes/character_body_3d.gd @@ -0,0 +1,28 @@ +extends CharacterBody3D + + +const SPEED = 5.0 +const JUMP_VELOCITY = 4.5 + + +func _physics_process(delta: float) -> void: + # Add the gravity. + if not is_on_floor(): + velocity += get_gravity() * delta + + # Handle jump. + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") + var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + velocity.x = direction.x * SPEED + velocity.z = direction.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + move_and_slide() diff --git a/scenes/character_body_3d.gd.uid b/scenes/character_body_3d.gd.uid new file mode 100644 index 0000000..84a6f42 --- /dev/null +++ b/scenes/character_body_3d.gd.uid @@ -0,0 +1 @@ +uid://c71tqggnalmty diff --git a/scenes/world.exr b/scenes/world.exr new file mode 100644 index 0000000..df554d8 Binary files /dev/null and b/scenes/world.exr differ diff --git a/scenes/world.exr.import b/scenes/world.exr.import new file mode 100644 index 0000000..08f3639 --- /dev/null +++ b/scenes/world.exr.import @@ -0,0 +1,27 @@ +[remap] + +importer="2d_array_texture" +type="CompressedTexture2DArray" +uid="uid://3m00xfuapdmp" +path.bptc="res://.godot/imported/world.exr-cbfd32ba19439b949c8f4375964840cd.bptc.ctexarray" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://scenes/world.exr" +dest_files=["res://.godot/imported/world.exr-cbfd32ba19439b949c8f4375964840cd.bptc.ctexarray"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/channel_pack=1 +mipmaps/generate=false +mipmaps/limit=-1 +slices/horizontal=1 +slices/vertical=4 diff --git a/scenes/world.lmbake b/scenes/world.lmbake new file mode 100644 index 0000000..2f85724 Binary files /dev/null and b/scenes/world.lmbake differ diff --git a/scenes/world.tscn b/scenes/world.tscn new file mode 100644 index 0000000..e6970f2 --- /dev/null +++ b/scenes/world.tscn @@ -0,0 +1,361 @@ +[gd_scene load_steps=46 format=3 uid="uid://dtbrnxalat1d4"] + +[ext_resource type="PackedScene" uid="uid://wsu3b5udqtdu" path="res://meshes/village/Wall_UnevenBrick_Straight.gltf" id="1_4mrxx"] +[ext_resource type="Texture2D" uid="uid://bgc5rl13dopuj" path="res://addons/proton_scatter/demos/assets/textures/sky_2.png" id="1_w7kh3"] +[ext_resource type="PackedScene" uid="uid://bn0v2shtv7m3l" path="res://meshes/village/Corner_Exterior_Brick.gltf" id="2_7r4gi"] +[ext_resource type="Script" uid="uid://dr0q8wis1hmem" path="res://addons/proton_scatter/src/stack/modifier_stack.gd" id="2_e3hyu"] +[ext_resource type="Script" uid="uid://mlpya7qid02x" path="res://addons/proton_scatter/src/scatter.gd" id="2_oo54l"] +[ext_resource type="Script" uid="uid://cnmsv3hyahjcc" path="res://addons/proton_scatter/src/modifiers/base_modifier.gd" id="3_q5onr"] +[ext_resource type="PackedScene" uid="uid://clysjxno24doq" path="res://meshes/village/Wall_UnevenBrick_Door_Round.gltf" id="3_w7kh3"] +[ext_resource type="PackedScene" uid="uid://b1eeowrmy2b7j" path="res://meshes/village/Wall_UnevenBrick_Window_Wide_Round.gltf" id="4_e3hyu"] +[ext_resource type="Script" uid="uid://ccca88h6hgw0k" path="res://addons/proton_scatter/src/modifiers/create_inside_random.gd" id="4_jhx03"] +[ext_resource type="Script" uid="uid://ccb3ri34jjl0p" path="res://addons/proton_scatter/src/modifiers/randomize_transforms.gd" id="5_o8fc1"] +[ext_resource type="PackedScene" uid="uid://7bhh6aas0sxr" path="res://meshes/village/Window_Wide_Round1.gltf" id="5_q5onr"] +[ext_resource type="PackedScene" uid="uid://c3fv7wek4rjjt" path="res://meshes/village/Floor_WoodLight.gltf" id="6_jhx03"] +[ext_resource type="Script" uid="uid://dnelpti3wyfcb" path="res://addons/proton_scatter/src/modifiers/relax.gd" id="6_xo05s"] +[ext_resource type="Script" uid="uid://quoo7t5rxnu3" path="res://addons/proton_scatter/src/modifiers/project_on_geometry.gd" id="7_dss4m"] +[ext_resource type="PackedScene" uid="uid://berkexxyn3lq4" path="res://meshes/village/DoorFrame_Round_WoodDark.gltf" id="7_o8fc1"] +[ext_resource type="Script" uid="uid://dqqal1jno4xml" path="res://addons/proton_scatter/src/scatter_item.gd" id="8_7t5mc"] +[ext_resource type="PackedScene" uid="uid://db427w7dfyhno" path="res://meshes/village/Door_8_Round.gltf" id="8_xo05s"] +[ext_resource type="Script" uid="uid://bsl3en0gdt8ka" path="res://addons/proton_scatter/src/scatter_shape.gd" id="9_lakw3"] +[ext_resource type="Script" uid="uid://djsvn08xssx6k" path="res://addons/proton_scatter/src/shapes/sphere_shape.gd" id="10_pm21f"] +[ext_resource type="Script" uid="uid://d011g8ga6gea7" path="res://addons/proton_scatter/src/shapes/box_shape.gd" id="10_w7kh3"] +[ext_resource type="Script" uid="uid://bfr4urrxjg8sm" path="res://addons/proton_scatter/src/cache/scatter_cache.gd" id="14_ctatt"] +[ext_resource type="PackedScene" uid="uid://dc4ynch2n1ish" path="res://meshes/village/Roof_RoundTiles_4x4.gltf" id="22_kpybi"] +[ext_resource type="PackedScene" uid="uid://b7mjoyryltilk" path="res://meshes/village/Roof_Front_Brick4.gltf" id="23_ctatt"] +[ext_resource type="Script" uid="uid://d2crarvkhd45r" path="res://scripts/player.gd" id="23_kpybi"] + +[sub_resource type="PanoramaSkyMaterial" id="PanoramaSkyMaterial_q5onr"] +panorama = ExtResource("1_w7kh3") + +[sub_resource type="Sky" id="Sky_jhx03"] +sky_material = SubResource("PanoramaSkyMaterial_q5onr") + +[sub_resource type="Environment" id="Environment_o8fc1"] +background_mode = 2 +sky = SubResource("Sky_jhx03") +sky_rotation = Vector3(0, 0.436332, 0) +ambient_light_source = 2 +ambient_light_color = Color(0.939669, 0.875855, 0.802177, 1) +ambient_light_energy = 0.2 +tonemap_mode = 3 +ssao_enabled = true +ssao_intensity = 5.0 +fog_density = 0.0051 +fog_sky_affect = 0.23 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ctatt"] +radius = 0.4 +height = 1.75 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dss4m"] +albedo_color = Color(0.448364, 0.428649, 0.0977373, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_kpybi"] +size = Vector3(1000, 0.5, 1000) + +[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_oo54l"] +points = PackedVector3Array(-500, -0.25, -500, -500, 0.25, -500, 500, -0.25, -500, -500, -0.25, 500, -500, 0.25, 500, 500, 0.25, -500, 500, -0.25, 500, 500, 0.25, 500) + +[sub_resource type="Resource" id="Resource_oo54l"] +script = ExtResource("4_jhx03") +amount = 1500 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_kpybi"] +script = ExtResource("5_o8fc1") +position = Vector3(0.15, 0.15, 0.15) +rotation = Vector3(20, 360, 20) +scale = Vector3(0.1, 0.1, 0.1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_ctatt"] +script = ExtResource("6_xo05s") +iterations = 3 +offset_step = 0.2 +consecutive_step_multiplier = 0.75 +use_computeshader = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_xgqkh"] +script = ExtResource("7_dss4m") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_munwf"] +script = ExtResource("2_e3hyu") +stack = Array[ExtResource("3_q5onr")]([SubResource("Resource_oo54l"), SubResource("Resource_kpybi"), SubResource("Resource_ctatt"), SubResource("Resource_xgqkh")]) + +[sub_resource type="Resource" id="Resource_37qwj"] +script = ExtResource("10_pm21f") +radius = 18.0 +metadata/_custom_type_script = "uid://djsvn08xssx6k" + +[sub_resource type="Resource" id="Resource_navra"] +script = ExtResource("10_w7kh3") +size = Vector3(5.47877, 1, 7.53509) +metadata/_custom_type_script = "uid://d011g8ga6gea7" + +[sub_resource type="Resource" id="Resource_ts3gi"] +script = ExtResource("4_jhx03") +amount = 1200 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 1 + +[sub_resource type="Resource" id="Resource_0nbtd"] +script = ExtResource("5_o8fc1") +position = Vector3(0.1, 0.15, 0.1) +rotation = Vector3(10, 360, 10) +scale = Vector3(1, 2, 1) +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 2 + +[sub_resource type="Resource" id="Resource_luhhm"] +script = ExtResource("6_xo05s") +iterations = 3 +offset_step = 0.2 +consecutive_step_multiplier = 0.75 +use_computeshader = true +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = true +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_fh13f"] +script = ExtResource("7_dss4m") +ray_direction = Vector3(0, -1, 0) +ray_length = 5.0 +ray_offset = 5.0 +remove_points_on_miss = false +align_with_collision_normal = false +max_slope = 90.0 +collision_mask = 1 +exclude_mask = 0 +enabled = true +override_global_seed = false +custom_seed = 0 +restrict_height = false +reference_frame = 0 + +[sub_resource type="Resource" id="Resource_rup4s"] +script = ExtResource("2_e3hyu") +stack = Array[ExtResource("3_q5onr")]([SubResource("Resource_ts3gi"), SubResource("Resource_0nbtd"), SubResource("Resource_luhhm"), SubResource("Resource_fh13f")]) + +[sub_resource type="Resource" id="Resource_f17e3"] +script = ExtResource("10_w7kh3") +size = Vector3(70, 1, 70) +metadata/_custom_type_script = "uid://d011g8ga6gea7" + +[sub_resource type="Resource" id="Resource_x2olw"] +script = ExtResource("10_pm21f") +radius = 18.0 +metadata/_custom_type_script = "uid://djsvn08xssx6k" + +[node name="World" type="Node3D"] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_o8fc1") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.906308, -0.207465, 0.368191, 0, 0.871214, 0.490904, -0.422618, -0.44491, 0.789588, 0, 3.9, 6.3) +light_color = Color(0.939669, 0.875855, 0.802177, 1) +light_energy = 2.0 +light_bake_mode = 1 +shadow_enabled = true + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("camera")] +transform = Transform3D(-0.658689, 0, 0.752415, 0, 1, 0, -0.752415, 0, -0.658689, 12.1193, 1.93814, -3.63533) +script = ExtResource("23_kpybi") +camera = NodePath("Camera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("CapsuleShape3D_ctatt") + +[node name="Camera3D" type="Camera3D" parent="CharacterBody3D"] +transform = Transform3D(1, 0, 2.98023e-08, 0, 1, 0, -2.98023e-08, 0, 1, 0, 0.7, 0) + +[node name="Ground" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.25, 0) +material_override = SubResource("StandardMaterial3D_dss4m") +mesh = SubResource("BoxMesh_kpybi") + +[node name="StaticBody3D" type="StaticBody3D" parent="Ground"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground/StaticBody3D"] +shape = SubResource("ConvexPolygonShape3D_oo54l") + +[node name="ProtonScatter" type="Node3D" parent="Ground"] +script = ExtResource("2_oo54l") +force_rebuild_on_load = false +modifier_stack = SubResource("Resource_munwf") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) +metadata/_custom_type_script = "uid://mlpya7qid02x" + +[node name="ScatterItem" type="Node3D" parent="Ground/ProtonScatter"] +script = ExtResource("8_7t5mc") +path = "uid://cia3jakp3wj1d" + +[node name="ScatterItem2" type="Node3D" parent="Ground/ProtonScatter"] +script = ExtResource("8_7t5mc") +path = "uid://c3c76je2y6vfj" + +[node name="ScatterItem3" type="Node3D" parent="Ground/ProtonScatter"] +script = ExtResource("8_7t5mc") +proportion = 25 +path = "uid://bltmr2xgs8nq1" + +[node name="ScatterShape" type="Node3D" parent="Ground/ProtonScatter"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +visible = false +script = ExtResource("9_lakw3") +shape = SubResource("Resource_37qwj") + +[node name="NegativeHouse" type="Node3D" parent="Ground/ProtonScatter"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, -2.4) +visible = false +script = ExtResource("9_lakw3") +negative = true +shape = SubResource("Resource_navra") +metadata/_custom_type_script = "uid://bsl3en0gdt8ka" + +[node name="ScatterTrees" type="Node3D" parent="Ground"] +script = ExtResource("2_oo54l") +force_rebuild_on_load = false +modifier_stack = SubResource("Resource_rup4s") +Performance/use_chunks = true +Performance/chunk_dimensions = Vector3(15, 15, 15) +metadata/_custom_type_script = "uid://mlpya7qid02x" + +[node name="PineTree" type="Node3D" parent="Ground/ScatterTrees"] +script = ExtResource("8_7t5mc") +path = "uid://caqxfqurbp3ku" + +[node name="Bush" type="Node3D" parent="Ground/ScatterTrees"] +script = ExtResource("8_7t5mc") +proportion = 50 +path = "uid://b8abs8me7ckgo" + +[node name="ScatterShape" type="Node3D" parent="Ground/ScatterTrees"] +transform = Transform3D(1, 0, -2.98023e-08, 0, 1, 0, 2.98023e-08, 0, 1, 0, 0, 0) +visible = false +script = ExtResource("9_lakw3") +shape = SubResource("Resource_f17e3") + +[node name="NegativeTrees" type="Node3D" parent="Ground/ScatterTrees"] +visible = false +script = ExtResource("9_lakw3") +negative = true +shape = SubResource("Resource_x2olw") +metadata/_custom_type_script = "uid://bsl3en0gdt8ka" + +[node name="ScatterCache" type="Node3D" parent="Ground"] +script = ExtResource("14_ctatt") +cache_file = "res://addons/proton_scatter/cache/world_3365597381_scatter_cache.res" +metadata/_custom_type_script = "uid://bfr4urrxjg8sm" + +[node name="House_Small" type="Node3D" parent="."] + +[node name="Wall_UnevenBrick_Straight2" parent="House_Small" instance=ExtResource("1_4mrxx")] + +[node name="Wall_UnevenBrick_Straight4" parent="House_Small" instance=ExtResource("1_4mrxx")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 3.2, 0, -1.2) + +[node name="Corner_Exterior_Brick2" parent="House_Small" instance=ExtResource("2_7r4gi")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 3.24352, 0, 0.0523289) + +[node name="Corner_Exterior_Brick5" parent="House_Small" instance=ExtResource("2_7r4gi")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.18237, 0, -4.40472) + +[node name="Corner_Exterior_Brick4" parent="House_Small" instance=ExtResource("2_7r4gi")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -1.21763, 0, -0.00472424) + +[node name="Wall_UnevenBrick_Straight6" parent="House_Small" instance=ExtResource("1_4mrxx")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 1.99626, 0, -4.39612) + +[node name="Wall_UnevenBrick_Straight7" parent="House_Small" instance=ExtResource("1_4mrxx")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.00373673, 0, -4.39612) + +[node name="Wall_UnevenBrick_Straight8" parent="House_Small" instance=ExtResource("1_4mrxx")] +transform = Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, -1.20374, 0, -3.19612) + +[node name="Wall_UnevenBrick_Straight9" parent="House_Small" instance=ExtResource("1_4mrxx")] +transform = Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, -1.20374, 0, -1.19612) + +[node name="Corner_Exterior_Brick3" parent="House_Small" instance=ExtResource("2_7r4gi")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1.24725, 0, -4.44845) + +[node name="Wall_UnevenBrick_Door_Round2" parent="House_Small" instance=ExtResource("3_w7kh3")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 3.2, 0, -3.2) + +[node name="Wall_UnevenBrick_Window_Wide_Round2" parent="House_Small" instance=ExtResource("4_e3hyu")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) + +[node name="Window_Wide_Round12" parent="House_Small" instance=ExtResource("5_q5onr")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) + +[node name="Floor_WoodLight2" parent="House_Small" instance=ExtResource("6_jhx03")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.2) + +[node name="Floor_WoodLight3" parent="House_Small" instance=ExtResource("6_jhx03")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -3.2) + +[node name="Floor_WoodLight4" parent="House_Small" instance=ExtResource("6_jhx03")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, -3.2) + +[node name="Floor_WoodLight5" parent="House_Small" instance=ExtResource("6_jhx03")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, -1.2) + +[node name="DoorFrame_Round_WoodDark2" parent="House_Small" instance=ExtResource("7_o8fc1")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 3.1, 0, -3.2) + +[node name="Door_8_Round2" parent="House_Small" instance=ExtResource("8_xo05s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 3.1, 0, -3.7) + +[node name="OmniLight3D" type="OmniLight3D" parent="House_Small"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.855677, 2.46514, -2.07212) +light_bake_mode = 1 +shadow_enabled = true + +[node name="Roof_RoundTiles_4x42" parent="House_Small" instance=ExtResource("22_kpybi")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.852654, 3.1, -2.21197) + +[node name="Roof_Front_Brick42" parent="House_Small/Roof_RoundTiles_4x42" instance=ExtResource("23_ctatt")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38419e-07, 0, 2.4) + +[node name="Roof_Front_Brick43" parent="House_Small/Roof_RoundTiles_4x42" instance=ExtResource("23_ctatt")] +transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, -4.76837e-07, 0, -2.1) + +[node name="ReflectionProbe" type="ReflectionProbe" parent="."] +size = Vector3(50, 20, 50) diff --git a/scripts/player.gd b/scripts/player.gd new file mode 100644 index 0000000..8f9259d --- /dev/null +++ b/scripts/player.gd @@ -0,0 +1,56 @@ +extends CharacterBody3D + +@export var camera: Camera3D + +@export var SPEED = 4.0 +const JUMP_VELOCITY = 4.5 +const MOUSE_SENSITIVITY = 0.004 + +func _ready() -> void: + assert(camera != null, "Forgot to set camera in editor") + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +## Implements [member Portal3D.ON_TELEPORT_CALLBACK] +func on_teleport(portal: Portal3D) -> void: + pass + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseMotion: + if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + rotate_y(-event.screen_relative.x * MOUSE_SENSITIVITY) + camera.rotate_x(-event.screen_relative.y * MOUSE_SENSITIVITY) + camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-80), deg_to_rad(80)) + +func _physics_process(delta: float) -> void: + var right: Vector3 = (global_transform.basis.x * Vector3(1, 0, 1)).normalized() + var forward: Vector3 = (-global_transform.basis.z * Vector3(1, 0, 1)).normalized() + var has_input = false + + velocity.x = 0 + velocity.z = 0 + + if Input.is_key_pressed(KEY_LEFT) or Input.is_key_pressed(KEY_A): + has_input = true + velocity -= right + if Input.is_key_pressed(KEY_RIGHT) or Input.is_key_pressed(KEY_D): + has_input = true + velocity += right + if Input.is_key_pressed(KEY_UP) or Input.is_key_pressed(KEY_W): + has_input = true + velocity += forward + if Input.is_key_pressed(KEY_DOWN) or Input.is_key_pressed(KEY_S): + has_input = true + velocity -= forward + + if has_input: + var normalized_horizontal_velocity = Vector2(velocity.x, velocity.z).normalized() + velocity.x = normalized_horizontal_velocity.x * SPEED + velocity.z = normalized_horizontal_velocity.y * SPEED + + if not is_on_floor(): + velocity += get_gravity() * delta + + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + move_and_slide() diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..cdbb50d --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://d2crarvkhd45r