├── .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 |
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 |
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 |
--------------------------------------------------------------------------------