├── .github └── FUNDING.yml └── addons └── qodot ├── example_scenes ├── 0-visuals │ ├── 0-structural-geometry │ │ ├── 0-structural-geometry.map │ │ ├── 0-structural-geometry.map.import │ │ └── 0-structural-geometry.tscn │ ├── 1-textures │ │ ├── 1-textures.map │ │ ├── 1-textures.map.import │ │ └── 1-textures.tscn │ ├── 2-materials │ │ ├── 2-materials.map │ │ ├── 2-materials.map.import │ │ └── 2-materials.tscn │ ├── 3-auto-pbr │ │ ├── 3-auto-pbr.map │ │ ├── 3-auto-pbr.map.import │ │ └── 3-auto-pbr.tscn │ ├── 4-special-textures │ │ ├── 4-special-textures.map │ │ ├── 4-special-textures.map.import │ │ └── 4-special-textures.tscn │ └── 5-baked-lighting │ │ ├── 5-0-baked-gi.tscn │ │ ├── 5-1-baked-lightmaps.tscn │ │ ├── 5-baked-lighting.map │ │ ├── 5-baked-lighting.map.import │ │ ├── LightMap.png │ │ └── LightMap.png.import ├── 1-interactivity │ ├── 0-point-entities │ │ ├── 0-point-entities.map │ │ ├── 0-point-entities.map.import │ │ └── 0-point-entities.tscn │ ├── 1-brush-entities │ │ ├── 1-brush-entities.map │ │ ├── 1-brush-entities.map.import │ │ └── 1-brush-entities.tscn │ ├── 2-worldspawn-layers │ │ ├── 2-worldspawn-layers.map │ │ ├── 2-worldspawn-layers.map.import │ │ └── 2-worldspawn-layers.tscn │ ├── 3-basic-signal-wiring │ │ ├── 3-basic-signal-wiring.map │ │ ├── 3-basic-signal-wiring.map.import │ │ └── 3-basic-signal-wiring.tscn │ └── 4-advanced-signal-wiring │ │ ├── 4-advanced-signal-wiring.map │ │ ├── 4-advanced-signal-wiring.map.import │ │ └── 4-advanced-signal-wiring.tscn └── 2-miscallaneous │ ├── 0-trenchbroom-group-hierarchy │ ├── 0-trenchbroom-group-hierarchy.map │ ├── 0-trenchbroom-group-hierarchy.map.import │ └── 0-trenchbroom-group-hierarchy.tscn │ └── 1-runtime-map-building │ ├── 1-runtime-map-building.map │ ├── 1-runtime-map-building.map.import │ ├── 1-runtime-map-building.tscn │ └── orbit_arm.gd ├── game_definitions ├── fgd │ ├── base_classes │ │ ├── light_base_class.tres │ │ ├── target_base_class.tres │ │ └── targetname_base_class.tres │ ├── point_classes │ │ ├── light.gd │ │ ├── light_point_class.tres │ │ ├── physics_ball.gd │ │ ├── physics_ball.tscn │ │ ├── physics_ball_point_class.tres │ │ ├── receiver_point_class.tres │ │ └── signal_point_class.tres │ ├── qodot_fgd.tres │ └── solid_classes │ │ ├── button.gd │ │ ├── button_solid_class.tres │ │ ├── detail_solid_class.tres │ │ ├── func_group_solid_class.tres │ │ ├── group_solid_class.tres │ │ ├── illusionary_solid_class.tres │ │ ├── mover.gd │ │ ├── mover_solid_class.tres │ │ ├── physics.gd │ │ ├── physics_solid_class.tres │ │ ├── rotate.gd │ │ ├── rotate_solid_class.tres │ │ ├── trigger.gd │ │ ├── trigger_solid_class.tres │ │ ├── wall_solid_class.tres │ │ └── worldspawn_solid_class.tres ├── trenchbroom │ ├── brush_tags │ │ ├── detail_tag.tres │ │ └── trigger_tag.tres │ ├── face_tags │ │ ├── clip_tag.tres │ │ └── skip_tag.tres │ ├── qodot_trenchbroom_config_file.tres │ └── qodot_trenchbroom_config_folder.tres └── worldspawn_layers │ ├── liquid.gd │ └── liquid │ ├── lava.gd │ ├── lava.tres │ ├── slime.gd │ ├── slime.tres │ ├── water.gd │ └── water.tres ├── icon.png ├── icon.png.import ├── icons ├── icon_qodot_node.svg ├── icon_qodot_node.svg.import ├── icon_qodot_spatial.svg └── icon_qodot_spatial.svg.import ├── palette.lmp ├── palette.lmp.import ├── plugin.cfg ├── src ├── import_plugins │ ├── quake_map_import_plugin.gd │ ├── quake_palette_import_plugin.gd │ └── quake_wad_import_plugin.gd ├── nodes │ ├── qodot_entity.gd │ ├── qodot_map.gd │ └── qodot_spatial.gd ├── qodot_plugin.gd ├── resources │ ├── game-definitions │ │ ├── fgd │ │ │ ├── qodot_fgd_base_class.gd │ │ │ ├── qodot_fgd_class.gd │ │ │ ├── qodot_fgd_file.gd │ │ │ ├── qodot_fgd_point_class.gd │ │ │ └── qodot_fgd_solid_class.gd │ │ └── trenchbroom │ │ │ ├── trenchbroom_face_attrib.gd │ │ │ ├── trenchbroom_game_config_file.gd │ │ │ ├── trenchbroom_game_config_folder.gd │ │ │ └── trenchbroom_tag.gd │ ├── quake_map_file.gd │ ├── quake_palette_file.gd │ ├── quake_wad_file.gd │ └── worldspawn_layer.gd └── util │ ├── qodot_dependencies.gd │ ├── qodot_texture_loader.gd │ └── qodot_util.gd └── textures ├── base ├── checkerboard.png ├── checkerboard.png.import ├── grid.png ├── grid.png.import ├── uv_test.png └── uv_test.png.import ├── layers ├── lava.png ├── lava.png.import ├── lava.tres ├── slime.png ├── slime.png.import ├── slime.tres ├── water.png ├── water.png.import └── water.tres ├── materials ├── checkerboard_material.png ├── checkerboard_material.png.import ├── checkerboard_material.tres ├── grid_material.png ├── grid_material.png.import ├── grid_material.tres ├── uv_test_material.png ├── uv_test_material.png.import └── uv_test_material.tres ├── orrery ├── metal.png ├── metal.png.import ├── metal.tres ├── planet.png ├── planet.png.import ├── planet.tres ├── sun.png ├── sun.png.import └── sun.tres ├── pbr ├── military-panel.png ├── military-panel.png.import └── military-panel │ ├── military-panel_ao.png │ ├── military-panel_ao.png.import │ ├── military-panel_depth.png │ ├── military-panel_depth.png.import │ ├── military-panel_emissive.png │ ├── military-panel_emissive.png.import │ ├── military-panel_metallic.png │ ├── military-panel_metallic.png.import │ ├── military-panel_normal.png │ ├── military-panel_normal.png.import │ ├── military-panel_roughness.png │ └── military-panel_roughness.png.import ├── shaders ├── tangent-test.png ├── tangent-test.png.import └── tangent-test.tres └── special ├── clip.png ├── clip.png.import ├── skip.png └── skip.png.import /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: shifty_studio 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=D8FJ3RX3WSQJS&source=url'] 13 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/0-structural-geometry/0-structural-geometry.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/0-structural-geometry.map-0f01126fbea3af47c289c27a710025f3.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/0-structural-geometry/0-structural-geometry.map" 10 | dest_files=[ "res://.import/0-structural-geometry.map-0f01126fbea3af47c289c27a710025f3.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/1-textures/1-textures.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/1-textures.map-5749e8464adf648f34c97742f003fc76.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/1-textures/1-textures.map" 10 | dest_files=[ "res://.import/1-textures.map-5749e8464adf648f34c97742f003fc76.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/2-materials/2-materials.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/2-materials.map-f4bbb5058d219dd4a800206b18188b0e.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/2-materials/2-materials.map" 10 | dest_files=[ "res://.import/2-materials.map-f4bbb5058d219dd4a800206b18188b0e.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/3-auto-pbr/3-auto-pbr.map: -------------------------------------------------------------------------------- 1 | // Game: Qodot 2 | // Format: Valve 3 | // entity 0 4 | { 5 | "classname" "worldspawn" 6 | "mapversion" "220" 7 | "_tb_textures" "textures/pbr;textures/special" 8 | // brush 0 9 | { 10 | ( -64 -64 -160 ) ( -64 -63 -160 ) ( -64 -64 -159 ) pbr/military-panel [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.25 0.25 11 | ( -64 -64 -160 ) ( -64 -64 -159 ) ( -63 -64 -160 ) pbr/military-panel [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.25 0.25 12 | ( -64 -64 -64 ) ( -63 -64 -64 ) ( -64 -63 -64 ) pbr/military-panel [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.25 0.25 13 | ( 64 64 64 ) ( 64 65 64 ) ( 65 64 64 ) pbr/military-panel [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 14 | ( 64 64 64 ) ( 65 64 64 ) ( 64 64 65 ) pbr/military-panel [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 15 | ( 64 64 64 ) ( 64 64 65 ) ( 64 65 64 ) pbr/military-panel [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/3-auto-pbr/3-auto-pbr.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/3-auto-pbr.map-1169beb6b62e21c8b5871638a8bbf505.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/3-auto-pbr/3-auto-pbr.map" 10 | dest_files=[ "res://.import/3-auto-pbr.map-1169beb6b62e21c8b5871638a8bbf505.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/3-auto-pbr/3-auto-pbr.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=15 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/nodes/qodot_map.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/qodot_fgd.tres" type="Resource" id=2] 5 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel/military-panel_depth.png" type="Texture" id=3] 6 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel/military-panel_metallic.png" type="Texture" id=4] 7 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel/military-panel_normal.png" type="Texture" id=5] 8 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel/military-panel_roughness.png" type="Texture" id=6] 9 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel/military-panel_ao.png" type="Texture" id=7] 10 | [ext_resource path="res://addons/qodot/textures/pbr/military-panel.png" type="Texture" id=8] 11 | 12 | [sub_resource type="ProceduralSky" id=1] 13 | sun_latitude = 30.0 14 | sun_longitude = -60.0 15 | 16 | [sub_resource type="Environment" id=2] 17 | background_mode = 2 18 | background_sky = SubResource( 1 ) 19 | 20 | [sub_resource type="SpatialMaterial" id=3] 21 | 22 | [sub_resource type="SpatialMaterial" id=4] 23 | albedo_texture = ExtResource( 8 ) 24 | metallic_texture = ExtResource( 4 ) 25 | roughness_texture = ExtResource( 6 ) 26 | normal_enabled = true 27 | normal_scale = 1.0 28 | normal_texture = ExtResource( 5 ) 29 | ao_enabled = true 30 | ao_light_affect = 0.0 31 | ao_texture = ExtResource( 7 ) 32 | ao_on_uv2 = false 33 | ao_texture_channel = 0 34 | depth_enabled = true 35 | depth_scale = 0.05 36 | depth_deep_parallax = false 37 | depth_flip_tangent = false 38 | depth_flip_binormal = false 39 | depth_texture = ExtResource( 3 ) 40 | 41 | [sub_resource type="ArrayMesh" id=5] 42 | surfaces/0 = { 43 | "aabb": AABB( -4, -4, -4, 8, 8.00001, 8 ), 44 | "array_data": PoolByteArray( 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 129, 0, 129, 0, 0, 127, 0, 56, 0, 184, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 129, 0, 129, 0, 0, 127, 0, 56, 0, 56, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 129, 0, 129, 0, 0, 127, 0, 184, 0, 56, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 129, 0, 129, 0, 0, 127, 0, 184, 0, 184, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 192, 129, 0, 0, 0, 0, 0, 127, 127, 0, 184, 0, 184, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 64, 129, 0, 0, 0, 0, 0, 127, 127, 0, 56, 0, 184, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 64, 129, 0, 0, 0, 0, 0, 127, 127, 0, 56, 0, 56, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 192, 129, 0, 0, 0, 0, 0, 127, 127, 0, 184, 0, 56, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 192, 0, 129, 0, 0, 0, 0, 129, 127, 0, 56, 0, 184, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 192, 0, 129, 0, 0, 0, 0, 129, 127, 0, 56, 0, 56, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 64, 0, 129, 0, 0, 0, 0, 129, 127, 0, 184, 0, 56, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 64, 0, 129, 0, 0, 0, 0, 129, 127, 0, 184, 0, 184, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 192, 0, 127, 0, 0, 0, 0, 127, 127, 0, 184, 0, 184, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 64, 0, 127, 0, 0, 0, 0, 127, 127, 0, 56, 0, 184, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 64, 0, 127, 0, 0, 0, 0, 127, 127, 0, 56, 0, 56, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 192, 0, 127, 0, 0, 0, 0, 127, 127, 0, 184, 0, 56, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 192, 127, 0, 0, 0, 0, 0, 129, 127, 0, 56, 0, 184, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 192, 127, 0, 0, 0, 0, 0, 129, 127, 0, 56, 0, 56, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 64, 127, 0, 0, 0, 0, 0, 129, 127, 0, 184, 0, 56, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 64, 127, 0, 0, 0, 0, 0, 129, 127, 0, 184, 0, 184, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 127, 0, 127, 0, 0, 127, 0, 184, 0, 184, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 128, 64, 0, 0, 127, 0, 127, 0, 0, 127, 0, 56, 0, 184, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 127, 0, 127, 0, 0, 127, 0, 56, 0, 56, 0, 0, 128, 192, 0, 0, 128, 192, 0, 0, 128, 64, 0, 0, 127, 0, 127, 0, 0, 127, 0, 184, 0, 56 ), 45 | "array_index_data": PoolByteArray( 0, 0, 1, 0, 2, 0, 0, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 4, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 8, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 16, 0, 18, 0, 19, 0, 20, 0, 21, 0, 22, 0, 20, 0, 22, 0, 23, 0 ), 46 | "blend_shape_data": [ ], 47 | "format": 97559, 48 | "index_count": 36, 49 | "material": SubResource( 4 ), 50 | "primitive": 4, 51 | "skeleton_aabb": [ ], 52 | "vertex_count": 24 53 | } 54 | 55 | [sub_resource type="ConvexPolygonShape" id=6] 56 | points = PoolVector3Array( -4, 4, -4, -4, -4, -4, 4, -4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 4, -4, 4, 4, 4, 4 ) 57 | 58 | [node name="AutoPBR" type="Spatial"] 59 | 60 | [node name="README" type="Node" parent="."] 61 | __meta__ = { 62 | "_editor_description_": "This scene introduces automatic PBR application. 63 | 64 | The standard `SpatialMaterial` used for rendering in Godot supports much more than the basic Albedo channel specified in a map file. Qodot accounts for this by allowing for the automatic application of the normal, metallic, roughness, emission, ambient occlusion and depth texture channels. 65 | 66 | These can be enabled by creating a folder with the same name as your texture, and storing it alongside it in the filesystem. Textures with specific prefixes stored in this folder will be treated as custom texture channels to be applied alongside their parent texture. 67 | 68 | The default prefixes are as follows: 69 | Normal - texture-name_normal.extension 70 | Metallic - texture-name_metallic.extension 71 | Roughness - texture-name_roughness.extension 72 | Emission - texture-name_emission.extension 73 | Ambient Occlusion - texture-name_ao.extension 74 | Depth - texture-name_depth.extension 75 | 76 | These can be modified in the `Qodot/Textures` category of the Project Settings window, and are stored in Godot's standard string matching format. For example, the default normal pattern is `%s_normal.%s`, and will have the first %s replaced with the texture name, and the second %s replaced with the texture extension specified on the QodotMap node." 77 | } 78 | 79 | [node name="WorldEnvironment" type="WorldEnvironment" parent="."] 80 | environment = SubResource( 2 ) 81 | 82 | [node name="DirectionalLight" type="DirectionalLight" parent="."] 83 | transform = Transform( -0.5, 0.612372, -0.612373, 0, 0.707107, 0.707106, 0.866025, 0.353553, -0.353554, 0, 8, 0 ) 84 | shadow_enabled = true 85 | 86 | [node name="QodotMap" type="Spatial" parent="."] 87 | script = ExtResource( 1 ) 88 | map_file = "P:/Personal/Godot/Qodot/qodot-example/addons/qodot/example_scenes/0-visuals/3-auto-pbr/3-auto-pbr.map" 89 | inverse_scale_factor = 16.0 90 | entity_fgd = ExtResource( 2 ) 91 | base_texture_dir = "res://addons/qodot/textures" 92 | texture_file_extension = "png" 93 | worldspawn_layers = [ ] 94 | brush_clip_texture = "special/clip" 95 | face_skip_texture = "special/skip" 96 | texture_wads = [ ] 97 | material_file_extension = "tres" 98 | default_material = SubResource( 3 ) 99 | uv_unwrap_texel_size = 1.0 100 | print_profiling_data = false 101 | use_trenchbroom_group_hierarchy = false 102 | tree_attach_batch_size = 16 103 | set_owner_batch_size = 16 104 | 105 | [node name="entity_0_worldspawn" type="StaticBody" parent="QodotMap"] 106 | 107 | [node name="entity_0_mesh_instance" type="MeshInstance" parent="QodotMap/entity_0_worldspawn"] 108 | use_in_baked_light = true 109 | mesh = SubResource( 5 ) 110 | material/0 = null 111 | 112 | [node name="entity_0_brush_0_collision_shape" type="CollisionShape" parent="QodotMap/entity_0_worldspawn"] 113 | shape = SubResource( 6 ) 114 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/4-special-textures/4-special-textures.map: -------------------------------------------------------------------------------- 1 | // Game: Qodot 2 | // Format: Valve 3 | // entity 0 4 | { 5 | "classname" "worldspawn" 6 | "mapversion" "220" 7 | "_tb_textures" "textures/base;textures/shaders;textures/special" 8 | // brush 0 9 | { 10 | ( -240 -64 -16 ) ( -240 -63 -16 ) ( -240 -64 -15 ) base/grid [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 11 | ( -64 -192 -16 ) ( -64 -192 -15 ) ( -63 -192 -16 ) base/grid [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 12 | ( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 13 | ( 64 64 0 ) ( 64 65 0 ) ( 65 64 0 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 14 | ( 64 192 16 ) ( 65 192 16 ) ( 64 192 17 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 15 | ( 256 64 16 ) ( 256 64 17 ) ( 256 65 16 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 16 | } 17 | // brush 1 18 | { 19 | ( 96 32 176 ) ( 96 32 160 ) ( 96 160 160 ) base/checkerboard [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 20 | ( -128 -32 0 ) ( -128 -32 1 ) ( -127 -32 0 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 21 | ( -128 -32 0 ) ( -127 -32 0 ) ( -128 -31 0 ) base/checkerboard [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 22 | ( 128 32 224 ) ( 128 33 224 ) ( 129 32 224 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 23 | ( 128 32 16 ) ( 129 32 16 ) ( 128 32 17 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 24 | ( 128 32 16 ) ( 128 32 17 ) ( 128 33 16 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 25 | } 26 | // brush 2 27 | { 28 | ( -128 -32 0 ) ( -128 -31 0 ) ( -128 -32 1 ) base/checkerboard [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 29 | ( -128 -32 0 ) ( -128 -32 1 ) ( -127 -32 0 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 30 | ( -128 -32 0 ) ( -127 -32 0 ) ( -128 -31 0 ) base/checkerboard [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 31 | ( 128 32 224 ) ( 128 33 224 ) ( 129 32 224 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 32 | ( 128 32 16 ) ( 129 32 16 ) ( 128 32 17 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 33 | ( -96 32 176 ) ( -96 160 160 ) ( -96 32 160 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 34 | } 35 | // brush 3 36 | { 37 | ( -96 32 176 ) ( -96 32 160 ) ( -96 160 160 ) base/checkerboard [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 38 | ( -128 -32 0 ) ( -128 -32 1 ) ( -127 -32 0 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 39 | ( -128 -32 0 ) ( -127 -32 0 ) ( -128 -31 0 ) base/checkerboard [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 40 | ( 16 32 32 ) ( -16 32 32 ) ( -16 160 32 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 41 | ( 128 32 16 ) ( 129 32 16 ) ( 128 32 17 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 42 | ( 96 32 176 ) ( 96 160 160 ) ( 96 32 160 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 43 | } 44 | // brush 4 45 | { 46 | ( -48 32 160 ) ( -48 32 144 ) ( -48 160 144 ) base/uv_test [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 47 | ( -128 -48 -16 ) ( -128 -48 -15 ) ( -127 -48 -16 ) special/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 48 | ( 16 32 64 ) ( -16 160 64 ) ( -16 32 64 ) base/uv_test [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 49 | ( -16 32 160 ) ( -32 32 160 ) ( -32 160 160 ) base/uv_test [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 50 | ( 128 48 0 ) ( 129 48 0 ) ( 128 48 1 ) special/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 51 | ( 48 32 160 ) ( 48 160 144 ) ( 48 32 144 ) base/uv_test [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 52 | } 53 | // brush 5 54 | { 55 | ( -96 32 176 ) ( -96 32 160 ) ( -96 160 160 ) base/checkerboard [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 56 | ( -128 -32 0 ) ( -128 -32 1 ) ( -127 -32 0 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 57 | ( -16 32 192 ) ( -32 160 192 ) ( -32 32 192 ) base/checkerboard [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 58 | ( 128 32 224 ) ( 128 33 224 ) ( 129 32 224 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 59 | ( 128 32 16 ) ( 129 32 16 ) ( 128 32 17 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 60 | ( 96 32 176 ) ( 96 160 160 ) ( 96 32 160 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 61 | } 62 | } 63 | // entity 1 64 | { 65 | "classname" "group" 66 | // brush 0 67 | { 68 | ( -224 -192 0 ) ( -224 -191 0 ) ( -224 -192 1 ) special/clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 69 | ( -240 -192 0 ) ( -240 -192 1 ) ( -239 -192 0 ) special/clip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 70 | ( -240 -192 0 ) ( -239 -192 0 ) ( -240 -191 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 71 | ( 240 -112 256 ) ( 240 -111 256 ) ( 241 -112 256 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 72 | ( 240 -176 192 ) ( 241 -176 192 ) ( 240 -176 193 ) special/clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 73 | ( 240 -112 192 ) ( 240 -112 193 ) ( 240 -111 192 ) special/clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 74 | } 75 | // brush 1 76 | { 77 | ( -240 256 192 ) ( -240 257 192 ) ( -240 256 193 ) special/clip [ -2.22045e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 78 | ( -224 -176 0 ) ( -225 -176 0 ) ( -224 -176 1 ) special/clip [ -1 -2.22045e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 79 | ( -224 -224 0 ) ( -224 -223 0 ) ( -225 -224 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 80 | ( -304 256 256 ) ( -305 256 256 ) ( -304 257 256 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 81 | ( -304 192 192 ) ( -304 192 193 ) ( -305 192 192 ) special/clip [ 1 2.22045e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 82 | ( -224 -224 0 ) ( -224 -224 1 ) ( -224 -223 0 ) special/clip [ 2.22045e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 83 | } 84 | // brush 2 85 | { 86 | ( -224 -64 256 ) ( -224 -63 256 ) ( -224 -64 257 ) special/clip [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 87 | ( -64 -176 256 ) ( -64 -176 257 ) ( -63 -176 256 ) special/clip [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 88 | ( -64 -64 256 ) ( -63 -64 256 ) ( -64 -63 256 ) special/clip [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 89 | ( 64 64 272 ) ( 64 65 272 ) ( 65 64 272 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 90 | ( 64 192 288 ) ( 65 192 288 ) ( 64 192 289 ) special/clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 91 | ( 240 64 288 ) ( 240 64 289 ) ( 240 65 288 ) special/clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 92 | } 93 | // brush 3 94 | { 95 | ( -224 192 0 ) ( -224 193 0 ) ( -224 192 1 ) special/clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 96 | ( -240 192 0 ) ( -240 192 1 ) ( -239 192 0 ) special/clip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 97 | ( -240 192 0 ) ( -239 192 0 ) ( -240 193 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 98 | ( 240 272 256 ) ( 240 273 256 ) ( 241 272 256 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 99 | ( 240 208 192 ) ( 241 208 192 ) ( 240 208 193 ) special/clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 100 | ( 240 272 192 ) ( 240 272 193 ) ( 240 273 192 ) special/clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 101 | } 102 | // brush 4 103 | { 104 | ( 240 256 192 ) ( 240 257 192 ) ( 240 256 193 ) special/clip [ -2.22045e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 105 | ( 256 -176 0 ) ( 255 -176 0 ) ( 256 -176 1 ) special/clip [ -1 -2.22045e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 106 | ( 256 -224 0 ) ( 256 -223 0 ) ( 255 -224 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 107 | ( 176 256 256 ) ( 175 256 256 ) ( 176 257 256 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 108 | ( 176 192 192 ) ( 176 192 193 ) ( 175 192 192 ) special/clip [ 1 2.22045e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 109 | ( 256 -224 0 ) ( 256 -224 1 ) ( 256 -223 0 ) special/clip [ 2.22045e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/4-special-textures/4-special-textures.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/4-special-textures.map-50c1b2d972025ac23ec7052bbdd15d53.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/4-special-textures/4-special-textures.map" 10 | dest_files=[ "res://.import/4-special-textures.map-50c1b2d972025ac23ec7052bbdd15d53.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/5-baked-lighting/5-baked-lighting.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/5-baked-lighting.map-b281afb7cccc41782b7294fcabab6165.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/0-visuals/5-baked-lighting/5-baked-lighting.map" 10 | dest_files=[ "res://.import/5-baked-lighting.map-b281afb7cccc41782b7294fcabab6165.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/5-baked-lighting/LightMap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/example_scenes/0-visuals/5-baked-lighting/LightMap.png -------------------------------------------------------------------------------- /addons/qodot/example_scenes/0-visuals/5-baked-lighting/LightMap.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/LightMap.png-1e5f86e1725ae01e697c44b20949e43a.s3tc.stex" 6 | path.etc2="res://.import/LightMap.png-1e5f86e1725ae01e697c44b20949e43a.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/example_scenes/0-visuals/5-baked-lighting/LightMap.png" 15 | dest_files=[ "res://.import/LightMap.png-1e5f86e1725ae01e697c44b20949e43a.s3tc.stex", "res://.import/LightMap.png-1e5f86e1725ae01e697c44b20949e43a.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=0.7 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=false 25 | flags/filter=true 26 | flags/mipmaps=false 27 | flags/anisotropic=false 28 | flags/srgb=true 29 | process/fix_alpha_border=true 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/0-point-entities/0-point-entities.map: -------------------------------------------------------------------------------- 1 | // Game: Qodot 2 | // Format: Valve 3 | // entity 0 4 | { 5 | "classname" "worldspawn" 6 | "mapversion" "220" 7 | "_tb_textures" "textures/base;textures/shaders;textures/special" 8 | "_tb_def" "builtin:Example.fgd" 9 | // brush 0 10 | { 11 | ( -336 -64 -16 ) ( -336 -63 -16 ) ( -336 -64 -15 ) base/grid [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 12 | ( -64 -192 -16 ) ( -64 -192 -15 ) ( -63 -192 -16 ) base/grid [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 13 | ( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 14 | ( 64 64 0 ) ( 64 65 0 ) ( 65 64 0 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 15 | ( 64 192 16 ) ( 65 192 16 ) ( 64 192 17 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 16 | ( 384 64 16 ) ( 384 64 17 ) ( 384 65 16 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 17 | } 18 | // brush 1 19 | { 20 | ( -320 -176 0 ) ( -320 -175 0 ) ( -320 -176 1 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 21 | ( -320 -176 0 ) ( -320 -176 1 ) ( -319 -176 0 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 22 | ( -320 -176 0 ) ( -319 -176 0 ) ( -320 -175 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 23 | ( -288 176 256 ) ( -288 177 256 ) ( -287 176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 24 | ( -288 176 224 ) ( -287 176 224 ) ( -288 176 225 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 25 | ( -288 176 224 ) ( -288 176 225 ) ( -288 177 224 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 26 | } 27 | // brush 2 28 | { 29 | ( 336 -176 0 ) ( 336 -175 0 ) ( 336 -176 1 ) base/checkerboard [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 30 | ( 336 -176 0 ) ( 336 -176 1 ) ( 337 -176 0 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 31 | ( 336 -176 0 ) ( 337 -176 0 ) ( 336 -175 0 ) base/checkerboard [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 32 | ( 368 176 256 ) ( 368 177 256 ) ( 369 176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 33 | ( 368 176 16 ) ( 369 176 16 ) ( 368 176 17 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 34 | ( 368 176 16 ) ( 368 176 17 ) ( 368 177 16 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 35 | } 36 | // brush 3 37 | { 38 | ( -320 -192 0 ) ( -320 -191 0 ) ( -320 -192 1 ) special/clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 39 | ( -320 -192 0 ) ( -320 -192 1 ) ( -319 -192 0 ) special/clip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 40 | ( -320 -192 0 ) ( -319 -192 0 ) ( -320 -191 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 41 | ( 320 -112 576 ) ( 320 -111 576 ) ( 321 -112 576 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 42 | ( 320 -176 256 ) ( 321 -176 256 ) ( 320 -176 257 ) special/clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 43 | ( 368 -112 256 ) ( 368 -112 257 ) ( 368 -111 256 ) special/clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 44 | } 45 | // brush 4 46 | { 47 | ( -320 176 0 ) ( -320 177 0 ) ( -320 176 1 ) special/clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 48 | ( -320 176 0 ) ( -320 176 1 ) ( -319 176 0 ) special/clip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 49 | ( -320 176 0 ) ( -319 176 0 ) ( -320 177 0 ) special/clip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 50 | ( 320 256 576 ) ( 320 257 576 ) ( 321 256 576 ) special/clip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 51 | ( 320 192 256 ) ( 321 192 256 ) ( 320 192 257 ) special/clip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 52 | ( 368 256 256 ) ( 368 256 257 ) ( 368 257 256 ) special/clip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 53 | } 54 | } 55 | // entity 1 56 | { 57 | "classname" "physics_ball" 58 | "origin" "-273 136 520" 59 | "mass" "0.5" 60 | } 61 | // entity 2 62 | { 63 | "classname" "group" 64 | // brush 0 65 | { 66 | ( -128 176 16 ) ( -288 176 0 ) ( -288 304 0 ) base/checkerboard [ 0.995037 -0 0.0995037 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 67 | ( -32 -176 256 ) ( -32 -176 255 ) ( -33 -176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 68 | ( -288 176 0 ) ( -288 177 0 ) ( -289 176 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 69 | ( -288 176 0 ) ( -289 176 0 ) ( -288 176 -1 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 70 | ( -64 176 0 ) ( -128 176 16 ) ( -128 304 16 ) base/checkerboard [ 0.970143 0 -0.242536 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 71 | } 72 | // brush 1 73 | { 74 | ( -192 176 48 ) ( -288 176 0 ) ( -288 304 0 ) base/checkerboard [ 0.894427 -0 0.447214 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 75 | ( -32 -176 256 ) ( -32 -176 255 ) ( -33 -176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 76 | ( -288 176 0 ) ( -289 176 0 ) ( -288 176 -1 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 77 | ( -128 176 16 ) ( -288 304 0 ) ( -288 176 0 ) base/checkerboard [ -0.995037 0 -0.0995037 0 ] [ 0 -1 -0 0 ] 0 0.125 0.125 78 | ( -128 176 16 ) ( -192 176 48 ) ( -192 304 48 ) base/checkerboard [ 0.894427 0 -0.447214 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 79 | } 80 | // brush 2 81 | { 82 | ( -240 176 96 ) ( -288 176 0 ) ( -288 304 0 ) base/checkerboard [ 0 -1 0 0 ] [ -0.447214 -0 -0.894427 0 ] 0 0.125 0.125 83 | ( -32 -176 256 ) ( -32 -176 255 ) ( -33 -176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 84 | ( -288 176 0 ) ( -289 176 0 ) ( -288 176 -1 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 85 | ( -192 176 48 ) ( -288 304 0 ) ( -288 176 0 ) base/checkerboard [ -0.894427 0 -0.447214 0 ] [ 0 -1 -0 0 ] 0 0.125 0.125 86 | ( -192 176 48 ) ( -240 176 96 ) ( -240 304 96 ) base/checkerboard [ 0.707107 0 -0.707107 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 87 | } 88 | // brush 3 89 | { 90 | ( -272 176 160 ) ( -288 176 0 ) ( -288 304 0 ) base/checkerboard [ 0 -1 0 0 ] [ -0.0995037 -0 -0.995037 0 ] 0 0.125 0.125 91 | ( -32 -176 256 ) ( -32 -176 255 ) ( -33 -176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 92 | ( -288 176 0 ) ( -289 176 0 ) ( -288 176 -1 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 93 | ( -240 176 96 ) ( -288 304 0 ) ( -288 176 0 ) base/checkerboard [ -0 1 0 0 ] [ -0.447214 0 -0.894427 0 ] 0 0.125 0.125 94 | ( -240 176 96 ) ( -272 176 160 ) ( -272 304 160 ) base/checkerboard [ 0 1 0 0 ] [ 0.447214 0 -0.894427 0 ] 0 0.125 0.125 95 | } 96 | // brush 4 97 | { 98 | ( -288 176 0 ) ( -288 176 -1 ) ( -288 177 0 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 99 | ( -32 -176 256 ) ( -32 -176 255 ) ( -33 -176 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 100 | ( -288 176 0 ) ( -289 176 0 ) ( -288 176 -1 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 101 | ( -272 176 160 ) ( -288 176 224 ) ( -288 304 224 ) base/checkerboard [ 0 1 0 0 ] [ 0.242536 0 -0.970143 0 ] 0 0.125 0.125 102 | ( -272 176 160 ) ( -288 304 0 ) ( -288 176 0 ) base/checkerboard [ -0 1 0 0 ] [ -0.0995037 0 -0.995037 0 ] 0 0.125 0.125 103 | } 104 | } 105 | // entity 3 106 | { 107 | "classname" "group" 108 | // brush 0 109 | { 110 | ( 112 176 0 ) ( 176 304 16 ) ( 176 176 16 ) base/checkerboard [ 0.970143 -0 0.242536 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 111 | ( 80 -176 256 ) ( 81 -176 256 ) ( 80 -176 255 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 112 | ( 336 176 0 ) ( 337 176 0 ) ( 336 177 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 113 | ( 336 176 0 ) ( 336 176 -1 ) ( 337 176 0 ) base/checkerboard [ -1 -0 0 0 ] [ -0 0 -1 0 ] 0 0.125 0.125 114 | ( 176 176 16 ) ( 336 304 0 ) ( 336 176 0 ) base/checkerboard [ 0.995037 0 -0.0995037 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 115 | } 116 | // brush 1 117 | { 118 | ( 176 176 16 ) ( 240 304 48 ) ( 240 176 48 ) base/checkerboard [ 0.894427 -0 0.447214 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 119 | ( 176 176 16 ) ( 336 176 0 ) ( 336 304 0 ) base/checkerboard [ -0.995037 0 0.0995037 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 120 | ( 80 -176 256 ) ( 81 -176 256 ) ( 80 -176 255 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 121 | ( 336 176 0 ) ( 336 176 -1 ) ( 337 176 0 ) base/checkerboard [ -1 -0 0 0 ] [ -0 0 -1 0 ] 0 0.125 0.125 122 | ( 240 176 48 ) ( 336 304 0 ) ( 336 176 0 ) base/checkerboard [ 0.894427 0 -0.447214 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 123 | } 124 | // brush 2 125 | { 126 | ( 240 176 48 ) ( 288 304 96 ) ( 288 176 96 ) base/checkerboard [ 0.707107 -0 0.707107 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 127 | ( 240 176 48 ) ( 336 176 0 ) ( 336 304 0 ) base/checkerboard [ -0.894427 0 0.447214 0 ] [ -0 -1 0 0 ] 0 0.125 0.125 128 | ( 80 -176 256 ) ( 81 -176 256 ) ( 80 -176 255 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 129 | ( 336 176 0 ) ( 336 176 -1 ) ( 337 176 0 ) base/checkerboard [ -1 -0 0 0 ] [ -0 0 -1 0 ] 0 0.125 0.125 130 | ( 288 176 96 ) ( 336 304 0 ) ( 336 176 0 ) base/checkerboard [ 0 1 0 0 ] [ 0.447214 0 -0.894427 0 ] 0 0.125 0.125 131 | } 132 | // brush 3 133 | { 134 | ( 288 176 96 ) ( 336 176 0 ) ( 336 304 0 ) base/checkerboard [ -0 -1 0 0 ] [ 0.447214 -0 -0.894427 0 ] 0 0.125 0.125 135 | ( 288 176 96 ) ( 320 304 160 ) ( 320 176 160 ) base/checkerboard [ 0 -1 0 0 ] [ -0.447214 -0 -0.894427 0 ] 0 0.125 0.125 136 | ( 80 -176 256 ) ( 81 -176 256 ) ( 80 -176 255 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 137 | ( 336 176 0 ) ( 336 176 -1 ) ( 337 176 0 ) base/checkerboard [ -1 -0 0 0 ] [ -0 0 -1 0 ] 0 0.125 0.125 138 | ( 320 176 160 ) ( 336 304 0 ) ( 336 176 0 ) base/checkerboard [ 0 1 0 0 ] [ 0.0995037 0 -0.995037 0 ] 0 0.125 0.125 139 | } 140 | // brush 4 141 | { 142 | ( 320 176 160 ) ( 336 176 0 ) ( 336 304 0 ) base/checkerboard [ -0 -1 0 0 ] [ 0.0995037 -0 -0.995037 0 ] 0 0.125 0.125 143 | ( 320 176 160 ) ( 336 304 224 ) ( 336 176 224 ) base/checkerboard [ 0 -1 0 0 ] [ -0.242536 -0 -0.970143 0 ] 0 0.125 0.125 144 | ( 80 -176 256 ) ( 81 -176 256 ) ( 80 -176 255 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 145 | ( 336 176 0 ) ( 336 176 -1 ) ( 337 176 0 ) base/checkerboard [ -1 -0 0 0 ] [ -0 0 -1 0 ] 0 0.125 0.125 146 | ( 336 176 0 ) ( 336 177 0 ) ( 336 176 -1 ) base/checkerboard [ 0 1 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 147 | } 148 | } 149 | // entity 4 150 | { 151 | "classname" "physics_ball" 152 | "origin" "-273 56 440" 153 | "mass" "0.5" 154 | } 155 | // entity 5 156 | { 157 | "classname" "physics_ball" 158 | "origin" "-273 -40 360" 159 | "mass" "0.5" 160 | } 161 | // entity 6 162 | { 163 | "classname" "physics_ball" 164 | "origin" "-273 -136 280" 165 | "mass" "0.5" 166 | } 167 | // entity 7 168 | { 169 | "classname" "illusionary" 170 | // brush 0 171 | { 172 | ( 1008 96 0 ) ( 1024 256 0 ) ( 1024 256 128 ) special/skip [ -0.0995037 -0.995037 0 0 ] [ 0 0 -1 0 ] 0 1 1 173 | ( 1008 96 0 ) ( 1024 32 128 ) ( 1024 32 0 ) special/skip [ 0.242536 -0.970143 0 0 ] [ 0 0 -1 0 ] 0 1 1 174 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 175 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 176 | ( 1024 256 0 ) ( 1024 256 1 ) ( 1024 257 0 ) special/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 177 | } 178 | // brush 1 179 | { 180 | ( 976 160 0 ) ( 1008 96 128 ) ( 1008 96 0 ) special/skip [ 0.447214 -0.894427 0 0 ] [ 0 0 -1 0 ] 0 1 1 181 | ( 976 160 0 ) ( 1024 256 0 ) ( 1024 256 128 ) special/skip [ -0.447214 -0.894427 0 0 ] [ 0 0 -1 0 ] 0 1 1 182 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 183 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 184 | ( 1008 96 0 ) ( 1024 256 128 ) ( 1024 256 0 ) special/skip [ 0.0995037 0.995037 0 0 ] [ 0 0 -1 0 ] 0 1 1 185 | } 186 | // brush 2 187 | { 188 | ( 928 208 0 ) ( 976 160 128 ) ( 976 160 0 ) special/skip [ 0.707107 -0.707107 0 0 ] [ 0 0 -1 0 ] 0 1 1 189 | ( 928 208 0 ) ( 1024 256 0 ) ( 1024 256 128 ) special/skip [ -0.894427 -0.447214 0 0 ] [ 0 0 -1 0 ] 0 1 1 190 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 191 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 192 | ( 976 160 0 ) ( 1024 256 128 ) ( 1024 256 0 ) special/skip [ 0.447214 0.894427 0 0 ] [ 0 0 -1 0 ] 0 1 1 193 | } 194 | // brush 3 195 | { 196 | ( 864 240 0 ) ( 928 208 128 ) ( 928 208 0 ) special/skip [ 0.894427 -0.447214 0 0 ] [ 0 0 -1 0 ] 0 1 1 197 | ( 864 240 0 ) ( 1024 256 0 ) ( 1024 256 128 ) special/skip [ -0.995037 -0.0995037 0 0 ] [ 0 0 -1 0 ] 0 1 1 198 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 199 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 200 | ( 928 208 0 ) ( 1024 256 128 ) ( 1024 256 0 ) special/skip [ 0.894427 0.447214 0 0 ] [ 0 0 -1 0 ] 0 1 1 201 | } 202 | // brush 4 203 | { 204 | ( 800 256 0 ) ( 864 240 128 ) ( 864 240 0 ) special/skip [ 0.970143 -0.242536 0 0 ] [ 0 0 -1 0 ] 0 1 1 205 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 206 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 207 | ( 1024 256 0 ) ( 1025 256 0 ) ( 1024 256 1 ) special/skip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 208 | ( 864 240 0 ) ( 1024 256 128 ) ( 1024 256 0 ) special/skip [ 0.995037 0.0995037 0 0 ] [ 0 0 -1 0 ] 0 1 1 209 | } 210 | // brush 5 211 | { 212 | ( 768 0 -16 ) ( 768 1 -16 ) ( 768 0 -15 ) special/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 213 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 214 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 215 | ( 1024 256 0 ) ( 1025 256 0 ) ( 1024 256 1 ) special/skip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 216 | ( 800 256 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.124035 0.992278 0 0 ] [ 0 0 -1 0 ] 0 1 1 217 | } 218 | // brush 6 219 | { 220 | ( 800 256 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.124035 -0.992278 0 0 ] [ 0 0 -1 0 ] 0 1 1 221 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 222 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 223 | ( 864 240 -16 ) ( 800 256 112 ) ( 800 256 -16 ) special/skip [ -0.970143 0.242536 0 0 ] [ 0 0 -1 0 ] 0 1 1 224 | ( 864 240 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.371391 0.928477 0 0 ] [ 0 0 -1 0 ] 0 1 1 225 | } 226 | // brush 7 227 | { 228 | ( 864 240 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.371391 -0.928477 0 0 ] [ 0 0 -1 0 ] 0 1 1 229 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 230 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 231 | ( 960 192 -16 ) ( 832 256 112 ) ( 832 256 -16 ) special/skip [ -0.894427 0.447214 0 0 ] [ 0 0 -1 0 ] 0 1 1 232 | ( 928 208 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.609711 0.792624 0 0 ] [ 0 0 -1 0 ] 0 1 1 233 | } 234 | // brush 8 235 | { 236 | ( 928 208 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.609711 -0.792624 0 0 ] [ 0 0 -1 0 ] 0 1 1 237 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 238 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 239 | ( 976 160 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.792624 0.609711 0 0 ] [ 0 0 -1 0 ] 0 1 1 240 | ( 976 160 -16 ) ( 928 208 112 ) ( 928 208 -16 ) special/skip [ -0.707107 0.707107 0 0 ] [ 0 0 -1 0 ] 0 1 1 241 | } 242 | // brush 9 243 | { 244 | ( 976 160 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.792624 -0.609711 0 0 ] [ 0 0 -1 0 ] 0 1 1 245 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 246 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 247 | ( 1008 96 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.928477 0.371391 0 0 ] [ 0 0 -1 0 ] 0 1 1 248 | ( 1024 64 -16 ) ( 960 192 112 ) ( 960 192 -16 ) special/skip [ -0.447214 0.894427 0 0 ] [ 0 0 -1 0 ] 0 1 1 249 | } 250 | // brush 10 251 | { 252 | ( 1008 96 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.928477 -0.371391 0 0 ] [ 0 0 -1 0 ] 0 1 1 253 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 254 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 255 | ( 1024 32 -16 ) ( 768 0 -16 ) ( 768 0 112 ) special/skip [ 0.992278 0.124035 0 0 ] [ 0 0 -1 0 ] 0 1 1 256 | ( 1024 32 -16 ) ( 1008 96 112 ) ( 1008 96 -16 ) special/skip [ -0.242536 0.970143 0 0 ] [ 0 0 -1 0 ] 0 1 1 257 | } 258 | // brush 11 259 | { 260 | ( 1024 32 -16 ) ( 768 0 112 ) ( 768 0 -16 ) special/skip [ -0.992278 -0.124035 0 0 ] [ 0 0 -1 0 ] 0 1 1 261 | ( 768 0 -16 ) ( 768 0 -15 ) ( 769 0 -16 ) special/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 262 | ( 768 0 -16 ) ( 769 0 -16 ) ( 768 1 -16 ) special/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 263 | ( 1024 256 0 ) ( 1024 257 0 ) ( 1025 256 0 ) special/skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 264 | ( 1024 256 0 ) ( 1024 256 1 ) ( 1024 257 0 ) special/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/0-point-entities/0-point-entities.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/0-point-entities.map-4bd5d8e330187d5493da9894b0a743aa.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/1-interactivity/0-point-entities/0-point-entities.map" 10 | dest_files=[ "res://.import/0-point-entities.map-4bd5d8e330187d5493da9894b0a743aa.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/1-brush-entities/1-brush-entities.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/1-brush-entities.map-57d1589b7fcdfd8fed0eb9423518ae87.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/1-interactivity/1-brush-entities/1-brush-entities.map" 10 | dest_files=[ "res://.import/1-brush-entities.map-57d1589b7fcdfd8fed0eb9423518ae87.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/2-worldspawn-layers/2-worldspawn-layers.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/2-worldspawn-layers.map-8a92030124c2d34b3fd7ab9ac55f7895.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/1-interactivity/2-worldspawn-layers/2-worldspawn-layers.map" 10 | dest_files=[ "res://.import/2-worldspawn-layers.map-8a92030124c2d34b3fd7ab9ac55f7895.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/3-basic-signal-wiring/3-basic-signal-wiring.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/3-basic-signal-wiring.map-8fd88c8b2d1f9d089071a4f3978dff0c.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/1-interactivity/3-basic-signal-wiring/3-basic-signal-wiring.map" 10 | dest_files=[ "res://.import/3-basic-signal-wiring.map-8fd88c8b2d1f9d089071a4f3978dff0c.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/4-advanced-signal-wiring/4-advanced-signal-wiring.map: -------------------------------------------------------------------------------- 1 | // Game: Qodot 2 | // Format: Valve 3 | // entity 0 4 | { 5 | "classname" "worldspawn" 6 | "mapversion" "220" 7 | "_tb_textures" "textures/base;textures/layers" 8 | "_tb_def" "builtin:Example.fgd" 9 | // brush 0 10 | { 11 | ( -192 -160 -16 ) ( -192 -159 -16 ) ( -192 -160 -15 ) base/grid [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 12 | ( -64 -816 -16 ) ( -64 -816 -15 ) ( -63 -816 -16 ) base/grid [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 13 | ( -64 -160 -32 ) ( -63 -160 -32 ) ( -64 -159 -32 ) base/grid [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 14 | ( 64 -32 0 ) ( 64 -31 0 ) ( 65 -32 0 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 15 | ( 64 640 16 ) ( 65 640 16 ) ( 64 640 17 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 16 | ( 192 -32 16 ) ( 192 -32 17 ) ( 192 -31 16 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 17 | } 18 | // brush 1 19 | { 20 | ( -112 -96 -16 ) ( -112 -95 -16 ) ( -112 -96 -15 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 21 | ( -64 -704 -16 ) ( -64 -704 -15 ) ( -63 -704 -16 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 22 | ( -64 -96 0 ) ( -63 -96 0 ) ( -64 -95 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 23 | ( 64 -64 64 ) ( 64 -63 64 ) ( 65 -64 64 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 24 | ( 64 -64 64 ) ( 65 -64 64 ) ( 64 -64 65 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 25 | ( 112 -64 64 ) ( 112 -64 65 ) ( 112 -63 64 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 26 | } 27 | // brush 2 28 | { 29 | ( -64 512 288 ) ( -64 512 320 ) ( -64 -64 64 ) base/checkerboard [ 0 -1 0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 30 | ( 64 -64 32 ) ( -64 -64 32 ) ( -64 -64 64 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 31 | ( -64 -64 64 ) ( -64 512 320 ) ( 64 512 320 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0.913812 -0.406138 0 ] 0 0.125 0.125 32 | ( 64 512 288 ) ( -64 512 288 ) ( -64 -64 32 ) base/checkerboard [ -1 0 0 0 ] [ -0 -0.913812 -0.406138 0 ] 0 0.125 0.125 33 | ( 64 512 320 ) ( -64 512 320 ) ( -64 512 288 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 34 | ( 64 512 288 ) ( 64 -64 32 ) ( 64 -64 64 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 35 | } 36 | // brush 3 37 | { 38 | ( -128 512 288 ) ( -128 513 288 ) ( -128 512 289 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 39 | ( -64 512 288 ) ( -64 512 289 ) ( -63 512 288 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 40 | ( -64 512 0 ) ( -63 512 0 ) ( -64 513 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 41 | ( 64 528 256 ) ( 64 529 256 ) ( 65 528 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 42 | ( 64 576 320 ) ( 65 576 320 ) ( 64 576 321 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 43 | ( -64 528 320 ) ( -64 528 321 ) ( -64 529 320 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 44 | } 45 | // brush 4 46 | { 47 | ( -128 512 288 ) ( -128 513 288 ) ( -128 512 289 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 48 | ( -64 512 288 ) ( -64 512 289 ) ( -63 512 288 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 49 | ( 64 528 256 ) ( 65 528 256 ) ( 64 529 256 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 50 | ( 64 528 320 ) ( 64 529 320 ) ( 65 528 320 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 51 | ( 64 576 320 ) ( 65 576 320 ) ( 64 576 321 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 52 | ( 128 528 320 ) ( 128 528 321 ) ( 128 529 320 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 53 | } 54 | // brush 5 55 | { 56 | ( 64 512 288 ) ( 64 513 288 ) ( 64 512 289 ) base/checkerboard [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.125 0.125 57 | ( 128 512 288 ) ( 128 512 289 ) ( 129 512 288 ) base/checkerboard [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 0.125 0.125 58 | ( 128 512 0 ) ( 129 512 0 ) ( 128 513 0 ) base/checkerboard [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.125 0.125 59 | ( 256 528 256 ) ( 256 529 256 ) ( 257 528 256 ) base/checkerboard [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 60 | ( 256 576 320 ) ( 257 576 320 ) ( 256 576 321 ) base/checkerboard [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 61 | ( 128 528 320 ) ( 128 528 321 ) ( 128 529 320 ) base/checkerboard [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 62 | } 63 | } 64 | // entity 1 65 | { 66 | "classname" "physics_ball" 67 | "origin" "0 448 512" 68 | "size" "3" 69 | "mass" "2" 70 | } 71 | // entity 2 72 | { 73 | "classname" "button" 74 | "target" "button_1_pressed_signal" 75 | // brush 0 76 | { 77 | ( -32 -208 64 ) ( -32 -207 64 ) ( -32 -208 65 ) base/uv_test [ 0 -1 0 -192 ] [ 0 0 -1 0 ] 0 0.25 0.25 78 | ( -16 -208 64 ) ( -16 -208 65 ) ( -15 -208 64 ) base/uv_test [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 79 | ( -16 -208 64 ) ( -15 -208 64 ) ( -16 -207 64 ) base/uv_test [ -1 0 0 0 ] [ 0 -1 0 -192 ] 0 0.25 0.25 80 | ( 32 -144 80 ) ( 32 -143 80 ) ( 33 -144 80 ) base/uv_test [ 1 0 0 0 ] [ 0 -1 0 -192 ] 0 0.25 0.25 81 | ( 32 -144 80 ) ( 33 -144 80 ) ( 32 -144 81 ) base/uv_test [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 82 | ( 32 -144 80 ) ( 32 -144 81 ) ( 32 -143 80 ) base/uv_test [ 0 1 0 192 ] [ 0 0 -1 0 ] 0 0.25 0.25 83 | } 84 | } 85 | // entity 3 86 | { 87 | "classname" "mover" 88 | "translation" "0 6 0" 89 | "targetname" "button_door" 90 | "speed" "2" 91 | // brush 0 92 | { 93 | ( -48 -384 64 ) ( -48 -383 64 ) ( -48 -384 65 ) base/uv_test [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 94 | ( -48 -384 64 ) ( -48 -384 65 ) ( -47 -384 64 ) base/uv_test [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 95 | ( -48 -384 64 ) ( -47 -384 64 ) ( -48 -383 64 ) base/uv_test [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 96 | ( 48 -368 176 ) ( 48 -367 176 ) ( 49 -368 176 ) base/uv_test [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.125 0.125 97 | ( 48 -368 176 ) ( 49 -368 176 ) ( 48 -368 177 ) base/uv_test [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 98 | ( 48 -368 176 ) ( 48 -368 177 ) ( 48 -367 176 ) base/uv_test [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.125 0.125 99 | } 100 | } 101 | // entity 4 102 | { 103 | "classname" "group" 104 | // brush 0 105 | { 106 | ( -80 -384 64 ) ( -80 -383 64 ) ( -80 -384 65 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 107 | ( -80 -400 64 ) ( -80 -400 65 ) ( -79 -400 64 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 108 | ( -80 -384 64 ) ( -79 -384 64 ) ( -80 -383 64 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 109 | ( -64 -352 176 ) ( -80 -352 176 ) ( -80 -224 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 110 | ( -48 -352 80 ) ( -47 -352 80 ) ( -48 -352 81 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 111 | ( -48 -352 80 ) ( -48 -352 81 ) ( -48 -351 80 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 112 | } 113 | // brush 1 114 | { 115 | ( -80 -352 80 ) ( -80 -351 80 ) ( -80 -352 81 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 116 | ( -112 -400 64 ) ( -112 -400 65 ) ( -111 -400 64 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 117 | ( 80 -352 176 ) ( 64 -224 176 ) ( 64 -352 176 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 118 | ( -80 -352 256 ) ( -80 -351 256 ) ( -79 -352 256 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 119 | ( -80 -352 80 ) ( -79 -352 80 ) ( -80 -352 81 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 120 | ( 80 -352 80 ) ( 80 -352 81 ) ( 80 -351 80 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 121 | } 122 | // brush 2 123 | { 124 | ( -80 -384 256 ) ( -64 -256 272 ) ( -64 -384 272 ) base/grid [ 0.707107 0 0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 125 | ( -80 -400 176 ) ( -80 -400 177 ) ( -79 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 126 | ( -48 -352 256 ) ( -47 -352 256 ) ( -48 -351 256 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 127 | ( -48 -352 192 ) ( -47 -352 192 ) ( -48 -352 193 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 128 | ( -48 -352 192 ) ( -48 -352 193 ) ( -48 -351 192 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 129 | } 130 | // brush 3 131 | { 132 | ( -48 -352 192 ) ( -48 -351 192 ) ( -48 -352 193 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 133 | ( -96 -400 176 ) ( -96 -400 177 ) ( -95 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 134 | ( -64 -352 256 ) ( -63 -352 256 ) ( -64 -351 256 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 135 | ( -64 -352 288 ) ( -64 -351 288 ) ( -63 -352 288 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 136 | ( -64 -352 192 ) ( -63 -352 192 ) ( -64 -352 193 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 137 | ( 48 -352 192 ) ( 48 -352 193 ) ( 48 -351 192 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 138 | } 139 | // brush 4 140 | { 141 | ( 48 -352 192 ) ( 48 -351 192 ) ( 48 -352 193 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 142 | ( -112 -400 176 ) ( -112 -400 177 ) ( -111 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 143 | ( -80 -352 256 ) ( -79 -352 256 ) ( -80 -351 256 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 144 | ( -80 -352 192 ) ( -79 -352 192 ) ( -80 -352 193 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 145 | ( 48 -384 288 ) ( 64 -256 272 ) ( 64 -384 272 ) base/grid [ 0.707107 0 -0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 146 | } 147 | // brush 5 148 | { 149 | ( 48 -352 80 ) ( 48 -351 80 ) ( 48 -352 81 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 150 | ( -112 -400 64 ) ( -112 -400 65 ) ( -111 -400 64 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 151 | ( -80 -352 64 ) ( -79 -352 64 ) ( -80 -351 64 ) base/grid [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 152 | ( 80 -352 176 ) ( 64 -352 176 ) ( 64 -224 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 153 | ( -80 -352 80 ) ( -79 -352 80 ) ( -80 -352 81 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 154 | ( 80 -352 80 ) ( 80 -352 81 ) ( 80 -351 80 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 155 | } 156 | // brush 6 157 | { 158 | ( 48 -352 160 ) ( 32 -352 176 ) ( 32 -368 176 ) base/grid [ -0.707107 0 0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 159 | ( 32 -368 176 ) ( 48 -368 176 ) ( 48 -368 160 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 160 | ( 48 -352 176 ) ( 48 -368 176 ) ( 32 -368 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 161 | ( 48 -352 160 ) ( 48 -352 176 ) ( 32 -352 176 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 162 | ( 48 -352 160 ) ( 48 -368 160 ) ( 48 -368 176 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 163 | } 164 | // brush 7 165 | { 166 | ( -48 -352 160 ) ( -48 -368 176 ) ( -48 -368 160 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 167 | ( -32 -368 176 ) ( -48 -368 160 ) ( -48 -368 176 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 168 | ( -48 -352 176 ) ( -32 -368 176 ) ( -48 -368 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 169 | ( -48 -352 160 ) ( -32 -352 176 ) ( -48 -352 176 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 170 | ( -48 -352 160 ) ( -32 -368 176 ) ( -32 -352 176 ) base/grid [ -0.707107 0 -0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 171 | } 172 | // brush 8 173 | { 174 | ( -48 -384 160 ) ( -48 -400 176 ) ( -48 -400 160 ) base/grid [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 175 | ( -32 -400 176 ) ( -48 -400 160 ) ( -48 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 176 | ( -48 -384 176 ) ( -32 -400 176 ) ( -48 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 177 | ( -48 -384 160 ) ( -32 -384 176 ) ( -48 -384 176 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 178 | ( -48 -384 160 ) ( -32 -400 176 ) ( -32 -384 176 ) base/grid [ -0.707107 0 -0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 179 | } 180 | // brush 9 181 | { 182 | ( 48 -384 160 ) ( 32 -384 176 ) ( 32 -400 176 ) base/grid [ -0.707107 0 0.707107 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 183 | ( 32 -400 176 ) ( 48 -400 176 ) ( 48 -400 160 ) base/grid [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 184 | ( 48 -384 176 ) ( 48 -400 176 ) ( 32 -400 176 ) base/grid [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 0.25 0.25 185 | ( 48 -384 160 ) ( 48 -384 176 ) ( 32 -384 176 ) base/grid [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 186 | ( 48 -384 160 ) ( 48 -400 160 ) ( 48 -400 176 ) base/grid [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 187 | } 188 | } 189 | // entity 5 190 | { 191 | "classname" "signal" 192 | "origin" "-56 -184 72" 193 | "signal_name" "pressed" 194 | "targetname" "button_1_pressed_signal" 195 | "target" "button_door_open_slot" 196 | } 197 | // entity 6 198 | { 199 | "classname" "receiver" 200 | "origin" "-56 -264 72" 201 | "target" "button_door" 202 | "targetname" "button_door_open_slot" 203 | "receiver_name" "play_motion" 204 | } 205 | // entity 7 206 | { 207 | "classname" "button" 208 | "target" "button_2_pressed_signal" 209 | // brush 0 210 | { 211 | ( -32 -624 64 ) ( -32 -623 64 ) ( -32 -624 65 ) base/uv_test [ 0 -1 0 -320 ] [ 0 0 -1 0 ] 0 0.25 0.25 212 | ( -16 -624 64 ) ( -16 -624 65 ) ( -15 -624 64 ) base/uv_test [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 213 | ( -16 -624 64 ) ( -15 -624 64 ) ( -16 -623 64 ) base/uv_test [ -1 0 0 0 ] [ 0 -1 0 -320 ] 0 0.25 0.25 214 | ( 32 -560 80 ) ( 32 -559 80 ) ( 33 -560 80 ) base/uv_test [ 1 0 0 0 ] [ 0 -1 0 -320 ] 0 0.25 0.25 215 | ( 32 -560 80 ) ( 33 -560 80 ) ( 32 -560 81 ) base/uv_test [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 0.25 0.25 216 | ( 32 -560 80 ) ( 32 -560 81 ) ( 32 -559 80 ) base/uv_test [ 0 1 0 320 ] [ 0 0 -1 0 ] 0 0.25 0.25 217 | } 218 | } 219 | // entity 8 220 | { 221 | "classname" "signal" 222 | "origin" "-56 -488 72" 223 | "signal_name" "pressed" 224 | "targetname" "button_2_pressed_signal" 225 | "target" "button_door_close_slot" 226 | } 227 | // entity 9 228 | { 229 | "classname" "receiver" 230 | "origin" "-56 -408 72" 231 | "target" "button_door" 232 | "targetname" "button_door_close_slot" 233 | "receiver_name" "reverse_motion" 234 | } 235 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/1-interactivity/4-advanced-signal-wiring/4-advanced-signal-wiring.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/4-advanced-signal-wiring.map-5cdeaa79448cc1beb1676661a5884591.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/1-interactivity/4-advanced-signal-wiring/4-advanced-signal-wiring.map" 10 | dest_files=[ "res://.import/4-advanced-signal-wiring.map-5cdeaa79448cc1beb1676661a5884591.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/2-miscallaneous/0-trenchbroom-group-hierarchy/0-trenchbroom-group-hierarchy.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/0-trenchbroom-group-hierarchy.map-08de1cb4fb4ba65e36c8e4f7b16bc0a2.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/2-miscallaneous/0-trenchbroom-group-hierarchy/0-trenchbroom-group-hierarchy.map" 10 | dest_files=[ "res://.import/0-trenchbroom-group-hierarchy.map-08de1cb4fb4ba65e36c8e4f7b16bc0a2.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/1-runtime-map-building.map.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.map" 4 | type="Resource" 5 | path="res://.import/1-runtime-map-building.map-270a7da2aa5a56fb0b059d46c6490252.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/1-runtime-map-building.map" 10 | dest_files=[ "res://.import/1-runtime-map-building.map-270a7da2aa5a56fb0b059d46c6490252.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/1-runtime-map-building.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=7 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/nodes/qodot_map.gd" type="Script" id=3] 4 | [ext_resource path="res://addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/orbit_arm.gd" type="Script" id=5] 5 | [ext_resource path="res://addons/qodot/game_definitions/fgd/qodot_fgd.tres" type="Resource" id=14] 6 | 7 | [sub_resource type="ProceduralSky" id=1] 8 | sky_top_color = Color( 0.654902, 0.647059, 0.945098, 1 ) 9 | sky_curve = 0.0170518 10 | sky_energy = 0.4 11 | ground_bottom_color = Color( 0.133333, 0.109804, 0.203922, 1 ) 12 | ground_horizon_color = Color( 0.372549, 0.4, 0.423529, 1 ) 13 | ground_energy = 0.4 14 | sun_longitude = 180.0 15 | sun_energy = 0.4 16 | 17 | [sub_resource type="Environment" id=2] 18 | background_mode = 2 19 | background_sky = SubResource( 1 ) 20 | ssao_enabled = true 21 | ssao_intensity = 1.2 22 | ssao_light_affect = 1.0 23 | ssao_ao_channel_affect = 1.0 24 | ssao_quality = 2 25 | glow_enabled = true 26 | glow_intensity = 1.0 27 | glow_bicubic_upscale = true 28 | 29 | [sub_resource type="SpatialMaterial" id=3] 30 | 31 | [node name="RuntimeMapBuilding" type="Spatial"] 32 | 33 | [node name="README" type="Node" parent="."] 34 | __meta__ = { 35 | "_editor_description_": "This scene introduces runtime map building. 36 | 37 | Qodot usage isn't limited only to the editor - if you ship the requisite platform-specific native libraries with your project, you can invoke map builds at runtime using the `verify_and_build()` function in QodotMap to allow for user map creation. 38 | 39 | Note that only in-project WAD files are currently supported for runtime builds, as their implementation is tightly coupled to the Godot resource system." 40 | } 41 | 42 | [node name="WorldEnvironment" type="WorldEnvironment" parent="."] 43 | environment = SubResource( 2 ) 44 | 45 | [node name="DirectionalLight" type="DirectionalLight" parent="."] 46 | transform = Transform( -1, 8.74228e-08, 8.26597e-14, -7.92319e-08, -0.906308, 0.422618, 3.69465e-08, 0.422618, 0.906308, 0, 13.4201, 0 ) 47 | light_color = Color( 0.654902, 0.647059, 0.945098, 1 ) 48 | shadow_enabled = true 49 | 50 | [node name="OrbitCameraController" type="Spatial" parent="."] 51 | transform = Transform( 0.85264, -0.245298, 0.461339, 0, 0.882947, 0.469472, -0.522499, -0.40029, 0.752836, 1.73346, -1.42268, -7.17249 ) 52 | script = ExtResource( 5 ) 53 | 54 | [node name="Camera" type="Camera" parent="OrbitCameraController"] 55 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 40 ) 56 | current = true 57 | far = 500.0 58 | 59 | [node name="QodotMap" type="Spatial" parent="."] 60 | script = ExtResource( 3 ) 61 | __meta__ = { 62 | "_editor_description_": "" 63 | } 64 | map_file = "P:/Personal/Godot/Qodot/qodot-example/addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/1-runtime-map-building.map" 65 | inverse_scale_factor = 16.0 66 | entity_fgd = ExtResource( 14 ) 67 | base_texture_dir = "res://addons/qodot/textures" 68 | texture_file_extension = "png" 69 | worldspawn_layers = [ ] 70 | brush_clip_texture = "special/clip" 71 | face_skip_texture = "special/skip" 72 | texture_wads = [ ] 73 | material_file_extension = "tres" 74 | default_material = SubResource( 3 ) 75 | uv_unwrap_texel_size = 1.0 76 | print_profiling_data = false 77 | use_trenchbroom_group_hierarchy = true 78 | tree_attach_batch_size = 16 79 | set_owner_batch_size = 16 80 | 81 | [node name="UI" type="Control" parent="."] 82 | margin_top = -1.0 83 | margin_right = 1042.0 84 | margin_bottom = 599.0 85 | __meta__ = { 86 | "_edit_use_anchors_": false 87 | } 88 | 89 | [node name="Panel" type="Panel" parent="UI"] 90 | anchor_top = 1.0 91 | anchor_bottom = 1.0 92 | margin_left = 20.0 93 | margin_top = -60.0 94 | margin_right = 682.0 95 | margin_bottom = -20.0 96 | __meta__ = { 97 | "_edit_use_anchors_": false 98 | } 99 | 100 | [node name="MarginContainer" type="MarginContainer" parent="UI/Panel"] 101 | anchor_right = 1.0 102 | anchor_bottom = 1.0 103 | margin_left = 10.0 104 | margin_top = 10.0 105 | margin_right = -10.0 106 | margin_bottom = -10.0 107 | size_flags_horizontal = 3 108 | size_flags_vertical = 3 109 | __meta__ = { 110 | "_edit_use_anchors_": false 111 | } 112 | 113 | [node name="VBoxContainer" type="VBoxContainer" parent="UI/Panel/MarginContainer"] 114 | margin_right = 642.0 115 | margin_bottom = 20.0 116 | custom_constants/separation = 10 117 | 118 | [node name="MapFileHBox" type="HBoxContainer" parent="UI/Panel/MarginContainer/VBoxContainer"] 119 | margin_right = 642.0 120 | margin_bottom = 20.0 121 | size_flags_horizontal = 3 122 | 123 | [node name="TitleLabel" type="Label" parent="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox"] 124 | margin_right = 70.0 125 | margin_bottom = 20.0 126 | rect_min_size = Vector2( 70, 0 ) 127 | size_flags_vertical = 3 128 | text = "Map File" 129 | valign = 1 130 | 131 | [node name="FilenameLabel" type="Label" parent="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox"] 132 | margin_left = 74.0 133 | margin_right = 555.0 134 | margin_bottom = 20.0 135 | size_flags_horizontal = 3 136 | size_flags_vertical = 3 137 | valign = 1 138 | clip_text = true 139 | 140 | [node name="OpenButton" type="Button" parent="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox"] 141 | margin_left = 559.0 142 | margin_right = 583.0 143 | margin_bottom = 20.0 144 | size_flags_vertical = 4 145 | text = "..." 146 | 147 | [node name="ReloadButton" type="Button" parent="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox"] 148 | margin_left = 587.0 149 | margin_right = 642.0 150 | margin_bottom = 20.0 151 | size_flags_vertical = 4 152 | text = "Reload" 153 | 154 | [node name="MapFileDialog" type="FileDialog" parent="UI"] 155 | anchor_left = 0.5 156 | anchor_top = 0.5 157 | anchor_right = 0.5 158 | anchor_bottom = 0.5 159 | margin_left = -200.0 160 | margin_top = -140.0 161 | margin_right = 200.0 162 | margin_bottom = 140.0 163 | window_title = "Open Map File" 164 | mode_overrides_title = false 165 | mode = 0 166 | access = 2 167 | filters = PoolStringArray( "*.map" ) 168 | current_dir = "P:/Personal/Godot/Qodot/qodot-example" 169 | current_file = "qodot_example.map" 170 | current_path = "P:/Personal/Godot/Qodot/qodot-example/qodot_example.map" 171 | [connection signal="pressed" from="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox/OpenButton" to="UI/MapFileDialog" method="popup"] 172 | [connection signal="pressed" from="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox/ReloadButton" to="QodotMap" method="verify_and_build"] 173 | [connection signal="file_selected" from="UI/MapFileDialog" to="UI/Panel/MarginContainer/VBoxContainer/MapFileHBox/FilenameLabel" method="set_text"] 174 | [connection signal="file_selected" from="UI/MapFileDialog" to="QodotMap" method="set_map_file"] 175 | -------------------------------------------------------------------------------- /addons/qodot/example_scenes/2-miscallaneous/1-runtime-map-building/orbit_arm.gd: -------------------------------------------------------------------------------- 1 | class_name OrbitArm 2 | extends Spatial 3 | 4 | export(bool) var translate := true 5 | export(bool) var rotate := true 6 | export(bool) var zoom := true 7 | 8 | var yaw = 0.0 9 | var pitch = 0.0 10 | 11 | func _ready() -> void: 12 | yaw = transform.basis.get_euler().y 13 | pitch = transform.basis.get_euler().x 14 | 15 | func _process(delta): 16 | rotation = Vector3.ZERO 17 | rotate(Vector3.RIGHT, pitch) 18 | rotate(Vector3.UP, yaw) 19 | 20 | func _input(event) -> void: 21 | if event is InputEventMouseButton: 22 | if not zoom: return 23 | if event.button_index == BUTTON_WHEEL_UP: 24 | $Camera.translation.z -= 2.0 25 | elif event.button_index == BUTTON_WHEEL_DOWN: 26 | $Camera.translation.z += 2.0 27 | elif event is InputEventMouseMotion: 28 | if Input.is_mouse_button_pressed(BUTTON_MASK_LEFT): 29 | if not translate: return 30 | translation += $Camera.global_transform.basis.x * event.relative.x * -0.05 31 | translation += $Camera.global_transform.basis.y * event.relative.y * 0.05 32 | elif Input.is_mouse_button_pressed(BUTTON_MASK_RIGHT): 33 | if not rotate: return 34 | yaw += event.relative.x * -0.002 35 | pitch += event.relative.y * -0.002 36 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/base_classes/light_base_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_base_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "Light" 9 | description = "" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | "_color": Color( 1, 1, 1, 1 ), 14 | "delay": { 15 | "Inverse distance falloff": 1, 16 | "Inverse distance squared": 2, 17 | "Inverse distance squared B": 5, 18 | "Linear falloff (Default)": 0, 19 | "Local minlight": 4, 20 | "No falloff": 3 21 | }, 22 | "light": 300, 23 | "mangle": Vector3( 0.005, 0, 0 ), 24 | "wait": 1 25 | } 26 | class_property_descriptions = { 27 | "_color": "Light color", 28 | "delay": "Attenuation", 29 | "light": "Brightness", 30 | "mangle": "Spotlight angle", 31 | "wait": "Fade distance multiplier" 32 | } 33 | meta_properties = { 34 | "color": Color( 1, 1, 0.156863, 1 ) 35 | } 36 | node_options = "----------------------------------------------------------------" 37 | node_class = "" 38 | transient_node = false 39 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/base_classes/target_base_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_base_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "Target" 9 | description = "" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "" 23 | transient_node = false 24 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/base_classes/targetname_base_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_base_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "Targetname" 9 | description = "" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | "targetname": null 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "" 23 | transient_node = false 24 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/light.gd: -------------------------------------------------------------------------------- 1 | class_name QodotLight 2 | extends QodotEntity 3 | tool 4 | 5 | func update_properties(): 6 | if not Engine.is_editor_hint: 7 | return 8 | 9 | for child in get_children(): 10 | remove_child(child) 11 | child.queue_free() 12 | 13 | var light_node = null 14 | 15 | if 'mangle' in properties: 16 | light_node = SpotLight.new() 17 | 18 | var yaw = properties['mangle'].x 19 | var pitch = properties['mangle'].y 20 | light_node.rotate(Vector3.UP, deg2rad(180 + yaw)) 21 | light_node.rotate(light_node.global_transform.basis.x, deg2rad(180 + pitch)) 22 | 23 | if 'angle' in properties: 24 | light_node.set_param(Light.PARAM_SPOT_ANGLE, properties['angle']) 25 | else: 26 | light_node = OmniLight.new() 27 | 28 | var light_brightness = 300 29 | if 'light' in properties: 30 | light_brightness = properties['light'] 31 | light_node.set_param(Light.PARAM_ENERGY, light_brightness / 100.0) 32 | light_node.set_param(Light.PARAM_INDIRECT_ENERGY, light_brightness / 100.0) 33 | 34 | var light_range := 1.0 35 | if 'wait' in properties: 36 | light_range = properties['wait'] 37 | 38 | var normalized_brightness = light_brightness / 300.0 39 | light_node.set_param(Light.PARAM_RANGE, 16.0 * light_range * (normalized_brightness * normalized_brightness)) 40 | 41 | var light_attenuation = 0 42 | if 'delay' in properties: 43 | light_attenuation = properties['delay'] 44 | 45 | var attenuation = 0 46 | match light_attenuation: 47 | 0: 48 | attenuation = 1.0 49 | 1: 50 | attenuation = 0.5 51 | 2: 52 | attenuation = 0.25 53 | 3: 54 | attenuation = 0.15 55 | 4: 56 | attenuation = 0 57 | 5: 58 | attenuation = 0.9 59 | _: 60 | attenuation = 1 61 | 62 | light_node.set_param(Light.PARAM_ATTENUATION, attenuation) 63 | light_node.set_shadow(true) 64 | light_node.set_bake_mode(Light.BAKE_ALL) 65 | 66 | var light_color = Color.white 67 | if '_color' in properties: 68 | light_color = properties['_color'] 69 | 70 | light_node.set_color(light_color) 71 | 72 | add_child(light_node) 73 | 74 | if is_inside_tree(): 75 | var tree = get_tree() 76 | if tree: 77 | var edited_scene_root = tree.get_edited_scene_root() 78 | if edited_scene_root: 79 | light_node.set_owner(edited_scene_root) 80 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/light_point_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=4 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/light.gd" type="Script" id=2] 5 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/light_base_class.tres" type="Resource" id=3] 6 | 7 | 8 | 9 | [resource] 10 | script = ExtResource( 1 ) 11 | class_options = "----------------------------------------------------------------" 12 | classname = "light" 13 | description = "Invisible light source" 14 | qodot_internal = false 15 | base_classes = [ ExtResource( 3 ) ] 16 | class_properties = { 17 | "angle": 0.0 18 | } 19 | class_property_descriptions = { 20 | "angle": "Rotation Angle" 21 | } 22 | meta_properties = { 23 | "size": AABB( -8, -8, -8, 8, 8, 8 ) 24 | } 25 | node_options = "----------------------------------------------------------------" 26 | node_class = "Spatial" 27 | transient_node = false 28 | scene = "----------------------------------------------------------------" 29 | scripting = "----------------------------------------------------------------" 30 | script_class = ExtResource( 2 ) 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/physics_ball.gd: -------------------------------------------------------------------------------- 1 | class_name PhysicsBall 2 | extends PhysicsEntity 3 | tool 4 | 5 | func update_properties(): 6 | .update_properties() 7 | if 'size' in properties: 8 | $MeshInstance.mesh.radius = properties.size * 0.5 9 | $MeshInstance.mesh.height = properties.size 10 | 11 | $CollisionShape.shape.radius = properties.size * 0.5 12 | 13 | 14 | func use(): 15 | bounce() 16 | 17 | func bounce(): 18 | linear_velocity.y = 10 19 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/physics_ball.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [sub_resource type="SphereMesh" id=1] 4 | radius = 0.5 5 | height = 1.0 6 | 7 | [sub_resource type="SphereShape" id=2] 8 | radius = 0.5 9 | 10 | [node name="PhysicsBall" type="RigidBody"] 11 | 12 | [node name="MeshInstance" type="MeshInstance" parent="."] 13 | mesh = SubResource( 1 ) 14 | material/0 = null 15 | 16 | [node name="CollisionShape" type="CollisionShape" parent="."] 17 | shape = SubResource( 2 ) 18 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/physics_ball_point_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=4 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/physics_ball.tscn" type="PackedScene" id=2] 5 | 6 | [sub_resource type="GDScript" id=1] 7 | script/source = "class_name PhysicsBall 8 | extends PhysicsEntity 9 | tool 10 | 11 | func update_properties(): 12 | .update_properties() 13 | if 'size' in properties: 14 | $MeshInstance.mesh.radius = properties.size * 0.5 15 | $MeshInstance.mesh.height = properties.size 16 | 17 | $CollisionShape.shape.radius = properties.size * 0.5 18 | 19 | 20 | func use(): 21 | bounce() 22 | 23 | func bounce(): 24 | linear_velocity.y = 10 25 | " 26 | 27 | [resource] 28 | script = ExtResource( 1 ) 29 | class_options = "----------------------------------------------------------------" 30 | classname = "physics_ball" 31 | description = "Physics Ball" 32 | qodot_internal = false 33 | base_classes = [ ] 34 | class_properties = { 35 | "mass": 1.0, 36 | "size": 1.0, 37 | "velocity": Vector3( 0, 0, 0 ) 38 | } 39 | class_property_descriptions = { 40 | "velocity": "Initial velocity" 41 | } 42 | meta_properties = { 43 | "size": AABB( -8, -8, -8, 8, 8, 8 ) 44 | } 45 | node_options = "----------------------------------------------------------------" 46 | node_class = "" 47 | transient_node = false 48 | scene = "----------------------------------------------------------------" 49 | scene_file = ExtResource( 2 ) 50 | scripting = "----------------------------------------------------------------" 51 | script_class = SubResource( 1 ) 52 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/receiver_point_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=4 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/target_base_class.tres" type="Resource" id=2] 5 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/targetname_base_class.tres" type="Resource" id=3] 6 | 7 | 8 | 9 | [resource] 10 | script = ExtResource( 1 ) 11 | class_options = "----------------------------------------------------------------" 12 | classname = "receiver" 13 | description = "Receiver" 14 | qodot_internal = false 15 | base_classes = [ ExtResource( 3 ), ExtResource( 2 ) ] 16 | class_properties = { 17 | "receiver_name": "" 18 | } 19 | class_property_descriptions = { 20 | "slot_name": "Receiver method to target" 21 | } 22 | meta_properties = { 23 | "size": AABB( -8, -8, -8, 8, 8, 8 ) 24 | } 25 | node_options = "----------------------------------------------------------------" 26 | node_class = "" 27 | transient_node = true 28 | scene = "----------------------------------------------------------------" 29 | scripting = "----------------------------------------------------------------" 30 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/point_classes/signal_point_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=4 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/target_base_class.tres" type="Resource" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/targetname_base_class.tres" type="Resource" id=2] 5 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd" type="Script" id=3] 6 | 7 | [resource] 8 | script = ExtResource( 3 ) 9 | class_options = "----------------------------------------------------------------" 10 | classname = "signal" 11 | description = "Signal" 12 | qodot_internal = false 13 | base_classes = [ ExtResource( 2 ), ExtResource( 1 ) ] 14 | class_properties = { 15 | "signal_name": "" 16 | } 17 | class_property_descriptions = { 18 | "signal_name": "Signal to target" 19 | } 20 | meta_properties = { 21 | "size": AABB( -8, -8, -8, 8, 8, 8 ) 22 | } 23 | node_options = "----------------------------------------------------------------" 24 | node_class = "" 25 | transient_node = true 26 | scene = "----------------------------------------------------------------" 27 | scripting = "----------------------------------------------------------------" 28 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/qodot_fgd.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=20 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/target_base_class.tres" type="Resource" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/func_group_solid_class.tres" type="Resource" id=2] 5 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/signal_point_class.tres" type="Resource" id=3] 6 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/targetname_base_class.tres" type="Resource" id=4] 7 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/trigger_solid_class.tres" type="Resource" id=5] 8 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_file.gd" type="Script" id=6] 9 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/receiver_point_class.tres" type="Resource" id=7] 10 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/illusionary_solid_class.tres" type="Resource" id=8] 11 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/worldspawn_solid_class.tres" type="Resource" id=9] 12 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/group_solid_class.tres" type="Resource" id=10] 13 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/detail_solid_class.tres" type="Resource" id=11] 14 | [ext_resource path="res://addons/qodot/game_definitions/fgd/base_classes/light_base_class.tres" type="Resource" id=12] 15 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/light_point_class.tres" type="Resource" id=13] 16 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/rotate_solid_class.tres" type="Resource" id=14] 17 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/button_solid_class.tres" type="Resource" id=15] 18 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/physics_solid_class.tres" type="Resource" id=16] 19 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/wall_solid_class.tres" type="Resource" id=17] 20 | [ext_resource path="res://addons/qodot/game_definitions/fgd/point_classes/physics_ball_point_class.tres" type="Resource" id=18] 21 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/mover_solid_class.tres" type="Resource" id=19] 22 | 23 | [resource] 24 | script = ExtResource( 6 ) 25 | export_file = false 26 | target_folder = "C:/OtherPrograms/TrenchBroom/games/Qodot" 27 | fgd_name = "Qodot" 28 | base_fgd_files = [ ] 29 | entity_definitions = [ ExtResource( 1 ), ExtResource( 4 ), ExtResource( 12 ), null, null, null, null, null, null, null, ExtResource( 3 ), ExtResource( 7 ), ExtResource( 13 ), ExtResource( 18 ), null, null, null, null, null, null, ExtResource( 9 ), ExtResource( 2 ), ExtResource( 10 ), ExtResource( 11 ), ExtResource( 8 ), ExtResource( 17 ), ExtResource( 5 ), ExtResource( 19 ), ExtResource( 14 ), ExtResource( 16 ), ExtResource( 15 ) ] 30 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/button.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | signal trigger() 4 | signal pressed() 5 | signal released() 6 | 7 | export(Dictionary) var properties setget set_properties 8 | 9 | var pressed = false 10 | var base_translation = Vector3.ZERO 11 | var axis := Vector3.DOWN 12 | var speed := 8.0 13 | var depth := 0.8 14 | var release_delay := 0.0 15 | var trigger_signal_delay := 0.0 16 | var press_signal_delay := 0.0 17 | var release_signal_delay := 0.0 18 | 19 | var overlaps := 0 20 | 21 | func set_properties(new_properties: Dictionary) -> void: 22 | if properties != new_properties: 23 | properties = new_properties 24 | update_properties() 25 | 26 | func update_properties() -> void: 27 | if 'axis' in properties: 28 | axis = properties.axis.normalized() 29 | 30 | if 'speed' in properties: 31 | speed = properties.depth 32 | 33 | if 'depth' in properties: 34 | depth = properties.depth.to_float() 35 | 36 | if 'release_delay' in properties: 37 | release_delay = properties.release_delay 38 | 39 | if 'trigger_signal_delay' in properties: 40 | trigger_signal_delay = properties.trigger_signal_delay 41 | 42 | if 'press_signal_delay' in properties: 43 | press_signal_delay = properties.press_signal_delay 44 | 45 | if 'release_signal_delay' in properties: 46 | release_signal_delay = properties.release_signal_delay 47 | 48 | func _init() -> void: 49 | connect("body_shape_entered", self, "body_shape_entered") 50 | connect("body_shape_exited", self, "body_shape_exited") 51 | 52 | func _enter_tree() -> void: 53 | base_translation = translation 54 | 55 | func _process(delta: float) -> void: 56 | var target_position = base_translation + (axis * (depth if pressed else 0.0)) 57 | translation = translation.linear_interpolate(target_position, speed * delta) 58 | 59 | func body_shape_entered(body_id, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 60 | if body is StaticBody: 61 | return 62 | 63 | if overlaps == 0: 64 | press() 65 | 66 | overlaps += 1 67 | 68 | func body_shape_exited(body_id, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 69 | if body is StaticBody: 70 | return 71 | 72 | overlaps -= 1 73 | if overlaps == 0: 74 | if release_delay == 0: 75 | release() 76 | elif release_delay > 0: 77 | yield(get_tree().create_timer(release_delay), "timeout") 78 | release() 79 | 80 | func press() -> void: 81 | if pressed: 82 | return 83 | 84 | pressed = true 85 | 86 | emit_trigger() 87 | emit_pressed() 88 | 89 | func emit_trigger() -> void: 90 | yield(get_tree().create_timer(trigger_signal_delay), "timeout") 91 | emit_signal("trigger") 92 | 93 | func emit_pressed() -> void: 94 | yield(get_tree().create_timer(press_signal_delay), "timeout") 95 | emit_signal("pressed") 96 | 97 | func release() -> void: 98 | if not pressed: 99 | return 100 | 101 | pressed = false 102 | 103 | yield(get_tree().create_timer(release_signal_delay), "timeout") 104 | emit_signal("released") 105 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/button_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/button.gd" type="Script" id=2] 5 | 6 | [resource] 7 | script = ExtResource( 1 ) 8 | class_options = "----------------------------------------------------------------" 9 | classname = "button" 10 | description = "Interactive button brush." 11 | qodot_internal = false 12 | base_classes = [ ] 13 | class_properties = { 14 | "axis": Vector3( 0, -1, 0 ), 15 | "depth": 0.8, 16 | "press_signal_delay": 0.0, 17 | "release_delay": 0.0, 18 | "release_signal_delay": 0.0, 19 | "speed": 8.0, 20 | "trigger_signal_delay": 0.0 21 | } 22 | class_property_descriptions = { 23 | } 24 | meta_properties = { 25 | } 26 | node_options = "----------------------------------------------------------------" 27 | node_class = "Area" 28 | transient_node = false 29 | spawn = "----------------------------------------------------------------" 30 | spawn_type = 2 31 | visual_build = "----------------------------------------------------------------" 32 | build_visuals = true 33 | collision_build = "----------------------------------------------------------------" 34 | collision_shape_type = 1 35 | scripting = "----------------------------------------------------------------" 36 | script_class = ExtResource( 2 ) 37 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/detail_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "detail" 9 | description = "Detail Brush" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "StaticBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 1 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/func_group_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "func_group" 9 | description = "TrenchBroom Group" 10 | qodot_internal = true 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "StaticBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 3 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/group_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "group" 9 | description = "Brush Group" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "StaticBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 1 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/illusionary_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "illusionary" 9 | description = "Non-colliding Brush" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "Spatial" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 1 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 0 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/mover.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export(Dictionary) var properties setget set_properties 4 | 5 | var base_transform: Transform 6 | var offset_transform: Transform 7 | var target_transform: Transform 8 | 9 | var speed := 1.0 10 | 11 | func set_properties(new_properties: Dictionary) -> void: 12 | if properties != new_properties: 13 | properties = new_properties 14 | update_properties() 15 | 16 | func update_properties() -> void: 17 | if 'translation' in properties: 18 | offset_transform.origin = properties.translation 19 | 20 | if 'rotation' in properties: 21 | offset_transform.basis = offset_transform.basis.rotated(Vector3.RIGHT, properties.rotation.x) 22 | offset_transform.basis = offset_transform.basis.rotated(Vector3.UP, properties.rotation.y) 23 | offset_transform.basis = offset_transform.basis.rotated(Vector3.FORWARD, properties.rotation.z) 24 | 25 | if 'scale' in properties: 26 | offset_transform.basis = offset_transform.basis.scaled(properties.scale) 27 | 28 | if 'speed' in properties: 29 | speed = properties.speed 30 | 31 | func _process(delta: float) -> void: 32 | transform = transform.interpolate_with(target_transform, speed * delta) 33 | 34 | func _init() -> void: 35 | base_transform = transform 36 | target_transform = base_transform 37 | 38 | func use() -> void: 39 | play_motion() 40 | 41 | func play_motion() -> void: 42 | target_transform = base_transform * offset_transform 43 | 44 | func reverse_motion() -> void: 45 | target_transform = base_transform 46 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/mover_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/mover.gd" type="Script" id=2] 5 | 6 | [resource] 7 | script = ExtResource( 1 ) 8 | class_options = "----------------------------------------------------------------" 9 | classname = "mover" 10 | description = "Moving brush." 11 | qodot_internal = false 12 | base_classes = [ ] 13 | class_properties = { 14 | "rotation": Vector3( 0, 0, 0 ), 15 | "scale": Vector3( 1, 1, 1 ), 16 | "speed": 1.0, 17 | "translation": Vector3( 0, 0, 0 ) 18 | } 19 | class_property_descriptions = { 20 | } 21 | meta_properties = { 22 | } 23 | node_options = "----------------------------------------------------------------" 24 | node_class = "KinematicBody" 25 | transient_node = false 26 | spawn = "----------------------------------------------------------------" 27 | spawn_type = 2 28 | visual_build = "----------------------------------------------------------------" 29 | build_visuals = true 30 | collision_build = "----------------------------------------------------------------" 31 | collision_shape_type = 1 32 | scripting = "----------------------------------------------------------------" 33 | script_class = ExtResource( 2 ) 34 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/physics.gd: -------------------------------------------------------------------------------- 1 | class_name PhysicsEntity 2 | extends RigidBody 3 | tool 4 | 5 | export(Dictionary) var properties setget set_properties 6 | 7 | func set_properties(new_properties : Dictionary) -> void: 8 | if(properties != new_properties): 9 | properties = new_properties 10 | update_properties() 11 | 12 | func update_properties(): 13 | if 'velocity' in properties: 14 | linear_velocity = properties['velocity'] 15 | 16 | if 'mass' in properties: 17 | mass = properties.mass 18 | 19 | 20 | func use(): 21 | bounce() 22 | 23 | func bounce(): 24 | linear_velocity.y = 10 25 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/physics_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/physics.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=2] 5 | 6 | [resource] 7 | script = ExtResource( 2 ) 8 | class_options = "----------------------------------------------------------------" 9 | classname = "physics" 10 | description = "Physics Brush" 11 | qodot_internal = false 12 | base_classes = [ ] 13 | class_properties = { 14 | "mass": 1.0, 15 | "velocity": Vector3( 0, 0, 0 ) 16 | } 17 | class_property_descriptions = { 18 | } 19 | meta_properties = { 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "RigidBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 2 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | script_class = ExtResource( 1 ) 32 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/rotate.gd: -------------------------------------------------------------------------------- 1 | class_name QodotRotateEntity 2 | extends KinematicBody 3 | 4 | export(Dictionary) var properties setget set_properties 5 | 6 | var rotate_axis := Vector3.UP 7 | var rotate_speed := 360.0 8 | 9 | func set_properties(new_properties : Dictionary) -> void: 10 | if(properties != new_properties): 11 | properties = new_properties 12 | update_properties() 13 | 14 | func update_properties(): 15 | if 'axis' in properties: 16 | rotate_axis = properties['axis'] 17 | 18 | if 'speed' in properties: 19 | rotate_speed = properties['speed'] 20 | 21 | func _ready() -> void: 22 | update_properties() 23 | 24 | func _process(delta: float) -> void: 25 | rotate(rotate_axis, deg2rad(rotate_speed * delta)) 26 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/rotate_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [sub_resource type="GDScript" id=1] 6 | script/source = "class_name QodotRotateEntity 7 | extends KinematicBody 8 | 9 | export(Dictionary) var properties setget set_properties 10 | 11 | var rotate_axis := Vector3.UP 12 | var rotate_speed := 360.0 13 | 14 | func set_properties(new_properties : Dictionary) -> void: 15 | if(properties != new_properties): 16 | properties = new_properties 17 | update_properties() 18 | 19 | func update_properties(): 20 | if 'axis' in properties: 21 | rotate_axis = properties['axis'] 22 | 23 | if 'speed' in properties: 24 | rotate_speed = properties['speed'] 25 | 26 | func _ready() -> void: 27 | update_properties() 28 | 29 | func _process(delta: float) -> void: 30 | rotate(rotate_axis, deg2rad(rotate_speed * delta)) 31 | " 32 | 33 | [resource] 34 | script = ExtResource( 1 ) 35 | class_options = "----------------------------------------------------------------" 36 | classname = "rotate" 37 | description = "Rotating Brush" 38 | qodot_internal = false 39 | base_classes = [ ] 40 | class_properties = { 41 | "axis": Vector3( 0, 1, 0 ), 42 | "speed": 360.0 43 | } 44 | class_property_descriptions = { 45 | "axis": "Rotation Axis", 46 | "speed": "Rotation Speed" 47 | } 48 | meta_properties = { 49 | } 50 | node_options = "----------------------------------------------------------------" 51 | node_class = "KinematicBody" 52 | transient_node = false 53 | spawn = "----------------------------------------------------------------" 54 | spawn_type = 2 55 | visual_build = "================================================================" 56 | build_visuals = true 57 | collision_build = "----------------------------------------------------------------" 58 | collision_shape_type = 1 59 | scripting = "----------------------------------------------------------------" 60 | script_class = SubResource( 1 ) 61 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/trigger.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | signal trigger() 4 | 5 | func _ready(): 6 | connect("body_entered", self, "handle_body_entered") 7 | 8 | func handle_body_entered(body: Node): 9 | if body is StaticBody: 10 | return 11 | 12 | emit_signal("trigger") 13 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/trigger_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/fgd/solid_classes/trigger.gd" type="Script" id=2] 5 | 6 | 7 | [resource] 8 | script = ExtResource( 1 ) 9 | class_options = "----------------------------------------------------------------" 10 | classname = "trigger" 11 | description = "Trigger Volume" 12 | qodot_internal = false 13 | base_classes = [ ] 14 | class_properties = { 15 | 16 | } 17 | class_property_descriptions = { 18 | 19 | } 20 | meta_properties = { 21 | 22 | } 23 | node_options = "----------------------------------------------------------------" 24 | node_class = "Area" 25 | transient_node = false 26 | spawn = "----------------------------------------------------------------" 27 | spawn_type = 2 28 | visual_build = "----------------------------------------------------------------" 29 | build_visuals = false 30 | collision_build = "----------------------------------------------------------------" 31 | collision_shape_type = 1 32 | scripting = "----------------------------------------------------------------" 33 | script_class = ExtResource( 2 ) 34 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/wall_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "wall" 9 | description = "Basic entity brush." 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "StaticBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 2 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/fgd/solid_classes/worldspawn_solid_class.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | class_options = "----------------------------------------------------------------" 8 | classname = "worldspawn" 9 | description = "World Entity" 10 | qodot_internal = false 11 | base_classes = [ ] 12 | class_properties = { 13 | 14 | } 15 | class_property_descriptions = { 16 | 17 | } 18 | meta_properties = { 19 | 20 | } 21 | node_options = "----------------------------------------------------------------" 22 | node_class = "StaticBody" 23 | transient_node = false 24 | spawn = "----------------------------------------------------------------" 25 | spawn_type = 0 26 | visual_build = "----------------------------------------------------------------" 27 | build_visuals = true 28 | collision_build = "----------------------------------------------------------------" 29 | collision_shape_type = 1 30 | scripting = "----------------------------------------------------------------" 31 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/brush_tags/detail_tag.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | tag_name = "Detail" 8 | tag_attributes = [ ] 9 | tag_match_type = 4 10 | tag_pattern = "detail*" 11 | texture_name = "" 12 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/brush_tags/trigger_tag.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | tag_name = "Trigger" 8 | tag_attributes = [ "transparent" ] 9 | tag_match_type = 4 10 | tag_pattern = "trigger*" 11 | texture_name = "trigger" 12 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/face_tags/clip_tag.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | tag_name = "Clip" 8 | tag_attributes = [ "transparent" ] 9 | tag_match_type = 0 10 | tag_pattern = "clip" 11 | texture_name = "" 12 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/face_tags/skip_tag.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd" type="Script" id=1] 4 | 5 | [resource] 6 | script = ExtResource( 1 ) 7 | tag_name = "Skip" 8 | tag_attributes = [ "transparent" ] 9 | tag_match_type = 0 10 | tag_pattern = "skip" 11 | texture_name = "" 12 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/qodot_trenchbroom_config_file.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=6 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_game_config_file.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/trenchbroom/brush_tags/trigger_tag.tres" type="Resource" id=2] 5 | [ext_resource path="res://addons/qodot/game_definitions/trenchbroom/face_tags/skip_tag.tres" type="Resource" id=3] 6 | [ext_resource path="res://addons/qodot/game_definitions/trenchbroom/face_tags/clip_tag.tres" type="Resource" id=4] 7 | [ext_resource path="res://addons/qodot/game_definitions/trenchbroom/brush_tags/detail_tag.tres" type="Resource" id=5] 8 | 9 | [resource] 10 | script = ExtResource( 1 ) 11 | export_file = false 12 | target_file = "C:/OtherPrograms/TrenchBroom/games/Qodot/GameConfig.cfg" 13 | game_name = "Qodot" 14 | brush_tags = [ ExtResource( 2 ), ExtResource( 5 ) ] 15 | face_tags = [ ExtResource( 4 ), ExtResource( 3 ) ] 16 | face_attrib_surface_flags = [ ] 17 | face_attrib_content_flags = [ ] 18 | fgd_filenames = [ "Qodot.fgd" ] 19 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/trenchbroom/qodot_trenchbroom_config_folder.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=5 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/game_definitions/fgd/qodot_fgd.tres" type="Resource" id=1] 4 | [ext_resource path="res://icon.png" type="Texture" id=2] 5 | [ext_resource path="res://addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_game_config_folder.gd" type="Script" id=3] 6 | [ext_resource path="res://addons/qodot/game_definitions/trenchbroom/qodot_trenchbroom_config_file.tres" type="Resource" id=4] 7 | 8 | [resource] 9 | script = ExtResource( 3 ) 10 | export_file = false 11 | trenchbroom_games_folder = "C:/OtherPrograms/TrenchBroom/2020.1/games" 12 | game_name = "Qodot" 13 | icon = ExtResource( 2 ) 14 | game_config_file = ExtResource( 4 ) 15 | fgd_files = [ ExtResource( 1 ) ] 16 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid.gd: -------------------------------------------------------------------------------- 1 | class_name LiquidLayer 2 | extends Area 3 | 4 | export(float) var buoyancy_factor = 10.0 5 | export(float) var lateral_damping_factor = 0.0 6 | export(float) var vertical_damping_factor = 0.0 7 | 8 | var buoyancy_dict := {} 9 | 10 | func _init() -> void: 11 | connect("body_shape_entered", self, "body_shape_entered") 12 | connect("body_shape_exited", self, "body_shape_exited") 13 | 14 | func body_shape_entered(body_id, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 15 | if not body is RigidBody: 16 | return 17 | 18 | var self_collision_shape = shape_owner_get_owner(shape_find_owner(self_shape_idx)) 19 | var body_collision_shape = body.shape_owner_get_owner(body.shape_find_owner(body_shape_idx)) 20 | 21 | var self_shape = self_collision_shape.get_shape() 22 | var body_shape = body_collision_shape.get_shape() 23 | 24 | var self_aabb = create_shape_aabb(self_shape) 25 | var body_aabb = create_shape_aabb(body_shape) 26 | 27 | buoyancy_dict[body] = { 28 | 'entry_point': body.global_transform.origin, 29 | 'self_aabb': self_aabb, 30 | 'body_aabb': body_aabb 31 | } 32 | 33 | func body_shape_exited(body_id, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 34 | if body in buoyancy_dict: 35 | buoyancy_dict.erase(body) 36 | 37 | func create_shape_aabb(shape: Shape) -> AABB: 38 | if shape is ConvexPolygonShape: 39 | return create_convex_aabb(shape) 40 | elif shape is SphereShape: 41 | return create_sphere_aabb(shape) 42 | 43 | return AABB() 44 | 45 | func create_convex_aabb(convex_shape: ConvexPolygonShape) -> AABB: 46 | var points = convex_shape.get_points() 47 | var aabb = null 48 | 49 | for point in points: 50 | if not aabb: 51 | aabb = AABB(point, Vector3.ZERO) 52 | else: 53 | aabb = aabb.expand(point) 54 | 55 | return aabb 56 | 57 | func create_sphere_aabb(sphere_shape: SphereShape) -> AABB: 58 | return AABB(-Vector3.ONE * sphere_shape.radius, Vector3.ONE * sphere_shape.radius) 59 | 60 | func _physics_process(delta: float) -> void: 61 | for body in buoyancy_dict: 62 | var buoyancy_data = buoyancy_dict[body] 63 | 64 | var self_aabb = buoyancy_data['self_aabb'] 65 | self_aabb.position += global_transform.origin 66 | 67 | var body_aabb = buoyancy_data['body_aabb'] 68 | body_aabb.position += body.global_transform.origin 69 | 70 | var displacement = self_aabb.end.y - body_aabb.position.y 71 | body.add_central_force(Vector3.UP * displacement * buoyancy_factor) 72 | body.add_central_force(Vector3(1, 0, 1) * body.get_linear_velocity() * displacement * -lateral_damping_factor) 73 | body.add_central_force(Vector3(0, 1, 0) * body.get_linear_velocity() * -vertical_damping_factor) 74 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/lava.gd: -------------------------------------------------------------------------------- 1 | class_name LavaLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 6.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 4.0 8 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/lava.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/worldspawn_layer.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/worldspawn_layers/liquid/lava.gd" type="Script" id=2] 5 | 6 | [resource] 7 | resource_name = "Lava Layer" 8 | script = ExtResource( 1 ) 9 | name = "lava" 10 | texture = "layers/lava" 11 | node_class = "Area" 12 | build_visuals = true 13 | collision_shape_type = 1 14 | script_class = ExtResource( 2 ) 15 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/slime.gd: -------------------------------------------------------------------------------- 1 | class_name SlimeLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 6.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 0.4 8 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/slime.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/worldspawn_layer.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/worldspawn_layers/liquid/slime.gd" type="Script" id=2] 5 | 6 | [resource] 7 | resource_name = "Slime Layer" 8 | script = ExtResource( 1 ) 9 | name = "slime" 10 | texture = "layers/slime" 11 | node_class = "Area" 12 | build_visuals = true 13 | collision_shape_type = 1 14 | script_class = ExtResource( 2 ) 15 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/water.gd: -------------------------------------------------------------------------------- 1 | class_name WaterLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 10.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 0.3 8 | -------------------------------------------------------------------------------- /addons/qodot/game_definitions/worldspawn_layers/liquid/water.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Resource" load_steps=3 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/src/resources/worldspawn_layer.gd" type="Script" id=1] 4 | [ext_resource path="res://addons/qodot/game_definitions/worldspawn_layers/liquid/water.gd" type="Script" id=2] 5 | 6 | 7 | [resource] 8 | resource_name = "Water Layer" 9 | script = ExtResource( 1 ) 10 | name = "water" 11 | texture = "layers/water" 12 | node_class = "Area" 13 | build_visuals = true 14 | collision_shape_type = 1 15 | script_class = ExtResource( 2 ) 16 | -------------------------------------------------------------------------------- /addons/qodot/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/icon.png -------------------------------------------------------------------------------- /addons/qodot/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-353bd8972b0605ff875108a1020d45cf.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://addons/qodot/icon.png" 13 | dest_files=[ "res://.import/icon.png-353bd8972b0605ff875108a1020d45cf.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /addons/qodot/icons/icon_qodot_node.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 50 | 54 | 55 | 57 | 58 | 60 | image/svg+xml 61 | 63 | 64 | 65 | 66 | 67 | 72 | 76 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /addons/qodot/icons/icon_qodot_node.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon_qodot_node.svg-f8e16c942b65e8e6f4c6a84d045cdcc4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://addons/qodot/icons/icon_qodot_node.svg" 13 | dest_files=[ "res://.import/icon_qodot_node.svg-f8e16c942b65e8e6f4c6a84d045cdcc4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /addons/qodot/icons/icon_qodot_spatial.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 50 | 54 | 55 | 57 | 58 | 60 | image/svg+xml 61 | 63 | 64 | 65 | 66 | 67 | 72 | 75 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /addons/qodot/icons/icon_qodot_spatial.svg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon_qodot_spatial.svg-91f1f2e27df14634856923a4b57ca0ff.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://addons/qodot/icons/icon_qodot_spatial.svg" 13 | dest_files=[ "res://.import/icon_qodot_spatial.svg-91f1f2e27df14634856923a4b57ca0ff.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /addons/qodot/palette.lmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/palette.lmp -------------------------------------------------------------------------------- /addons/qodot/palette.lmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="qodot.palette" 4 | type="Resource" 5 | path="res://.import/palette.lmp-607fece05ca2e6d7092d2b1487763816.tres" 6 | 7 | [deps] 8 | 9 | source_file="res://addons/qodot/palette.lmp" 10 | dest_files=[ "res://.import/palette.lmp-607fece05ca2e6d7092d2b1487763816.tres" ] 11 | 12 | [params] 13 | 14 | -------------------------------------------------------------------------------- /addons/qodot/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="Qodot" 4 | description="Quake .map file support for Godot." 5 | author="Shifty" 6 | version="1.7.1" 7 | script="src/qodot_plugin.gd" 8 | -------------------------------------------------------------------------------- /addons/qodot/src/import_plugins/quake_map_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeMapImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | # Quake .map import plugin 6 | 7 | func get_importer_name() -> String: 8 | return 'qodot.map' 9 | 10 | func get_visible_name() -> String: 11 | return 'Quake Map' 12 | 13 | func get_resource_type() -> String: 14 | return 'Resource' 15 | 16 | func get_recognized_extensions() -> Array: 17 | return ['map'] 18 | 19 | func get_save_extension() -> String: 20 | return 'tres' 21 | 22 | func get_import_options(preset) -> Array: 23 | return [] 24 | 25 | func get_preset_count() -> int: 26 | return 0 27 | 28 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 29 | var save_path_str = '%s.%s' % [save_path, get_save_extension()] 30 | 31 | var map_resource : QuakeMapFile = null 32 | 33 | var existing_resource := load(save_path_str) as QuakeMapFile 34 | if(existing_resource != null): 35 | map_resource = existing_resource 36 | map_resource.revision += 1 37 | else: 38 | map_resource = QuakeMapFile.new() 39 | 40 | return ResourceSaver.save(save_path_str, map_resource) 41 | -------------------------------------------------------------------------------- /addons/qodot/src/import_plugins/quake_palette_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakePaletteImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | # Quake .map import plugin 6 | 7 | func get_importer_name() -> String: 8 | return 'qodot.palette' 9 | 10 | func get_visible_name() -> String: 11 | return 'Quake Palette' 12 | 13 | func get_resource_type() -> String: 14 | return 'Resource' 15 | 16 | func get_recognized_extensions() -> Array: 17 | return ['lmp'] 18 | 19 | func get_save_extension() -> String: 20 | return 'tres' 21 | 22 | func get_import_options(preset) -> Array: 23 | return [] 24 | 25 | func get_preset_count() -> int: 26 | return 0 27 | 28 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 29 | var save_path_str : String = '%s.%s' % [save_path, get_save_extension()] 30 | 31 | var file := File.new() 32 | var err : int = file.open(source_file, File.READ) 33 | 34 | if err != OK: 35 | print(['Error opening .lmp file: ', err]) 36 | return err 37 | 38 | var colors := PoolColorArray() 39 | 40 | while true: 41 | var red : int = file.get_8() 42 | var green : int = file.get_8() 43 | var blue : int = file.get_8() 44 | var color := Color(red / 255.0, green / 255.0, blue / 255.0) 45 | 46 | colors.append(color) 47 | 48 | if file.eof_reached(): 49 | break 50 | 51 | if colors.size() == 256: 52 | break 53 | 54 | var palette_resource := QuakePaletteFile.new(colors) 55 | 56 | return ResourceSaver.save(save_path_str, palette_resource) 57 | -------------------------------------------------------------------------------- /addons/qodot/src/import_plugins/quake_wad_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeWadImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | enum WadEntryType { 6 | Palette = 0x40, 7 | SBarPic = 0x42, 8 | MipsTexture = 0x44, 9 | ConsolePic = 0x45 10 | } 11 | 12 | const TEXTURE_NAME_LENGTH := 16 13 | const MAX_MIP_LEVELS := 4 14 | 15 | func get_importer_name() -> String: 16 | return 'qodot.wad' 17 | 18 | func get_visible_name() -> String: 19 | return 'Quake Texture WAD' 20 | 21 | func get_resource_type() -> String: 22 | return 'Resource' 23 | 24 | func get_recognized_extensions() -> Array: 25 | return ['wad'] 26 | 27 | func get_save_extension() -> String: 28 | return 'tres' 29 | 30 | func get_import_options(preset) -> Array: 31 | return [ 32 | { 33 | 'name': 'palette_file', 34 | 'default_value': 'res://addons/qodot/palette.lmp', 35 | 'property_hint': PROPERTY_HINT_FILE, 36 | 'hint_string': '*.lmp' 37 | } 38 | ] 39 | 40 | func get_option_visibility(option: String, options: Dictionary) -> bool: 41 | return true 42 | 43 | func get_preset_count() -> int: 44 | return 0 45 | 46 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 47 | var save_path_str : String = '%s.%s' % [save_path, get_save_extension()] 48 | 49 | var file := File.new() 50 | var err : int = file.open(source_file, File.READ) 51 | 52 | if err != OK: 53 | print(['Error opening .wad file: ', err]) 54 | return err 55 | 56 | var palette_path : String = options['palette_file'] 57 | var palette_file : QuakePaletteFile = load(palette_path) as QuakePaletteFile 58 | if not palette_file: 59 | print('Error: Invalid palette file') 60 | return ERR_CANT_ACQUIRE_RESOURCE 61 | 62 | # Read WAD header 63 | var magic : PoolByteArray = file.get_buffer(4) 64 | var magic_string : String = magic.get_string_from_ascii() 65 | 66 | if(magic_string != 'WAD2'): 67 | print('Error: Invalid WAD magic') 68 | return ERR_INVALID_DATA 69 | 70 | var num_entries : int = file.get_32() 71 | var dir_offset : int = file.get_32() 72 | 73 | # Read entry list 74 | file.seek(0) 75 | file.seek(dir_offset) 76 | 77 | var entries : Array = [] 78 | 79 | for entry_idx in range(0, num_entries): 80 | var offset : int = file.get_32() 81 | var in_wad_size : int = file.get_32() 82 | var size : int = file.get_32() 83 | var type : int = file.get_8() 84 | var compression : int = file.get_8() 85 | var unknown : int = file.get_16() 86 | var name : PoolByteArray = file.get_buffer(TEXTURE_NAME_LENGTH) 87 | var name_string : String = name.get_string_from_ascii() 88 | 89 | if type == WadEntryType.MipsTexture: 90 | entries.append([ 91 | offset, 92 | in_wad_size, 93 | size, 94 | type, 95 | compression, 96 | name_string 97 | ]) 98 | 99 | # Read mip textures 100 | var texture_data_array: Array = [] 101 | for entry in entries: 102 | var offset : int = entry[0] 103 | file.seek(0) 104 | file.seek(offset) 105 | 106 | var name : PoolByteArray = file.get_buffer(TEXTURE_NAME_LENGTH) 107 | var name_string : String = name.get_string_from_ascii() 108 | 109 | var width : int = file.get_32() 110 | var height : int = file.get_32() 111 | 112 | var mip_offsets : Array = [] 113 | for idx in range(0, MAX_MIP_LEVELS): 114 | mip_offsets.append(file.get_32()) 115 | 116 | var num_pixels : int = width * height 117 | texture_data_array.append([name_string, width, height, file.get_buffer(num_pixels)]) 118 | 119 | # Create texture resources 120 | var textures : Dictionary = {} 121 | 122 | for texture_data in texture_data_array: 123 | var name : String = texture_data[0] 124 | var width : int = texture_data[1] 125 | var height : int = texture_data[2] 126 | var pixels : PoolByteArray = texture_data[3] 127 | 128 | var pixels_rgb := PoolByteArray() 129 | for palette_color in pixels: 130 | var rgb_color := palette_file.colors[palette_color] as Color 131 | pixels_rgb.append(rgb_color.r8) 132 | pixels_rgb.append(rgb_color.g8) 133 | pixels_rgb.append(rgb_color.b8) 134 | 135 | var texture_image := Image.new() 136 | texture_image.create_from_data(width, height, false, Image.FORMAT_RGB8, pixels_rgb) 137 | 138 | var texture := ImageTexture.new() 139 | texture.create_from_image(texture_image, Texture.FLAG_MIPMAPS | Texture.FLAG_REPEAT | Texture.FLAG_ANISOTROPIC_FILTER) 140 | 141 | textures[name] = texture 142 | 143 | # Save WAD resource 144 | var wad_resource := QuakeWadFile.new(textures) 145 | return ResourceSaver.save(save_path_str, wad_resource) 146 | -------------------------------------------------------------------------------- /addons/qodot/src/nodes/qodot_entity.gd: -------------------------------------------------------------------------------- 1 | class_name QodotEntity 2 | extends QodotSpatial 3 | 4 | export(Dictionary) var properties setget set_properties 5 | 6 | func set_properties(new_properties : Dictionary) -> void: 7 | if(properties != new_properties): 8 | properties = new_properties 9 | update_properties() 10 | 11 | func update_properties() -> void: 12 | pass 13 | 14 | func get_class() -> String: 15 | return 'QodotEntity' 16 | -------------------------------------------------------------------------------- /addons/qodot/src/nodes/qodot_spatial.gd: -------------------------------------------------------------------------------- 1 | class_name QodotSpatial, 'res://addons/qodot/icons/icon_qodot_spatial.svg' 2 | extends Spatial 3 | 4 | func get_class() -> String: 5 | return 'QodotSpatial' 6 | -------------------------------------------------------------------------------- /addons/qodot/src/qodot_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QodotPlugin 2 | extends EditorPlugin 3 | tool 4 | 5 | var map_import_plugin : QuakeMapImportPlugin = null 6 | var palette_import_plugin : QuakePaletteImportPlugin = null 7 | var wad_import_plugin : QuakeWadImportPlugin = null 8 | 9 | var qodot_map_control: Control = null 10 | var qodot_map_progress_bar: Control = null 11 | var edited_object_ref: WeakRef = weakref(null) 12 | 13 | var http_request: HTTPRequest = null 14 | 15 | func get_plugin_name() -> String: 16 | return "Qodot" 17 | 18 | func handles(object: Object) -> bool: 19 | return object is QodotMap 20 | 21 | func edit(object: Object) -> void: 22 | edited_object_ref = weakref(object) 23 | 24 | func make_visible(visible: bool) -> void: 25 | if qodot_map_control: 26 | qodot_map_control.set_visible(visible) 27 | 28 | if qodot_map_progress_bar: 29 | qodot_map_progress_bar.set_visible(visible) 30 | 31 | func _enter_tree() -> void: 32 | # Project settings 33 | setup_project_settings() 34 | 35 | # Import plugins 36 | map_import_plugin = QuakeMapImportPlugin.new() 37 | palette_import_plugin = QuakePaletteImportPlugin.new() 38 | wad_import_plugin = QuakeWadImportPlugin.new() 39 | 40 | add_import_plugin(map_import_plugin) 41 | add_import_plugin(palette_import_plugin) 42 | add_import_plugin(wad_import_plugin) 43 | 44 | # QodotMap button 45 | qodot_map_control = create_qodot_map_control() 46 | qodot_map_control.set_visible(false) 47 | add_control_to_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, qodot_map_control) 48 | 49 | qodot_map_progress_bar = create_qodot_map_progress_bar() 50 | qodot_map_progress_bar.set_visible(false) 51 | add_control_to_container(EditorPlugin.CONTAINER_PROPERTY_EDITOR_BOTTOM, qodot_map_progress_bar) 52 | 53 | # Download libraries 54 | http_request = HTTPRequest.new() 55 | http_request.use_threads = true 56 | add_child(http_request) 57 | 58 | QodotDependencies.check_dependencies(http_request) 59 | 60 | func _exit_tree() -> void: 61 | remove_import_plugin(map_import_plugin) 62 | remove_import_plugin(palette_import_plugin) 63 | remove_import_plugin(wad_import_plugin) 64 | map_import_plugin = null 65 | palette_import_plugin = null 66 | wad_import_plugin = null 67 | 68 | remove_control_from_container(EditorPlugin.CONTAINER_SPATIAL_EDITOR_MENU, qodot_map_control) 69 | qodot_map_control.queue_free() 70 | qodot_map_control = null 71 | 72 | remove_control_from_container(EditorPlugin.CONTAINER_PROPERTY_EDITOR_BOTTOM, qodot_map_progress_bar) 73 | qodot_map_progress_bar.queue_free() 74 | qodot_map_progress_bar = null 75 | 76 | remove_child(http_request) 77 | http_request.queue_free() 78 | 79 | func setup_project_settings() -> void: 80 | try_add_project_setting('qodot/textures/normal_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.NORMAL]) 81 | try_add_project_setting('qodot/textures/metallic_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.METALLIC]) 82 | try_add_project_setting('qodot/textures/roughness_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.ROUGHNESS]) 83 | try_add_project_setting('qodot/textures/emission_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.EMISSION]) 84 | try_add_project_setting('qodot/textures/ao_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.AO]) 85 | try_add_project_setting('qodot/textures/depth_pattern', TYPE_STRING, QodotTextureLoader.PBR_SUFFIX_PATTERNS[QodotTextureLoader.PBRSuffix.DEPTH]) 86 | 87 | func try_add_project_setting(name: String, type: int, value, info: Dictionary = {}) -> void: 88 | if not ProjectSettings.has_setting(name): 89 | add_project_setting(name, type, value, info) 90 | 91 | func add_project_setting(name: String, type: int, value, info: Dictionary = {}) -> void: 92 | ProjectSettings.set(name, value) 93 | 94 | var info_dict := info.duplicate() 95 | info_dict['name'] = name 96 | info_dict['type'] = type 97 | 98 | ProjectSettings.add_property_info(info_dict) 99 | ProjectSettings.set_initial_value(name, value) 100 | 101 | func create_qodot_map_control() -> Control: 102 | var separator = VSeparator.new() 103 | 104 | var icon = TextureRect.new() 105 | icon.texture = preload("res://addons/qodot/icons/icon_qodot_spatial.svg") 106 | icon.size_flags_vertical = Control.SIZE_SHRINK_CENTER 107 | 108 | var quick_build_button = ToolButton.new() 109 | quick_build_button.text = "Quick Build" 110 | quick_build_button.connect("pressed", self, "qodot_map_quick_build") 111 | 112 | var full_build_button = ToolButton.new() 113 | full_build_button.text = "Full Build" 114 | full_build_button.connect("pressed", self, "qodot_map_full_build") 115 | 116 | var unwrap_uv2_button = ToolButton.new() 117 | unwrap_uv2_button.text = "Unwrap UV2" 118 | unwrap_uv2_button.connect("pressed", self, "qodot_map_unwrap_uv2") 119 | 120 | var control = HBoxContainer.new() 121 | control.add_child(separator) 122 | control.add_child(icon) 123 | control.add_child(quick_build_button) 124 | control.add_child(full_build_button) 125 | control.add_child(unwrap_uv2_button) 126 | 127 | return control 128 | 129 | func create_qodot_map_progress_bar() -> Control: 130 | var progress_label = Label.new() 131 | progress_label.name = "ProgressLabel" 132 | progress_label.align = Label.ALIGN_LEFT 133 | progress_label.valign = Label.VALIGN_CENTER 134 | 135 | var progress_bar = ProgressBar.new() 136 | progress_bar.name = "ProgressBar" 137 | progress_bar.percent_visible = false 138 | progress_bar.min_value = 0.0 139 | progress_bar.max_value = 1.0 140 | progress_bar.rect_min_size.y = 30 141 | progress_bar.set_anchors_and_margins_preset(Control.PRESET_WIDE) 142 | progress_bar.add_child(progress_label) 143 | progress_label.set_anchors_and_margins_preset(Control.PRESET_WIDE) 144 | progress_label.margin_top = -9 145 | progress_label.margin_left = 3 146 | 147 | return progress_bar 148 | 149 | 150 | func qodot_map_quick_build() -> void: 151 | var edited_object = edited_object_ref.get_ref() 152 | if not edited_object: 153 | return 154 | 155 | if not edited_object is QodotMap: 156 | return 157 | 158 | edited_object.should_add_children = true 159 | edited_object.should_set_owners = false 160 | 161 | set_qodot_map_control_disabled(true) 162 | edited_object.connect("build_progress", self, "qodot_map_build_progress") 163 | edited_object.connect("build_complete", self, "qodot_map_build_complete", [edited_object]) 164 | edited_object.connect("build_failed", self, "qodot_map_build_complete", [edited_object]) 165 | 166 | edited_object.verify_and_build() 167 | 168 | func qodot_map_full_build() -> void: 169 | var edited_object = edited_object_ref.get_ref() 170 | if not edited_object: 171 | return 172 | 173 | if not edited_object is QodotMap: 174 | return 175 | 176 | edited_object.should_add_children = true 177 | edited_object.should_set_owners = true 178 | 179 | set_qodot_map_control_disabled(true) 180 | edited_object.connect("build_progress", self, "qodot_map_build_progress") 181 | edited_object.connect("build_complete", self, "qodot_map_build_complete", [edited_object]) 182 | edited_object.connect("build_failed", self, "qodot_map_build_complete", [edited_object]) 183 | 184 | edited_object.verify_and_build() 185 | 186 | func qodot_map_unwrap_uv2() -> void: 187 | var edited_object = edited_object_ref.get_ref() 188 | if not edited_object: 189 | return 190 | 191 | if not edited_object is QodotMap: 192 | return 193 | 194 | set_qodot_map_control_disabled(true) 195 | edited_object.connect("unwrap_uv2_complete", self, "qodot_map_build_complete", [edited_object]) 196 | 197 | edited_object.unwrap_uv2() 198 | 199 | func set_qodot_map_control_disabled(disabled: bool) -> void: 200 | if not qodot_map_control: 201 | return 202 | 203 | for child in qodot_map_control.get_children(): 204 | if child is ToolButton: 205 | child.set_disabled(disabled) 206 | 207 | func qodot_map_build_progress(step: String, progress: float) -> void: 208 | var progress_label = qodot_map_progress_bar.get_node("ProgressLabel") 209 | qodot_map_progress_bar.value = progress 210 | progress_label.text = step.capitalize() 211 | 212 | func qodot_map_build_complete(qodot_map: QodotMap) -> void: 213 | var progress_label = qodot_map_progress_bar.get_node("ProgressLabel") 214 | progress_label.text = "Build Complete" 215 | 216 | set_qodot_map_control_disabled(false) 217 | 218 | if qodot_map.is_connected("build_progress", self, "qodot_map_build_progress"): 219 | qodot_map.disconnect("build_progress", self, "qodot_map_build_progress") 220 | 221 | if qodot_map.is_connected("build_complete", self, "qodot_map_build_complete"): 222 | qodot_map.disconnect("build_complete", self, "qodot_map_build_complete") 223 | 224 | if qodot_map.is_connected("build_failed", self, "qodot_map_build_complete"): 225 | qodot_map.disconnect("build_failed", self, "qodot_map_build_complete") 226 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_base_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDBaseClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | func _init() -> void: 6 | prefix = "@BaseClass" 7 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDClass 2 | extends Resource 3 | 4 | var prefix: String = "" 5 | 6 | export(String) var class_options : String = QodotUtil.CATEGORY_STRING 7 | 8 | export(String) var classname := "" 9 | 10 | export(String) var description := "" 11 | 12 | export(bool) var qodot_internal := false 13 | 14 | export(Array, Resource) var base_classes := [] 15 | 16 | export(Dictionary) var class_properties := {} 17 | 18 | export(Dictionary) var class_property_descriptions := {} 19 | 20 | export(Dictionary) var meta_properties := { 21 | "size": AABB(Vector3(-8, -8, -8), Vector3(8, 8, 8)), 22 | "color": Color(0.8, 0.8, 0.8) 23 | } 24 | 25 | export(String) var node_options : String = QodotUtil.CATEGORY_STRING 26 | 27 | export(String) var node_class := "" 28 | 29 | export(bool) var transient_node := false 30 | 31 | func build_def_text() -> String: 32 | # Class prefix 33 | var res : String = prefix 34 | 35 | # Meta properties 36 | var base_str = "" 37 | var meta_props = meta_properties.duplicate() 38 | 39 | for base_class in base_classes: 40 | if not 'classname' in base_class: 41 | continue 42 | 43 | base_str += base_class.classname 44 | 45 | if base_class != base_classes.back(): 46 | base_str += ", " 47 | 48 | if base_str != "": 49 | meta_props['base'] = base_str 50 | 51 | for prop in meta_props: 52 | var value = meta_props[prop] 53 | res += " " + prop + "(" 54 | 55 | if value is AABB: 56 | res += "%s %s %s, %s %s %s" % [ 57 | value.position.x, 58 | value.position.y, 59 | value.position.z, 60 | value.size.x, 61 | value.size.y, 62 | value.size.z 63 | ] 64 | elif value is Color: 65 | res += "%s %s %s" % [ 66 | value.r8, 67 | value.g8, 68 | value.b8 69 | ] 70 | elif value is String: 71 | res += value 72 | 73 | res += ")" 74 | 75 | res += " = " + classname 76 | 77 | var normalized_description = description.replace("\n", " ").strip_edges() 78 | if normalized_description != "": 79 | res += " : \"%s\" " % [normalized_description] 80 | 81 | res += "[" + QodotUtil.newline() 82 | 83 | # Class properties 84 | for prop in class_properties: 85 | var value = class_properties[prop] 86 | 87 | var prop_val = null 88 | var prop_type := "" 89 | var prop_description: String = class_property_descriptions[prop] if prop in class_property_descriptions else "" 90 | 91 | if value is int: 92 | prop_type = "integer" 93 | prop_val = String(value) 94 | elif value is float: 95 | prop_type = "float" 96 | prop_val = String(value) 97 | elif value is String: 98 | prop_type = "string" 99 | prop_val = "\"" + value + "\"" 100 | elif value is Vector3: 101 | prop_type = "string" 102 | prop_val = "\"%s %s %s\"" % [ 103 | value.x, 104 | value.y, 105 | value.z 106 | ] 107 | elif value is Color: 108 | prop_type = "color255" 109 | prop_val = "\"%s %s %s\"" % [ 110 | value.r8, 111 | value.g8, 112 | value.b8 113 | ] 114 | elif value is Dictionary: 115 | prop_type = "choices" 116 | prop_val = "[" + "\n" 117 | for choice in value: 118 | var choice_val = value[choice] 119 | prop_val += "\t\t" + String(choice_val) + " : \"" + choice + "\"\n" 120 | prop_val += "\t]" 121 | elif value is Array: 122 | prop_type = "flags" 123 | prop_val = "[" + "\n" 124 | for arr_val in value: 125 | prop_val += "\t\t" + String(arr_val[1]) + " : \"" + String(arr_val[0]) + "\" : " + ("1" if arr_val[2] else "0") + "\n" 126 | prop_val += "\t]" 127 | elif value is NodePath: 128 | prop_type = "target_destination" 129 | elif value is Object: 130 | prop_type = "target_source" 131 | 132 | if(prop_val): 133 | res += "\t" 134 | res += prop 135 | res += "(" 136 | res += prop_type 137 | res += ")" 138 | 139 | if not value is Array: 140 | res += " : \"" 141 | res += prop_description 142 | res += "\" " 143 | 144 | if value is Dictionary or value is Array: 145 | res += " = " 146 | else: 147 | res += " : " 148 | 149 | res += prop_val 150 | res += QodotUtil.newline() 151 | 152 | res += "]" + QodotUtil.newline() 153 | 154 | return res 155 | 156 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_file.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDFile 2 | extends Resource 3 | tool 4 | 5 | ## A node used to to express a set of entity definitions that can be exproted 6 | 7 | #psuedo-button to export 8 | export(bool) var export_file : bool setget set_export_file 9 | export(String, DIR, GLOBAL) var target_folder : String 10 | export(String) var fgd_name : String = "Qodot" 11 | export(Array, Resource) var base_fgd_files := [] 12 | export(Array, Resource) var entity_definitions := [ 13 | preload("res://addons/qodot/game_definitions/fgd/solid_classes/worldspawn_solid_class.tres"), 14 | preload("res://addons/qodot/game_definitions/fgd/solid_classes/group_solid_class.tres"), 15 | preload("res://addons/qodot/game_definitions/fgd/solid_classes/detail_solid_class.tres"), 16 | preload("res://addons/qodot/game_definitions/fgd/solid_classes/illusionary_solid_class.tres"), 17 | preload("res://addons/qodot/game_definitions/fgd/solid_classes/worldspawn_solid_class.tres"), 18 | preload("res://addons/qodot/game_definitions/fgd/base_classes/light_base_class.tres"), 19 | preload("res://addons/qodot/game_definitions/fgd/point_classes/light_point_class.tres"), 20 | ] 21 | 22 | func set_export_file(new_export_file = true) -> void: 23 | if new_export_file != export_file: 24 | if Engine.is_editor_hint() and get_fgd_classes().size() > 0: 25 | if not target_folder: 26 | print("Skipping export: No target folder") 27 | return 28 | 29 | if fgd_name == "": 30 | print("Skipping export: Empty FGD name") 31 | 32 | var fgd_file = target_folder + "/" + fgd_name + ".fgd" 33 | 34 | print("Exporting FGD to ", fgd_file) 35 | var file_obj := File.new() 36 | file_obj.open(fgd_file, File.WRITE) 37 | file_obj.store_string(build_class_text()) 38 | file_obj.close() 39 | 40 | func build_class_text() -> String: 41 | var res : String = "" 42 | 43 | for base_fgd in base_fgd_files: 44 | res += base_fgd.build_class_text() 45 | 46 | var entities = get_fgd_classes() 47 | for ent in entities: 48 | if ent.qodot_internal: 49 | continue 50 | var ent_text = ent.build_def_text() 51 | res += ent_text 52 | if ent != entities[-1]: 53 | res += "\n" 54 | return res 55 | 56 | #This getter does a little bit of validation. Providing only an array of non-null uniquely-named entity definitions 57 | func get_fgd_classes() -> Array: 58 | var res : Array = [] 59 | for cur_ent_def_ind in range(entity_definitions.size()): 60 | var cur_ent_def = entity_definitions[cur_ent_def_ind] 61 | if cur_ent_def == null: 62 | continue 63 | elif not (cur_ent_def is QodotFGDClass): 64 | printerr("Bad value in entity definition set at position %s! Not an entity defintion." % cur_ent_def_ind) 65 | continue 66 | res.append(cur_ent_def) 67 | return res 68 | 69 | func get_entity_definitions() -> Dictionary: 70 | var res : Dictionary = {} 71 | 72 | for base_fgd in base_fgd_files: 73 | var fgd_res = base_fgd.get_entity_definitions() 74 | for key in fgd_res: 75 | res[key] = fgd_res[key] 76 | 77 | for ent in get_fgd_classes(): 78 | if ent is QodotFGDPointClass or ent is QodotFGDSolidClass: 79 | var entity_def = ent.duplicate() 80 | var meta_properties := {} 81 | var class_properties := {} 82 | var class_property_descriptions := {} 83 | 84 | for base_class in entity_def.base_classes: 85 | for meta_property in base_class.meta_properties: 86 | meta_properties[meta_property] = base_class.meta_properties[meta_property] 87 | 88 | for class_property in base_class.class_properties: 89 | class_properties[class_property] = base_class.class_properties[class_property] 90 | 91 | for class_property_desc in base_class.class_property_descriptions: 92 | class_property_descriptions[class_property_desc] = base_class.class_property_descriptions[class_property_desc] 93 | 94 | for meta_property in entity_def.meta_properties: 95 | meta_properties[meta_property] = entity_def.meta_properties[meta_property] 96 | 97 | for class_property in entity_def.class_properties: 98 | class_properties[class_property] = entity_def.class_properties[class_property] 99 | 100 | for class_property_desc in entity_def.class_property_descriptions: 101 | class_property_descriptions[class_property_desc] = entity_def.class_property_descriptions[class_property_desc] 102 | 103 | entity_def.meta_properties = meta_properties 104 | entity_def.class_properties = class_properties 105 | entity_def.class_property_descriptions = class_property_descriptions 106 | 107 | res[ent.classname] = entity_def 108 | return res 109 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDPointClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | func _init() -> void: 6 | prefix = "@PointClass" 7 | 8 | export(String) var scene : String = QodotUtil.CATEGORY_STRING 9 | 10 | # The scene file to associate with this PointClass 11 | # On building the map, this scene will be instanced into the scene tree 12 | export(PackedScene) var scene_file : PackedScene 13 | 14 | export(String) var scripting : String = QodotUtil.CATEGORY_STRING 15 | 16 | # The script file to associate with this PointClass 17 | # On building the map, this will be attached to any brush entities created 18 | # via this classname if no scene_file is specified 19 | export(Script) var script_class : Script 20 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDSolidClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | enum SpawnType { 6 | WORLDSPAWN = 0, 7 | MERGE_WORLDSPAWN = 1, 8 | ENTITY = 2, 9 | GROUP = 3 10 | } 11 | 12 | enum CollisionShapeType { 13 | NONE, 14 | CONVEX, 15 | CONCAVE 16 | } 17 | 18 | # Controls whether a given SolidClass is the worldspawn, is combined with the worldspawn, 19 | # or is spawned as its own free-standing entity 20 | export(String) var spawn : String = QodotUtil.CATEGORY_STRING 21 | export(SpawnType) var spawn_type : int = SpawnType.ENTITY 22 | 23 | # Controls how visuals are built for this SolidClass 24 | export(String) var visual_build : String = QodotUtil.CATEGORY_STRING 25 | export(bool) var build_visuals := true 26 | 27 | # Controls how collisions are built for this SolidClass 28 | export(String) var collision_build : String = QodotUtil.CATEGORY_STRING 29 | export(CollisionShapeType) var collision_shape_type : int = CollisionShapeType.CONVEX 30 | 31 | # The script file to associate with this SolidClass 32 | # On building the map, this will be attached to any brush entities created 33 | # via this classname 34 | export(String) var scripting : String = QodotUtil.CATEGORY_STRING 35 | export(Script) var script_class : Script 36 | 37 | func _init() -> void: 38 | prefix = "@SolidClass" 39 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_face_attrib.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomFaceAttrib 2 | extends Resource 3 | 4 | export(String) var attrib_name : String 5 | export(String) var attrib_description : String 6 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_game_config_file.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomGameConfigFile 2 | extends Resource 3 | tool 4 | 5 | export(bool) var export_file : bool setget set_export_file 6 | export(String, FILE, GLOBAL, "*.cfg") var target_file : String 7 | 8 | export(String) var game_name := "Qodot" 9 | 10 | export(Array, Resource) var brush_tags : Array = [] 11 | export(Array, Resource) var face_tags : Array = [] 12 | export(Array, Resource) var face_attrib_surface_flags : Array = [] 13 | export(Array, Resource) var face_attrib_content_flags : Array = [] 14 | 15 | export(Array, String) var fgd_filenames : Array = [] 16 | 17 | var base_text: String = """{ 18 | version: 3, 19 | name: "%s", 20 | icon: "Icon.png", 21 | "fileformats": [ 22 | { "format": "Standard", "initialmap": "initial_standard.map" }, 23 | { "format": "Valve", "initialmap": "initial_valve.map" }, 24 | { "format": "Quake2", "initialmap": "initial_quake2.map" }, 25 | { "format": "Quake3" }, 26 | { "format": "Quake3 (legacy)" }, 27 | { "format": "Hexen2" }, 28 | { "format": "Daikatana" } 29 | ], 30 | "filesystem": { 31 | "searchpath": ".", 32 | "packageformat": { "extension": "pak", "format": "idpak" } 33 | }, 34 | "textures": { 35 | "package": { "type": "directory", "root": "textures" }, 36 | "format": { "extensions": ["bmp", "exr", "hdr", "jpeg", "jpg", "png", "tga", "webp"], "format": "image" }, 37 | "attribute": "_tb_textures" 38 | }, 39 | "entities": { 40 | "definitions": [ %s ], 41 | "defaultcolor": "0.6 0.6 0.6 1.0", 42 | "modelformats": [ "mdl", "md2", "md3", "bsp", "dkm" ] 43 | }, 44 | "tags": { 45 | "brush": [ 46 | %s 47 | ], 48 | "brushface": [ 49 | %s 50 | ] 51 | }, 52 | "faceattribs": { 53 | "surfaceflags": [ 54 | %s 55 | ], 56 | "contentflags": [ 57 | %s 58 | ] 59 | } 60 | } 61 | """ 62 | 63 | func set_export_file(new_export_file : bool = true) -> void: 64 | if new_export_file != export_file: 65 | if not Engine.is_editor_hint(): 66 | return 67 | 68 | if not target_file: 69 | print("Skipping export: No target file") 70 | return 71 | 72 | print("Exporting TrenchBroom Game Config File to ", target_file) 73 | var file_obj := File.new() 74 | file_obj.open(target_file, File.WRITE) 75 | file_obj.store_string(build_class_text()) 76 | file_obj.close() 77 | 78 | func build_class_text() -> String: 79 | var fgd_filename_str := "" 80 | for fgd_filename in fgd_filenames: 81 | fgd_filename_str += "\"%s\"" % fgd_filename 82 | if fgd_filename != fgd_filenames[-1]: 83 | fgd_filename_str += ", " 84 | 85 | var brush_tags_str = parse_tags(brush_tags) 86 | var face_tags_str = parse_tags(face_tags) 87 | var surface_flags_str = parse_flags(face_attrib_surface_flags) 88 | var content_flags_str = parse_flags(face_attrib_content_flags) 89 | 90 | return base_text % [ 91 | game_name, 92 | fgd_filename_str, 93 | brush_tags_str, 94 | face_tags_str, 95 | surface_flags_str, 96 | content_flags_str 97 | ] 98 | 99 | static func get_match_key(tag_match_type: int) -> String: 100 | var tag_keys = { 101 | 0: "texture", 102 | 1: "contentflag", 103 | 2: "surfaceflag", 104 | 3: "surfaceparm", 105 | 4: "classname" 106 | } 107 | 108 | return tag_keys[tag_match_type] 109 | 110 | func parse_tags(tags: Array) -> String: 111 | var tags_str := "" 112 | for brush_tag in tags: 113 | tags_str += "{\n" 114 | tags_str += "\t\t\t\t\"name\": \"%s\",\n" % brush_tag.tag_name 115 | 116 | var attribs_str := "" 117 | for brush_tag_attrib in brush_tag.tag_attributes: 118 | attribs_str += "\"%s\"" % brush_tag_attrib 119 | if brush_tag_attrib != brush_tag.tag_attributes[-1]: 120 | attribs_str += ", " 121 | 122 | tags_str += "\t\t\t\t\"attribs\": [ %s ],\n" % attribs_str 123 | 124 | tags_str += "\t\t\t\t\"match\": \"%s\",\n" % get_match_key(brush_tag.tag_match_type) 125 | tags_str += "\t\t\t\t\"pattern\": \"%s\"" % brush_tag.tag_pattern 126 | 127 | if brush_tag.texture_name != "": 128 | tags_str += ",\n" 129 | tags_str += "\t\t\t\t\"texture\": \"%s\"" % brush_tag.texture_name 130 | 131 | tags_str += "\n" 132 | 133 | tags_str += "\t\t\t}" 134 | 135 | if brush_tag != tags[-1]: 136 | tags_str += "," 137 | 138 | return tags_str 139 | 140 | func parse_flags(flags: Array) -> String: 141 | var flags_str := "" 142 | 143 | for attrib_flag in flags: 144 | flags_str += "{\n" 145 | flags_str += "\t\t\t\t\"name\": \"%s\",\n" % attrib_flag.attrib_name 146 | flags_str += "\t\t\t\t\"description\": \"%s\"\n" % attrib_flag.attrib_description 147 | flags_str += "\t\t\t}" 148 | if attrib_flag != flags[-1]: 149 | flags_str += "," 150 | 151 | return flags_str 152 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_game_config_folder.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomGameConfigFolder 2 | extends Resource 3 | tool 4 | 5 | ## A node used to to express a set of entity definitions that can be exproted 6 | 7 | #psuedo-button to export 8 | export(bool) var export_file : bool setget set_export_file 9 | export(String, DIR, GLOBAL) var trenchbroom_games_folder : String 10 | 11 | export(String) var game_name := "Qodot" 12 | export(Texture) var icon : Texture 13 | export(Resource) var game_config_file : Resource = preload("res://addons/qodot/game_definitions/trenchbroom/qodot_trenchbroom_config_file.tres") 14 | export(Array, Resource) var fgd_files : Array = [ 15 | preload("res://addons/qodot/game_definitions/fgd/qodot_fgd.tres") 16 | ] 17 | 18 | func _init() -> void: 19 | if not icon: 20 | if ResourceLoader.exists("res://icon.png"): 21 | icon = ResourceLoader.load("res://icon.png") 22 | 23 | func set_export_file(new_export_file : bool = true) -> void: 24 | if new_export_file != export_file: 25 | if Engine.is_editor_hint(): 26 | if not trenchbroom_games_folder: 27 | print("Skipping export: No TrenchBroom games folder") 28 | return 29 | 30 | var config_folder = trenchbroom_games_folder + "/" + game_name 31 | var config_dir = Directory.new() 32 | 33 | var err = config_dir.open(config_folder) 34 | if err != OK: 35 | print("Couldn't open directory, creating...") 36 | err = config_dir.make_dir(config_folder) 37 | if err != OK: 38 | print("Skipping export: Failed to create directory") 39 | return 40 | 41 | if not game_config_file: 42 | print("Skipping export: No game config file") 43 | return 44 | 45 | if fgd_files.size() == 0: 46 | print("Skipping export: No FGD files") 47 | return 48 | 49 | print("Exporting TrenchBroom Game Config Folder to ", config_folder) 50 | 51 | var icon_path : String = config_folder + "/Icon.png" 52 | 53 | print("Exporting icon to ", icon_path) 54 | 55 | var export_icon : Image = icon.get_data() 56 | export_icon.resize(32, 32, Image.INTERPOLATE_LANCZOS) 57 | export_icon.save_png(icon_path) 58 | 59 | var export_config_file: TrenchBroomGameConfigFile = game_config_file.duplicate() 60 | export_config_file.game_name = game_name 61 | export_config_file.target_file = config_folder + "/GameConfig.cfg" 62 | 63 | export_config_file.fgd_filenames = [] 64 | for fgd_file in fgd_files: 65 | export_config_file.fgd_filenames.append(fgd_file.fgd_name + ".fgd") 66 | 67 | export_config_file.set_export_file(true) 68 | 69 | for fgd_file in fgd_files: 70 | if not fgd_file is QodotFGDFile: 71 | print("Skipping %s: Not a valid FGD file" % [fgd_file]) 72 | 73 | var export_fgd : QodotFGDFile = fgd_file.duplicate() 74 | export_fgd.target_folder = config_folder 75 | export_fgd.set_export_file(true) 76 | 77 | print("Export complete\n") 78 | 79 | func build_class_text() -> String: 80 | return "" 81 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomTag 2 | extends Resource 3 | 4 | enum TagMatchType { 5 | TEXTURE, 6 | CONTENT_FLAG, 7 | SURFACE_FLAG, 8 | SURFACE_PARAM, 9 | CLASSNAME 10 | } 11 | 12 | export(String) var tag_name : String 13 | export(Array, String) var tag_attributes : Array 14 | export(TagMatchType) var tag_match_type : int 15 | export(String) var tag_pattern : String 16 | export(String) var texture_name : String 17 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/quake_map_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeMapFile 2 | extends Resource 3 | 4 | export(int) var revision := 0 5 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/quake_palette_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakePaletteFile 2 | extends Resource 3 | 4 | export(PoolColorArray) var colors : PoolColorArray 5 | 6 | func _init(colors) -> void: 7 | self.colors = colors 8 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/quake_wad_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeWadFile 2 | extends Resource 3 | 4 | export(Dictionary) var textures : Dictionary 5 | 6 | func _init(textures: Dictionary) -> void: 7 | self.textures = textures 8 | -------------------------------------------------------------------------------- /addons/qodot/src/resources/worldspawn_layer.gd: -------------------------------------------------------------------------------- 1 | class_name QodotWorldspawnLayer 2 | extends Resource 3 | 4 | export(String) var name := "" 5 | export(String) var texture := "" 6 | export(String) var node_class := "" 7 | export(bool) var build_visuals := true 8 | export(QodotFGDSolidClass.CollisionShapeType) var collision_shape_type := QodotFGDSolidClass.CollisionShapeType.CONVEX 9 | export(Script) var script_class = null 10 | 11 | func _init() -> void: 12 | resource_name = "Worldspawn Layer" 13 | -------------------------------------------------------------------------------- /addons/qodot/src/util/qodot_dependencies.gd: -------------------------------------------------------------------------------- 1 | class_name QodotDependencies 2 | 3 | const PROTOCOL := "https" 4 | const GITHUB_DOMAIN := "github.com" 5 | const GIT_USER := "QodotPlugin" 6 | const RELEASE_DOWNLOADS := "releases/download" 7 | const DEPENDENCY_TAG := "v1.7.0" 8 | 9 | static func get_platform_string() -> String: 10 | match OS.get_name(): 11 | "Windows": 12 | return "win64" 13 | "OSX": 14 | return "osx" 15 | "X11": 16 | return "x11" 17 | return "unsupported" 18 | 19 | static func get_platform_library_extension() -> String: 20 | match OS.get_name(): 21 | "Windows": 22 | return "dll" 23 | "OSX": 24 | return "dylib" 25 | "X11": 26 | return "so" 27 | return "unsupported" 28 | 29 | static func format_github_release_download_url(repo: String, artifact: String) -> String: 30 | return "%s://%s/%s/%s/%s/%s/%s" % [PROTOCOL, GITHUB_DOMAIN, GIT_USER, repo, RELEASE_DOWNLOADS, DEPENDENCY_TAG, artifact] 31 | 32 | static func get_dependencies() -> Dictionary: 33 | var platform_string := get_platform_string() 34 | var platform_extension := get_platform_library_extension() 35 | 36 | var libqodot_destination := "res://addons/qodot/bin/%s/libqodot.%s" % [platform_string, platform_extension] 37 | var libmap_destination := "res://addons/qodot/bin/%s/libmap.%s" % [platform_string, platform_extension] 38 | 39 | var libqodot_source := format_github_release_download_url("libqodot", "libqodot.%s" % get_platform_library_extension()) 40 | var libmap_source := format_github_release_download_url("libmap", "libmap.%s" % get_platform_library_extension()) 41 | 42 | return { 43 | libqodot_destination: libqodot_source, 44 | libmap_destination: libmap_source 45 | } 46 | 47 | static func check_dependencies(http_request: HTTPRequest) -> void: 48 | var dependencies = get_dependencies() 49 | for dependency in dependencies: 50 | if not check_dependency(http_request, dependency, dependencies[dependency]): 51 | var result = yield(http_request, "request_completed") 52 | match result[0]: 53 | HTTPRequest.RESULT_SUCCESS: 54 | match result[1]: 55 | 200: 56 | print("Download complete") 57 | _: 58 | print("Download failed") 59 | var dir = Directory.new() 60 | dir.remove(dependency) 61 | HTTPRequest.RESULT_CHUNKED_BODY_SIZE_MISMATCH: 62 | printerr("Error: Chunked body size mismatch") 63 | HTTPRequest.RESULT_CANT_CONNECT: 64 | printerr("Error: Unable to connect") 65 | HTTPRequest.RESULT_CANT_RESOLVE: 66 | printerr("Error: Unable to resolve host") 67 | HTTPRequest.RESULT_CONNECTION_ERROR: 68 | printerr("Error: Connection error") 69 | HTTPRequest.RESULT_SSL_HANDSHAKE_ERROR: 70 | printerr("Error: SSL handshake error") 71 | HTTPRequest.RESULT_NO_RESPONSE: 72 | printerr("Error: No response") 73 | HTTPRequest.RESULT_BODY_SIZE_LIMIT_EXCEEDED: 74 | printerr("Error: Request body size limit exceeded") 75 | HTTPRequest.RESULT_REQUEST_FAILED: 76 | printerr("Error: Request failed") 77 | HTTPRequest.RESULT_DOWNLOAD_FILE_CANT_OPEN: 78 | printerr("Error: Unable to open file") 79 | HTTPRequest.RESULT_DOWNLOAD_FILE_WRITE_ERROR: 80 | printerr("Error: Failed to write file") 81 | HTTPRequest.RESULT_REDIRECT_LIMIT_REACHED: 82 | printerr("Error: Redirect limit reached") 83 | HTTPRequest.RESULT_TIMEOUT: 84 | printerr("Error: Request timed out") 85 | 86 | static func check_dependency(http_request: HTTPRequest, dependency: String, url: String) -> bool: 87 | print("Checking dependency ", dependency) 88 | 89 | var dir = Directory.new() 90 | if dir.file_exists(dependency): 91 | print("Dependency satisfied") 92 | return true 93 | 94 | var dependency_comps = dependency.split("/") 95 | dependency_comps.resize(dependency_comps.size() - 1) 96 | var dependency_dir = dependency_comps.join("/") 97 | 98 | if not dir.dir_exists(dependency_dir): 99 | dir.make_dir_recursive(dependency_dir) 100 | 101 | print("Dependency unsatisfied, downloading from ", url) 102 | http_request.download_file = dependency 103 | var err = http_request.request(url); 104 | 105 | match err: 106 | OK: 107 | print("HTTP request created") 108 | ERR_UNCONFIGURED: 109 | printerr("Error: HTTP request unconfigured") 110 | ERR_BUSY: 111 | printerr("Error: HTTP request busy") 112 | ERR_INVALID_PARAMETER: 113 | printerr("Error: HTTP request invalid parameter") 114 | ERR_CANT_CONNECT: 115 | printerr("Error: HTTP request unable to connect") 116 | 117 | return false 118 | -------------------------------------------------------------------------------- /addons/qodot/src/util/qodot_texture_loader.gd: -------------------------------------------------------------------------------- 1 | class_name QodotTextureLoader 2 | 3 | const TEXTURE_EMPTY := '__TB_empty' # TrenchBroom empty texture string 4 | 5 | enum PBRSuffix { 6 | NORMAL, 7 | METALLIC, 8 | ROUGHNESS, 9 | EMISSION, 10 | AO, 11 | DEPTH 12 | } 13 | 14 | # Suffix string / Godot enum / SpatialMaterial property 15 | const PBR_SUFFIX_NAMES := { 16 | PBRSuffix.NORMAL: 'normal', 17 | PBRSuffix.METALLIC: 'metallic', 18 | PBRSuffix.ROUGHNESS: 'roughness', 19 | PBRSuffix.EMISSION: 'emission', 20 | PBRSuffix.AO: 'ao', 21 | PBRSuffix.DEPTH: 'depth', 22 | } 23 | 24 | const PBR_SUFFIX_PATTERNS := { 25 | PBRSuffix.NORMAL: '%s_normal.%s', 26 | PBRSuffix.METALLIC: '%s_metallic.%s', 27 | PBRSuffix.ROUGHNESS: '%s_roughness.%s', 28 | PBRSuffix.EMISSION: '%s_emission.%s', 29 | PBRSuffix.AO: '%s_ao.%s', 30 | PBRSuffix.DEPTH: '%s_depth.%s', 31 | } 32 | 33 | const PBR_SUFFIX_TEXTURES := { 34 | PBRSuffix.NORMAL: SpatialMaterial.TEXTURE_NORMAL, 35 | PBRSuffix.METALLIC: SpatialMaterial.TEXTURE_METALLIC, 36 | PBRSuffix.ROUGHNESS: SpatialMaterial.TEXTURE_ROUGHNESS, 37 | PBRSuffix.EMISSION: SpatialMaterial.TEXTURE_EMISSION, 38 | PBRSuffix.AO: SpatialMaterial.TEXTURE_AMBIENT_OCCLUSION, 39 | PBRSuffix.DEPTH: SpatialMaterial.TEXTURE_DEPTH, 40 | } 41 | 42 | const PBR_SUFFIX_PROPERTIES := { 43 | PBRSuffix.NORMAL: 'normal_enabled', 44 | PBRSuffix.EMISSION: 'emission_enabled', 45 | PBRSuffix.AO: 'ao_enabled', 46 | PBRSuffix.DEPTH: 'depth_enabled', 47 | } 48 | 49 | # Parameters 50 | var base_texture_path: String 51 | var texture_extensions: PoolStringArray 52 | var texture_wads: Array 53 | 54 | # Instances 55 | var directory := Directory.new() 56 | var texture_wad_resources : Array = [] 57 | 58 | # Getters 59 | func get_pbr_suffix_pattern(suffix: int) -> String: 60 | if not suffix in PBR_SUFFIX_NAMES: 61 | return '' 62 | 63 | var pattern_setting := "qodot/textures/%s_pattern" % [PBR_SUFFIX_NAMES[suffix]] 64 | if ProjectSettings.has_setting(pattern_setting): 65 | return ProjectSettings.get_setting(pattern_setting) 66 | 67 | return PBR_SUFFIX_PATTERNS[suffix] 68 | 69 | # Overrides 70 | func _init( 71 | base_texture_path: String, 72 | texture_extensions: PoolStringArray, 73 | texture_wads: Array 74 | ) -> void: 75 | self.base_texture_path = base_texture_path 76 | self.texture_extensions = texture_extensions 77 | 78 | load_texture_wad_resources(texture_wads) 79 | 80 | # Business Logic 81 | func load_texture_wad_resources(texture_wads: Array) -> void: 82 | texture_wad_resources.clear() 83 | 84 | for texture_wad in texture_wads: 85 | if texture_wad and not texture_wad in texture_wad_resources: 86 | texture_wad_resources.append(texture_wad) 87 | 88 | func load_textures(texture_list: Array) -> Dictionary: 89 | var texture_dict := {} 90 | 91 | for texture_name in texture_list: 92 | texture_dict[texture_name] = load_texture(texture_name) 93 | 94 | return texture_dict 95 | 96 | func load_texture(texture_name: String) -> Texture: 97 | if(texture_name == TEXTURE_EMPTY): 98 | return null 99 | 100 | # Load albedo texture if it exists 101 | for texture_extension in texture_extensions: 102 | var texture_path := "%s/%s.%s" % [base_texture_path, texture_name, texture_extension] 103 | if ResourceLoader.exists(texture_path, "Texture"): 104 | return load(texture_path) as Texture 105 | 106 | var texture_name_lower : String = texture_name.to_lower() 107 | for texture_wad in texture_wad_resources: 108 | if texture_name_lower in texture_wad.textures: 109 | return texture_wad.textures[texture_name_lower] 110 | 111 | return null 112 | 113 | func create_materials(texture_list: Array, material_extension: String, default_material: Material) -> Dictionary: 114 | var texture_materials := {} 115 | for texture in texture_list: 116 | texture_materials[texture] = create_material( 117 | texture, 118 | material_extension, 119 | default_material 120 | ) 121 | return texture_materials 122 | 123 | func create_material( 124 | texture_name: String, 125 | material_extension: String, 126 | default_material: SpatialMaterial 127 | ) -> SpatialMaterial: 128 | # Autoload material if it exists 129 | var material_dict := {} 130 | 131 | var material_path = "%s/%s.%s" % [base_texture_path, texture_name, material_extension] 132 | if not material_path in material_dict and directory.file_exists(material_path): 133 | var loaded_material: Material = load(material_path) 134 | if loaded_material: 135 | material_dict[material_path] = loaded_material 136 | 137 | # If material already exists, use it 138 | if material_path in material_dict: 139 | return material_dict[material_path] 140 | 141 | var material : SpatialMaterial = null 142 | 143 | if default_material: 144 | material = default_material.duplicate() 145 | else: 146 | material = SpatialMaterial.new() 147 | 148 | var texture : Texture = load_texture(texture_name) 149 | if not texture: 150 | return material 151 | 152 | material.set_texture(SpatialMaterial.TEXTURE_ALBEDO, texture) 153 | 154 | var pbr_textures : Dictionary = get_pbr_textures(texture_name) 155 | for pbr_suffix in PBRSuffix: 156 | var suffix = PBRSuffix[pbr_suffix] 157 | var tex = pbr_textures[suffix] 158 | if tex: 159 | var enable_prop : String = PBR_SUFFIX_PROPERTIES[suffix] if suffix in PBR_SUFFIX_PROPERTIES else "" 160 | if(enable_prop != ""): 161 | material.set(enable_prop, true) 162 | 163 | material.set_texture(PBR_SUFFIX_TEXTURES[suffix], tex) 164 | 165 | material_dict[material_path] = material 166 | 167 | return material 168 | 169 | # PBR texture fetching 170 | func get_pbr_textures(texture_name: String) -> Dictionary: 171 | var pbr_textures := {} 172 | for pbr_suffix in PBRSuffix: 173 | var suffix = PBRSuffix[pbr_suffix] 174 | pbr_textures[suffix] = get_pbr_texture(texture_name, suffix) 175 | 176 | return pbr_textures 177 | 178 | func get_pbr_texture(texture: String, suffix: int) -> Texture: 179 | var texture_comps : PoolStringArray = texture.split('/') 180 | 181 | if texture_comps.size() == 0: 182 | return null 183 | 184 | for texture_extension in texture_extensions: 185 | var path := "%s/%s/%s" % [ 186 | base_texture_path, 187 | texture_comps.join('/'), 188 | get_pbr_suffix_pattern(suffix) % [ 189 | texture_comps[-1], 190 | texture_extension 191 | ] 192 | ] 193 | 194 | if(directory.file_exists(path)): 195 | return load(path) as Texture 196 | 197 | return null 198 | -------------------------------------------------------------------------------- /addons/qodot/src/util/qodot_util.gd: -------------------------------------------------------------------------------- 1 | class_name QodotUtil 2 | 3 | # General-purpose utility functions namespaced to Qodot for compatibility 4 | 5 | const DEBUG := false 6 | 7 | const CATEGORY_STRING := '----------------------------------------------------------------' 8 | 9 | # Const-predicated print function to avoid excess log spam 10 | static func debug_print(msg) -> void: 11 | if(DEBUG): 12 | print(msg) 13 | 14 | static func newline() -> String: 15 | if OS.get_name() == "Windows": 16 | return "\r\n" 17 | else: 18 | return "\n" 19 | 20 | static func category_dict(name: String) -> Dictionary: 21 | return property_dict(name, TYPE_STRING, -1, "", PROPERTY_USAGE_CATEGORY) 22 | 23 | static func property_dict(name: String, type: int, hint: int = -1, hint_string: String = "", usage: int = -1) -> Dictionary: 24 | var dict := { 25 | 'name': name, 26 | 'type': type 27 | } 28 | 29 | if hint != -1: 30 | dict['hint'] = hint 31 | 32 | if hint_string != "": 33 | dict['hint_string'] = hint_string 34 | 35 | if usage != -1: 36 | dict['usage'] = usage 37 | 38 | return dict 39 | -------------------------------------------------------------------------------- /addons/qodot/textures/base/checkerboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/base/checkerboard.png -------------------------------------------------------------------------------- /addons/qodot/textures/base/checkerboard.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/checkerboard.png-7bf1215c3e8972dee60c32ded413e68a.s3tc.stex" 6 | path.etc2="res://.import/checkerboard.png-7bf1215c3e8972dee60c32ded413e68a.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/base/checkerboard.png" 15 | dest_files=[ "res://.import/checkerboard.png-7bf1215c3e8972dee60c32ded413e68a.s3tc.stex", "res://.import/checkerboard.png-7bf1215c3e8972dee60c32ded413e68a.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/base/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/base/grid.png -------------------------------------------------------------------------------- /addons/qodot/textures/base/grid.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/grid.png-0a7bed3c9b656ae5992c220c990f1cea.s3tc.stex" 6 | path.etc2="res://.import/grid.png-0a7bed3c9b656ae5992c220c990f1cea.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/base/grid.png" 15 | dest_files=[ "res://.import/grid.png-0a7bed3c9b656ae5992c220c990f1cea.s3tc.stex", "res://.import/grid.png-0a7bed3c9b656ae5992c220c990f1cea.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/base/uv_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/base/uv_test.png -------------------------------------------------------------------------------- /addons/qodot/textures/base/uv_test.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/uv_test.png-fd4a36e4ed5521518cd8597264b8d180.s3tc.stex" 6 | path.etc2="res://.import/uv_test.png-fd4a36e4ed5521518cd8597264b8d180.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/base/uv_test.png" 15 | dest_files=[ "res://.import/uv_test.png-fd4a36e4ed5521518cd8597264b8d180.s3tc.stex", "res://.import/uv_test.png-fd4a36e4ed5521518cd8597264b8d180.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/lava.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/layers/lava.png -------------------------------------------------------------------------------- /addons/qodot/textures/layers/lava.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/lava.png-689b60408487f961640e91d2529f624a.s3tc.stex" 6 | path.etc2="res://.import/lava.png-689b60408487f961640e91d2529f624a.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/layers/lava.png" 15 | dest_files=[ "res://.import/lava.png-689b60408487f961640e91d2529f624a.s3tc.stex", "res://.import/lava.png-689b60408487f961640e91d2529f624a.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/lava.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | flags_transparent = true 5 | albedo_color = Color( 0, 0, 0, 0.501961 ) 6 | roughness = 0.35 7 | emission_enabled = true 8 | emission = Color( 1, 0.117647, 0, 1 ) 9 | emission_energy = 4.0 10 | emission_operator = 0 11 | emission_on_uv2 = false 12 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/slime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/layers/slime.png -------------------------------------------------------------------------------- /addons/qodot/textures/layers/slime.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/slime.png-944d987d4603d2cd4bc4c474dbf6fa68.s3tc.stex" 6 | path.etc2="res://.import/slime.png-944d987d4603d2cd4bc4c474dbf6fa68.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/layers/slime.png" 15 | dest_files=[ "res://.import/slime.png-944d987d4603d2cd4bc4c474dbf6fa68.s3tc.stex", "res://.import/slime.png-944d987d4603d2cd4bc4c474dbf6fa68.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/slime.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | flags_transparent = true 5 | albedo_color = Color( 0.286275, 0.745098, 0, 0.784314 ) 6 | metallic = 0.2 7 | roughness = 0.3 8 | emission_enabled = true 9 | emission = Color( 0.0392157, 0.352941, 0, 1 ) 10 | emission_energy = 2.0 11 | emission_operator = 0 12 | emission_on_uv2 = false 13 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/layers/water.png -------------------------------------------------------------------------------- /addons/qodot/textures/layers/water.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/water.png-7580bd9811beea0cad8dada8d9bd98e3.s3tc.stex" 6 | path.etc2="res://.import/water.png-7580bd9811beea0cad8dada8d9bd98e3.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/layers/water.png" 15 | dest_files=[ "res://.import/water.png-7580bd9811beea0cad8dada8d9bd98e3.s3tc.stex", "res://.import/water.png-7580bd9811beea0cad8dada8d9bd98e3.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/layers/water.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | flags_transparent = true 5 | albedo_color = Color( 0, 0.368627, 1, 0.501961 ) 6 | roughness = 0.0 7 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/checkerboard_material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/materials/checkerboard_material.png -------------------------------------------------------------------------------- /addons/qodot/textures/materials/checkerboard_material.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/checkerboard_material.png-bd565bc7d3537fb58b836d3d0a566856.s3tc.stex" 6 | path.etc2="res://.import/checkerboard_material.png-bd565bc7d3537fb58b836d3d0a566856.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/materials/checkerboard_material.png" 15 | dest_files=[ "res://.import/checkerboard_material.png-bd565bc7d3537fb58b836d3d0a566856.s3tc.stex", "res://.import/checkerboard_material.png-bd565bc7d3537fb58b836d3d0a566856.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/checkerboard_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/textures/materials/checkerboard_material.png" type="Texture" id=1] 4 | 5 | [resource] 6 | flags_transparent = true 7 | albedo_color = Color( 1, 1, 1, 0.470588 ) 8 | albedo_texture = ExtResource( 1 ) 9 | emission_enabled = true 10 | emission = Color( 0, 0, 0, 1 ) 11 | emission_energy = 1.0 12 | emission_operator = 0 13 | emission_on_uv2 = false 14 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/grid_material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/materials/grid_material.png -------------------------------------------------------------------------------- /addons/qodot/textures/materials/grid_material.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/grid_material.png-bd78eb3530d9123d3a95f81676302c0a.s3tc.stex" 6 | path.etc2="res://.import/grid_material.png-bd78eb3530d9123d3a95f81676302c0a.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/materials/grid_material.png" 15 | dest_files=[ "res://.import/grid_material.png-bd78eb3530d9123d3a95f81676302c0a.s3tc.stex", "res://.import/grid_material.png-bd78eb3530d9123d3a95f81676302c0a.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/grid_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/textures/materials/grid_material.png" type="Texture" id=1] 4 | 5 | [resource] 6 | albedo_texture = ExtResource( 1 ) 7 | metallic = 1.0 8 | roughness = 0.5 9 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/uv_test_material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/materials/uv_test_material.png -------------------------------------------------------------------------------- /addons/qodot/textures/materials/uv_test_material.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/uv_test_material.png-ce5de9739dff49d538359cf81200b4d4.s3tc.stex" 6 | path.etc2="res://.import/uv_test_material.png-ce5de9739dff49d538359cf81200b4d4.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/materials/uv_test_material.png" 15 | dest_files=[ "res://.import/uv_test_material.png-ce5de9739dff49d538359cf81200b4d4.s3tc.stex", "res://.import/uv_test_material.png-ce5de9739dff49d538359cf81200b4d4.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/materials/uv_test_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/qodot/textures/materials/uv_test_material.png" type="Texture" id=1] 4 | 5 | [resource] 6 | albedo_texture = ExtResource( 1 ) 7 | roughness = 0.6 8 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/metal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/orrery/metal.png -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/metal.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/metal.png-0f506868deaffb55dccaef5aa735d501.s3tc.stex" 6 | path.etc2="res://.import/metal.png-0f506868deaffb55dccaef5aa735d501.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/orrery/metal.png" 15 | dest_files=[ "res://.import/metal.png-0f506868deaffb55dccaef5aa735d501.s3tc.stex", "res://.import/metal.png-0f506868deaffb55dccaef5aa735d501.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/metal.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | metallic = 0.85 5 | roughness = 0.2 6 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/planet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/orrery/planet.png -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/planet.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/planet.png-289569b9c39dd66ab29723ee8210968d.s3tc.stex" 6 | path.etc2="res://.import/planet.png-289569b9c39dd66ab29723ee8210968d.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/orrery/planet.png" 15 | dest_files=[ "res://.import/planet.png-289569b9c39dd66ab29723ee8210968d.s3tc.stex", "res://.import/planet.png-289569b9c39dd66ab29723ee8210968d.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/planet.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | albedo_color = Color( 0, 0.529412, 1, 1 ) 5 | metallic = 0.25 6 | roughness = 0.1 7 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/orrery/sun.png -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/sun.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/sun.png-e2f14be365b06fcc619b25d1f5032f5c.s3tc.stex" 6 | path.etc2="res://.import/sun.png-e2f14be365b06fcc619b25d1f5032f5c.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/orrery/sun.png" 15 | dest_files=[ "res://.import/sun.png-e2f14be365b06fcc619b25d1f5032f5c.s3tc.stex", "res://.import/sun.png-e2f14be365b06fcc619b25d1f5032f5c.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/orrery/sun.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" format=2] 2 | 3 | [resource] 4 | albedo_color = Color( 0, 0, 0, 1 ) 5 | emission_enabled = true 6 | emission = Color( 1, 0.352941, 0, 1 ) 7 | emission_energy = 3.5 8 | emission_operator = 0 9 | emission_on_uv2 = false 10 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel.png-e4ecee11e4e5075a14630169ab2fe743.s3tc.stex" 6 | path.etc2="res://.import/military-panel.png-e4ecee11e4e5075a14630169ab2fe743.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel.png" 15 | dest_files=[ "res://.import/military-panel.png-e4ecee11e4e5075a14630169ab2fe743.s3tc.stex", "res://.import/military-panel.png-e4ecee11e4e5075a14630169ab2fe743.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_ao.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_ao.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_ao.png-a3fbe915e1fe45fe904d71d2a730c148.s3tc.stex" 6 | path.etc2="res://.import/military-panel_ao.png-a3fbe915e1fe45fe904d71d2a730c148.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_ao.png" 15 | dest_files=[ "res://.import/military-panel_ao.png-a3fbe915e1fe45fe904d71d2a730c148.s3tc.stex", "res://.import/military-panel_ao.png-a3fbe915e1fe45fe904d71d2a730c148.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_depth.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_depth.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_depth.png-d261a4e0096cf27265ca8a54c81474fe.s3tc.stex" 6 | path.etc2="res://.import/military-panel_depth.png-d261a4e0096cf27265ca8a54c81474fe.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_depth.png" 15 | dest_files=[ "res://.import/military-panel_depth.png-d261a4e0096cf27265ca8a54c81474fe.s3tc.stex", "res://.import/military-panel_depth.png-d261a4e0096cf27265ca8a54c81474fe.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_emissive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_emissive.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_emissive.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_emissive.png-c96c78f20cd467177a8d1d36d4a20879.s3tc.stex" 6 | path.etc2="res://.import/military-panel_emissive.png-c96c78f20cd467177a8d1d36d4a20879.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_emissive.png" 15 | dest_files=[ "res://.import/military-panel_emissive.png-c96c78f20cd467177a8d1d36d4a20879.s3tc.stex", "res://.import/military-panel_emissive.png-c96c78f20cd467177a8d1d36d4a20879.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_metallic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_metallic.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_metallic.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_metallic.png-eb52551ba00f894fa1becc7088dcd1ef.s3tc.stex" 6 | path.etc2="res://.import/military-panel_metallic.png-eb52551ba00f894fa1becc7088dcd1ef.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_metallic.png" 15 | dest_files=[ "res://.import/military-panel_metallic.png-eb52551ba00f894fa1becc7088dcd1ef.s3tc.stex", "res://.import/military-panel_metallic.png-eb52551ba00f894fa1becc7088dcd1ef.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_normal.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_normal.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_normal.png-fd36fad0fdcbe14d92a099afcf8a5fa6.s3tc.stex" 6 | path.etc2="res://.import/military-panel_normal.png-fd36fad0fdcbe14d92a099afcf8a5fa6.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_normal.png" 15 | dest_files=[ "res://.import/military-panel_normal.png-fd36fad0fdcbe14d92a099afcf8a5fa6.s3tc.stex", "res://.import/military-panel_normal.png-fd36fad0fdcbe14d92a099afcf8a5fa6.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=1 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_roughness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/pbr/military-panel/military-panel_roughness.png -------------------------------------------------------------------------------- /addons/qodot/textures/pbr/military-panel/military-panel_roughness.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/military-panel_roughness.png-3c86a7fe8027a8214b7a1794724c24ab.s3tc.stex" 6 | path.etc2="res://.import/military-panel_roughness.png-3c86a7fe8027a8214b7a1794724c24ab.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/pbr/military-panel/military-panel_roughness.png" 15 | dest_files=[ "res://.import/military-panel_roughness.png-3c86a7fe8027a8214b7a1794724c24ab.s3tc.stex", "res://.import/military-panel_roughness.png-3c86a7fe8027a8214b7a1794724c24ab.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/shaders/tangent-test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/shaders/tangent-test.png -------------------------------------------------------------------------------- /addons/qodot/textures/shaders/tangent-test.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/tangent-test.png-4bdbc0910a8c31494de70651525f90fb.s3tc.stex" 6 | path.etc2="res://.import/tangent-test.png-4bdbc0910a8c31494de70651525f90fb.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/shaders/tangent-test.png" 15 | dest_files=[ "res://.import/tangent-test.png-4bdbc0910a8c31494de70651525f90fb.s3tc.stex", "res://.import/tangent-test.png-4bdbc0910a8c31494de70651525f90fb.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=2 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/shaders/tangent-test.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ShaderMaterial" load_steps=2 format=2] 2 | 3 | [sub_resource type="Shader" id=1] 4 | code = "shader_type spatial; 5 | 6 | void fragment() { 7 | ALBEDO = TANGENT; 8 | }" 9 | 10 | [resource] 11 | shader = SubResource( 1 ) 12 | -------------------------------------------------------------------------------- /addons/qodot/textures/special/clip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/special/clip.png -------------------------------------------------------------------------------- /addons/qodot/textures/special/clip.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/clip.png-5fc9a9edc976377600ca7c1c2d5af40b.s3tc.stex" 6 | path.etc2="res://.import/clip.png-5fc9a9edc976377600ca7c1c2d5af40b.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/special/clip.png" 15 | dest_files=[ "res://.import/clip.png-5fc9a9edc976377600ca7c1c2d5af40b.s3tc.stex", "res://.import/clip.png-5fc9a9edc976377600ca7c1c2d5af40b.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | -------------------------------------------------------------------------------- /addons/qodot/textures/special/skip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EIRTeam/qodot-plugin/2d13884a78efde30b9cc32e36181c36b528d1f84/addons/qodot/textures/special/skip.png -------------------------------------------------------------------------------- /addons/qodot/textures/special/skip.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path.s3tc="res://.import/skip.png-1a1c7d3d5f4ec87cb77153ada41cdb8a.s3tc.stex" 6 | path.etc2="res://.import/skip.png-1a1c7d3d5f4ec87cb77153ada41cdb8a.etc2.stex" 7 | metadata={ 8 | "imported_formats": [ "s3tc", "etc2" ], 9 | "vram_texture": true 10 | } 11 | 12 | [deps] 13 | 14 | source_file="res://addons/qodot/textures/special/skip.png" 15 | dest_files=[ "res://.import/skip.png-1a1c7d3d5f4ec87cb77153ada41cdb8a.s3tc.stex", "res://.import/skip.png-1a1c7d3d5f4ec87cb77153ada41cdb8a.etc2.stex" ] 16 | 17 | [params] 18 | 19 | compress/mode=2 20 | compress/lossy_quality=1.0 21 | compress/hdr_mode=0 22 | compress/bptc_ldr=0 23 | compress/normal_map=0 24 | flags/repeat=1 25 | flags/filter=false 26 | flags/mipmaps=true 27 | flags/anisotropic=true 28 | flags/srgb=1 29 | process/fix_alpha_border=false 30 | process/premult_alpha=false 31 | process/HDR_as_SRGB=false 32 | process/invert_color=false 33 | stream=false 34 | size_limit=0 35 | detect_3d=false 36 | svg/scale=1.0 37 | --------------------------------------------------------------------------------