From 696f3d3d3dc578384755e2283dcc90c85782f0ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Thu, 29 Oct 2020 03:52:56 -0400 Subject: [PATCH] Add CI to 3.2 (#3) --- .github/workflows/linux_builds.yml | 76 +++++++++ All.tscn | 17 +- Autoload.gd => Autoload/Autoload.gd | 4 +- GridContainer.gd => MainScenes/Control.gd | 0 Control.tscn => MainScenes/Control.tscn | 4 +- Node2D.gd => MainScenes/Node2D.gd | 0 Node2D.tscn => MainScenes/Node2D.tscn | 3 +- MainScenes/Operators.gd | 180 ++++++++++++++++++++++ Other.gd => MainScenes/Other.gd | 0 Other.tscn => MainScenes/Other.tscn | 4 +- Spatial.gd => MainScenes/Spatial.gd | 0 Spatial.tscn => MainScenes/Spatial.tscn | 3 +- Physics/2D/Area2D.gd | 27 ++++ Physics/2D/Area2D.tscn | 16 ++ Physics/2D/KinematicBody2D.gd | 19 +++ Physics/2D/KinematicBody2D.tscn | 15 ++ Physics/2D/Physics2D.gd | 1 + Physics/2D/Physics2D.tscn | 120 +++++++++++++++ Physics/2D/RigidBody2D.gd | 20 +++ Physics/2D/RigidBody2D.tscn | 16 ++ Physics/2D/StaticBody2D.gd | 19 +++ Physics/2D/StaticBody2D.tscn | 15 ++ README.md | 19 ++- icon 32x32.png | Bin 0 -> 7102 bytes icon 32x32.png.import | 34 ++++ icon.png | Bin 0 -> 61103 bytes icon.png.import | 34 ++++ misc/check_ci_log.py | 51 ++++++ project.godot | 24 ++- 29 files changed, 704 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/linux_builds.yml rename Autoload.gd => Autoload/Autoload.gd (89%) rename GridContainer.gd => MainScenes/Control.gd (100%) rename Control.tscn => MainScenes/Control.tscn (74%) rename Node2D.gd => MainScenes/Node2D.gd (100%) rename Node2D.tscn => MainScenes/Node2D.tscn (68%) create mode 100644 MainScenes/Operators.gd rename Other.gd => MainScenes/Other.gd (100%) rename Other.tscn => MainScenes/Other.tscn (57%) rename Spatial.gd => MainScenes/Spatial.gd (100%) rename Spatial.tscn => MainScenes/Spatial.tscn (77%) create mode 100644 Physics/2D/Area2D.gd create mode 100644 Physics/2D/Area2D.tscn create mode 100644 Physics/2D/KinematicBody2D.gd create mode 100644 Physics/2D/KinematicBody2D.tscn create mode 100644 Physics/2D/Physics2D.gd create mode 100644 Physics/2D/Physics2D.tscn create mode 100644 Physics/2D/RigidBody2D.gd create mode 100644 Physics/2D/RigidBody2D.tscn create mode 100644 Physics/2D/StaticBody2D.gd create mode 100644 Physics/2D/StaticBody2D.tscn create mode 100644 icon 32x32.png create mode 100644 icon 32x32.png.import create mode 100644 icon.png create mode 100644 icon.png.import create mode 100755 misc/check_ci_log.py diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml new file mode 100644 index 0000000..e74964e --- /dev/null +++ b/.github/workflows/linux_builds.yml @@ -0,0 +1,76 @@ +name: 🐧 Linux Builds +on: [push, pull_request] + +jobs: + linux-sanitizer: + runs-on: "ubuntu-20.04" + name: Editor and exported project with sanitizers (target=debug/release, tools=yes/no, debug_symbols=yes/full, use_ubsan=yes, use_asan=yes) + + steps: + - uses: actions/checkout@v2 + + # Install all packages (except scons) + - name: Configure dependencies + run: | + sudo apt-get install build-essential pkg-config libx11-dev libxcursor-dev \ + libxinerama-dev libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev yasm \ + xvfb wget2 unzip python scons git + +# - name: Download Godot +# run: | +# wget2 https://downloads.tuxfamily.org/godotengine/3.2.4/beta1/Godot_v3.2.4-beta1_x11.64.zip +# unzip Godot_v3.2.4-beta1_x11.64.zip +# rm Godot_v3.2.4-beta1_x11.64.zip +# mv Godot_v3.2.4-beta1_x11.64 godot.x11.tools.64s +# wget2 https://downloads.tuxfamily.org/godotengine/3.2.4/beta1/Godot_v3.2.4-beta1_export_templates.tpz +# unzip Godot_v3.2.4-beta1_export_templates.tpz +# mv templates/linux_x11_64_debug godot.x11.opt.64s +# rm -rf templates +# rm Godot_v3.2.4-beta1_export_templates.tpz +# ls -alr + +# - name: Download Godot(ZIP) +# run: | +# wget2 https://github.com/godotengine/godot/archive/3.2.zip +# unzip 3.2.zip +# rm 3.2.zip + + + - name: Download Godot(GIT) + run: | + git clone https://github.com/godotengine/godot.git + cd godot + git checkout 3.2 + cd ../ + + - name: Compile Godot + run: | + cd godot + scons p=x11 -j2 use_asan=yes use_ubsan=yes CCFLAGS="-fsanitize=shift,shift-exponent,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr" + scons tools=no target=release debug_symbols=full use_asan=yes use_ubsan=yes CCFLAGS="-fsanitize=shift,shift-exponent,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr" + cp bin/godot.x11.tools.64s ../ + cp bin/godot.x11.opt.64s ../ + cd ../ + rm -rf godot + + - name: Use Godot + run: | + echo "-------------------- OPEN EDITOR TO IMPORT PROJECT -----------------------" + DRI_PRIME=0 timeout 25s xvfb-run ./godot.x11.tools.64s -e --path $(pwd) 2>&1 | tee sanitizers_log.txt || true + misc/check_ci_log.py sanitizers_log.txt + echo "-------------------- OPEN EDITOR SECOND TIME TO BE SURE THAT EVERYTHING WAS IMPORTED -----------------------" + DRI_PRIME=0 xvfb-run ./godot.x11.tools.64s -e -q --path $(pwd) 2>&1 | tee sanitizers_log.txt || true + misc/check_ci_log.py sanitizers_log.txt + echo "-------------------- RUN PROJECT -----------------------" + DRI_PRIME=0 xvfb-run ./godot.x11.tools.64s 60 --video-driver GLES3 --path $(pwd) 2>&1 | tee sanitizers_log.txt || true + misc/check_ci_log.py sanitizers_log.txt + + # Export project and run it to check for possible leaks and invalid memory usage + - name: Exporting and running project + run: | + curr="$(pwd)/godot.x11.opt.64s" + sed -i "s|PATH_TO_CHANGE|$curr|" export_presets.cfg + DRI_PRIME=0 xvfb-run ./godot.x11.tools.64s --export-debug "Linux/X11" test_project 2>&1 | tee sanitizers_log.txt || true + misc/check_ci_log.py sanitizers_log.txt + DRI_PRIME=0 xvfb-run ./test_project 20 2>&1 | tee sanitizers_log.txt || true + misc/check_ci_log.py sanitizers_log.txt diff --git a/All.tscn b/All.tscn index 2b82eb2..36f5d70 100644 --- a/All.tscn +++ b/All.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=7 format=2] -[ext_resource path="res://Control.tscn" type="PackedScene" id=1] -[ext_resource path="res://Spatial.tscn" type="PackedScene" id=2] -[ext_resource path="res://Node2D.tscn" type="PackedScene" id=3] -[ext_resource path="res://Other.tscn" type="PackedScene" id=4] +[ext_resource path="res://MainScenes/Control.tscn" type="PackedScene" id=1] +[ext_resource path="res://MainScenes/Spatial.tscn" type="PackedScene" id=2] +[ext_resource path="res://MainScenes/Node2D.tscn" type="PackedScene" id=3] +[ext_resource path="res://MainScenes/Other.tscn" type="PackedScene" id=4] +[ext_resource path="res://MainScenes/Operators.gd" type="Script" id=5] +[ext_resource path="res://Physics/2D/Physics2D.tscn" type="PackedScene" id=6] [node name="All" type="Node"] @@ -14,3 +16,8 @@ [node name="Node" parent="." instance=ExtResource( 4 )] [node name="Spatial" parent="." instance=ExtResource( 2 )] + +[node name="Operators" type="Node2D" parent="."] +script = ExtResource( 5 ) + +[node name="Physics2D" parent="." instance=ExtResource( 6 )] diff --git a/Autoload.gd b/Autoload/Autoload.gd similarity index 89% rename from Autoload.gd rename to Autoload/Autoload.gd index c5b45be..d3ae7ea 100644 --- a/Autoload.gd +++ b/Autoload/Autoload.gd @@ -1,10 +1,12 @@ extends Node +const screen_size = Vector2(1024,600) + const RANGE : int = 5 var time_to_show : float = -1000.0 -func _init() -> void: +func _init(): for argument in OS.get_cmdline_args(): var rr : String = argument if rr.find("tscn") != -1: # Ignore all tscn scenes/names diff --git a/GridContainer.gd b/MainScenes/Control.gd similarity index 100% rename from GridContainer.gd rename to MainScenes/Control.gd diff --git a/Control.tscn b/MainScenes/Control.tscn similarity index 74% rename from Control.tscn rename to MainScenes/Control.tscn index e179cbf..10bf99e 100644 --- a/Control.tscn +++ b/MainScenes/Control.tscn @@ -1,6 +1,8 @@ [gd_scene load_steps=2 format=2] -[ext_resource path="res://GridContainer.gd" type="Script" id=1] +[ext_resource path="res://MainScenes/Control.gd" type="Script" id=1] + + [node name="GridContainer" type="GridContainer"] anchor_right = 1.0 diff --git a/Node2D.gd b/MainScenes/Node2D.gd similarity index 100% rename from Node2D.gd rename to MainScenes/Node2D.gd diff --git a/Node2D.tscn b/MainScenes/Node2D.tscn similarity index 68% rename from Node2D.tscn rename to MainScenes/Node2D.tscn index 694ecbd..759923a 100644 --- a/Node2D.tscn +++ b/MainScenes/Node2D.tscn @@ -1,6 +1,7 @@ [gd_scene load_steps=2 format=2] -[ext_resource path="res://Node2D.gd" type="Script" id=1] +[ext_resource path="res://MainScenes/Node2D.gd" type="Script" id=1] + [node name="Node2D" type="Node2D"] script = ExtResource( 1 ) diff --git a/MainScenes/Operators.gd b/MainScenes/Operators.gd new file mode 100644 index 0000000..c0c1422 --- /dev/null +++ b/MainScenes/Operators.gd @@ -0,0 +1,180 @@ +extends Node2D + +class_name Operators + +signal roman + +onready var sew : int = 0 + + +func _ready() -> void: + + assert(2>1) + + var arr : Array = [25,235236,236,236,23,6,236,236,236,23,634,63,7,35,4734,64,64,34,62,72,32,535] + var dict : Dictionary = {35:535,5236:535,35236:"35","safasf":"w","etwet":"qwrqrqwrqwrq","t":"wet"} + var number = 5242434 + var strin = "asfqwfasfasf" + + 52 % -25 + arr.append(254) + arr[36235 % arr.size()] + arr[-36235 % arr.size()] + if dict.has(strin): + dict[strin] + sew = sew + number is Node2D + ~36235 + -36235 + 36235 * 36235 + 36235 / (21) + 36235 % (21) + 36235 + 36235 + 36235 - 36235 + 36235 >> int(max(min(36235,0),63)) + 36235 << int(max(min(36235,0),63)) + 36235 & 36235 + 36235 ^ 36235 + 36235 | 36235 + 36235 < 36235 + 36235 > 36235 + 36235 == 36235 + 36235 != 36235 + 36235 >= 36235 + 36235 <= 36235 + 36235 in ["asfasfqw","asfqwgqani"] + !36235 + not 36235 + 36235 and 36235 + 36235 && 36235 + 36235 or 36235 + 36235 || 36235 + + number = 36235 + number += 36235 + number -= 36235 + number *= 36235 + number /= 21 + number %= 21 + number &= 36235 + number |= 36235 + + 1234567890 + 0x0123456789ABCDEF + 0x123456789ABCDEF + 0b101010101010101010101 + 0b010101010101010101010 + 3.242 + 25.1e-125 + 125e+24 + "2122222222222222222222222222222225125125125215s" + "Chrabąszcz" + """ + MULTILINIONOWOŚĆ + """ + $"." + + #Comment + + var _r2 = qq() + var _rr = qqr("WRT") + call("qqr","QWT") + var func_ref = funcref(self,"qqr") + func_ref.call_func("QWQW") + + if 36235: + pass + else: + pass + + var rr : int = 10 + while(rr != 0): + rr -= 1 + + match 36235: + 2: + 36235 + 5: + pass + 36235 + 3: + continue + false + _: + [521252,"asfasfw", "asfw"] + + match typeof(36235): + TYPE_AABB: + 36235 + TYPE_INT: + 36235 + + match 36235: + 2: + 36235 +# var RR: +# RR = 36235 + + match randi() % 26: + 2: + pass +# var TT: +# var ss = TT # BUG GH#34384 + + for _i in [5,2,5]: + pass + for _i in {"a":0}: + pass + for _i in range(3): + pass + for _i in range(1,2): + pass + for _i in range(1,1,3): + pass + for _i in "Roman": + pass + for _i in 3: + pass + for _i in 2.2: + pass + + +enum {TILE, MILE} +enum State {STATE_IDLE, STATE_JUMP = 5, STATE_SHOOT} +const Roman = {IDLE = 0, JUMP = 5, SHOOT = 6} +const TITLE = 0 +const TITLE2 : int = 0 +var describtion + + +func qq(): + return + +func qqr(_stat : String = "TQW") -> String: + return "FAASFW" + +static func ff(_rr : String = "FA") -> String: + return "qtqwtwey" + +class ram: + var sa : int = 0 + var qq + static func rr() -> ram: + return ram.new() + static func Wr() -> Node: + return Node.new() + static func rqq() -> String: + return "as" + func roman() -> String: + return "wqr" + func wykop() -> String: + return "wqr" + +func func_ready() -> void: + var rr : ram = ram.new() + rr.sa = 125 + rr.qq = "qw" + var _s = rr.rr() + var _r = rr.rqq() + var _t = rr.roman() + var _y = rr.wykop() diff --git a/Other.gd b/MainScenes/Other.gd similarity index 100% rename from Other.gd rename to MainScenes/Other.gd diff --git a/Other.tscn b/MainScenes/Other.tscn similarity index 57% rename from Other.tscn rename to MainScenes/Other.tscn index cd2792a..7bcd959 100644 --- a/Other.tscn +++ b/MainScenes/Other.tscn @@ -1,6 +1,8 @@ [gd_scene load_steps=2 format=2] -[ext_resource path="res://Other.gd" type="Script" id=1] +[ext_resource path="res://MainScenes/Other.gd" type="Script" id=1] + + [node name="Node" type="Node"] script = ExtResource( 1 ) diff --git a/Spatial.gd b/MainScenes/Spatial.gd similarity index 100% rename from Spatial.gd rename to MainScenes/Spatial.gd diff --git a/Spatial.tscn b/MainScenes/Spatial.tscn similarity index 77% rename from Spatial.tscn rename to MainScenes/Spatial.tscn index 1c4d898..0738fda 100644 --- a/Spatial.tscn +++ b/MainScenes/Spatial.tscn @@ -1,6 +1,7 @@ [gd_scene load_steps=2 format=2] -[ext_resource path="res://Spatial.gd" type="Script" id=1] +[ext_resource path="res://MainScenes/Spatial.gd" type="Script" id=1] + [node name="Spatial" type="Spatial"] script = ExtResource( 1 ) diff --git a/Physics/2D/Area2D.gd b/Physics/2D/Area2D.gd new file mode 100644 index 0000000..634b105 --- /dev/null +++ b/Physics/2D/Area2D.gd @@ -0,0 +1,27 @@ +extends Node2D + +var move_vector : Vector2 = Vector2(1,1) +var speed : float = 1000.0 + +func _ready(): + pass + +func _process(delta): + position += Vector2(move_vector.x * delta * speed,move_vector.y * delta * speed) + + if position.y > Autoload.screen_size.y: + move_vector.y = -1 + elif position.y < 0: + move_vector.y = 1 + elif position.x > Autoload.screen_size.x: + move_vector.x = -1 + elif position.x < 0: + move_vector.x = 1 + + +func _on_Area2D_area_entered(area): + move_vector = -move_vector + + +func _on_Area2D_body_entered(body): + move_vector = Vector2(move_vector.x,-move_vector.y) diff --git a/Physics/2D/Area2D.tscn b/Physics/2D/Area2D.tscn new file mode 100644 index 0000000..81a939c --- /dev/null +++ b/Physics/2D/Area2D.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://icon 32x32.png" type="Texture" id=1] +[ext_resource path="res://Physics/2D/Area2D.gd" type="Script" id=2] + +[node name="Area2D" type="Area2D"] +script = ExtResource( 2 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PoolVector2Array( 4.018, -13.1782, -15.9057, 3.23778, 1.63277, 17.5492, 19.3115, 2.39594 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[connection signal="area_entered" from="." to="." method="_on_Area2D_area_entered"] +[connection signal="body_entered" from="." to="." method="_on_Area2D_body_entered"] diff --git a/Physics/2D/KinematicBody2D.gd b/Physics/2D/KinematicBody2D.gd new file mode 100644 index 0000000..ea50a4c --- /dev/null +++ b/Physics/2D/KinematicBody2D.gd @@ -0,0 +1,19 @@ +extends KinematicBody2D + +var move_vector : Vector2 = Vector2(1,1) +var speed : float = 1000.0 + +func _ready(): + pass + +func _process(delta): + position += Vector2(move_vector.x * delta * speed,move_vector.y * delta * speed) + + if position.y > Autoload.screen_size.y: + move_vector.y = -1 + elif position.y < 0: + move_vector.y = 1 + elif position.x > Autoload.screen_size.x: + move_vector.x = -1 + elif position.x < 0: + move_vector.x = 1 diff --git a/Physics/2D/KinematicBody2D.tscn b/Physics/2D/KinematicBody2D.tscn new file mode 100644 index 0000000..9fce693 --- /dev/null +++ b/Physics/2D/KinematicBody2D.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://icon 32x32.png" type="Texture" id=1] +[ext_resource path="res://Physics/2D/KinematicBody2D.gd" type="Script" id=2] + +[node name="KinematicBody2D" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0.74902, 0.133333, 0.133333, 1 ) +rotation = 4.45932 +texture = ExtResource( 1 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PoolVector2Array( -10.6781, -7.48182, -12.4953, 17.1263, 15.2543, 6.19464, 4.32263, -14.4073 ) diff --git a/Physics/2D/Physics2D.gd b/Physics/2D/Physics2D.gd new file mode 100644 index 0000000..e251cf8 --- /dev/null +++ b/Physics/2D/Physics2D.gd @@ -0,0 +1 @@ +extends Node2D diff --git a/Physics/2D/Physics2D.tscn b/Physics/2D/Physics2D.tscn new file mode 100644 index 0000000..8873678 --- /dev/null +++ b/Physics/2D/Physics2D.tscn @@ -0,0 +1,120 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://Physics/2D/Physics2D.gd" type="Script" id=1] +[ext_resource path="res://Physics/2D/Area2D.tscn" type="PackedScene" id=2] +[ext_resource path="res://Physics/2D/KinematicBody2D.tscn" type="PackedScene" id=3] +[ext_resource path="res://Physics/2D/StaticBody2D.tscn" type="PackedScene" id=4] +[ext_resource path="res://Physics/2D/RigidBody2D.tscn" type="PackedScene" id=5] + +[node name="Physics2D" type="Node2D"] +script = ExtResource( 1 ) + +[node name="Area2D" type="Node2D" parent="."] + +[node name="Area2D" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 166.677, 52.3842 ) + +[node name="Area2D2" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 209.537, 193.663 ) + +[node name="Area2D3" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 450.822, 122.23 ) + +[node name="Area2D4" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 336.529, 293.669 ) + +[node name="Area2D5" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 555.59, 42.8598 ) + +[node name="Area2D6" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 598.45, 184.139 ) + +[node name="Area2D7" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 839.735, 112.705 ) + +[node name="Area2D8" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 725.442, 284.145 ) + +[node name="Area2D10" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 420.661, 330.179 ) + +[node name="Area2D12" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 547.653, 430.186 ) + +[node name="Area2D14" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 122.23, 457.171 ) + +[node name="Area2D16" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 249.222, 557.178 ) + +[node name="Area2D18" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 660.359, 444.472 ) + +[node name="Area2D19" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 901.644, 373.039 ) + +[node name="Area2D20" parent="Area2D" instance=ExtResource( 2 )] +position = Vector2( 787.351, 544.478 ) + +[node name="KinematicBody2D" type="Node2D" parent="."] + +[node name="KinematicBody2D" parent="KinematicBody2D" instance=ExtResource( 3 )] +position = Vector2( 90.4819, 302.4 ) + +[node name="KinematicBody2D2" parent="KinematicBody2D" instance=ExtResource( 3 )] +position = Vector2( 380.142, 465.25 ) + +[node name="KinematicBody2D3" parent="KinematicBody2D" instance=ExtResource( 3 )] +position = Vector2( 333.423, 131.54 ) + +[node name="KinematicBody2D4" parent="KinematicBody2D" instance=ExtResource( 3 )] +position = Vector2( 509.622, 242.332 ) + +[node name="KinematicBody2D5" parent="KinematicBody2D" instance=ExtResource( 3 )] +position = Vector2( 914.078, 76.812 ) + +[node name="StaticBody2D" type="Node2D" parent="."] +position = Vector2( 73.6327, 117.071 ) + +[node name="StaticBody2D" parent="StaticBody2D" instance=ExtResource( 4 )] + +[node name="StaticBody2D2" parent="StaticBody2D" instance=ExtResource( 4 )] +position = Vector2( 171.12, 267.286 ) + +[node name="StaticBody2D3" parent="StaticBody2D" instance=ExtResource( 4 )] +position = Vector2( 618.011, -2.82837 ) + +[node name="StaticBody2D4" parent="StaticBody2D" instance=ExtResource( 4 )] +position = Vector2( 793.374, 120.208 ) + +[node name="StaticBody2D5" parent="StaticBody2D" instance=ExtResource( 4 )] +position = Vector2( 704.278, 296.985 ) + +[node name="RigidBody2D" type="Node2D" parent="."] + +[node name="RigidBody2D" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 178.191, 120.915 ) + +[node name="RigidBody2D2" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 192.874, 313.132 ) + +[node name="RigidBody2D3" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 386.426, 210.35 ) + +[node name="RigidBody2D4" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 374.412, 43.4946 ) + +[node name="RigidBody2D5" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 609.344, 331.82 ) + +[node name="RigidBody2D6" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 756.177, 187.657 ) + +[node name="RigidBody2D7" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 754.842, 43.4946 ) + +[node name="RigidBody2D8" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 490.543, 544.06 ) + +[node name="RigidBody2D9" parent="RigidBody2D" instance=ExtResource( 5 )] +position = Vector2( 490.543, 544.06 ) diff --git a/Physics/2D/RigidBody2D.gd b/Physics/2D/RigidBody2D.gd new file mode 100644 index 0000000..35dff08 --- /dev/null +++ b/Physics/2D/RigidBody2D.gd @@ -0,0 +1,20 @@ +extends RigidBody2D + +var move_vector : Vector2 = Vector2(1,1) +var speed : float = 1000.0 + +func _ready(): + pass + +func _process(delta): + #position += Vector2(move_vector.x * delta * speed,move_vector.y * delta * speed) + + if position.y > Autoload.screen_size.y: + move_vector.y = -1 + elif position.y < 0: + move_vector.y = 1 + elif position.x > Autoload.screen_size.x: + move_vector.x = -1 + elif position.x < 0: + move_vector.x = 1 + apply_impulse(move_vector,Vector2(0,1)) diff --git a/Physics/2D/RigidBody2D.tscn b/Physics/2D/RigidBody2D.tscn new file mode 100644 index 0000000..55cbea8 --- /dev/null +++ b/Physics/2D/RigidBody2D.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Physics/2D/RigidBody2D.gd" type="Script" id=1] +[ext_resource path="res://icon 32x32.png" type="Texture" id=2] + +[node name="RigidBody2D" type="RigidBody2D"] +gravity_scale = 0.1 +script = ExtResource( 1 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PoolVector2Array( -2.29324, -15.2017, -12.0322, 4.46353, 8.38219, 7.64743 ) + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0.47451, 0, 0.427451, 1 ) +rotation = 0.792379 +texture = ExtResource( 2 ) diff --git a/Physics/2D/StaticBody2D.gd b/Physics/2D/StaticBody2D.gd new file mode 100644 index 0000000..98e77d2 --- /dev/null +++ b/Physics/2D/StaticBody2D.gd @@ -0,0 +1,19 @@ +extends StaticBody2D + +var move_vector : Vector2 = Vector2(1,1) +var speed : float = 1000.0 + +func _ready(): + pass + +func _process(delta): + position += Vector2(move_vector.x * delta * speed,move_vector.y * delta * speed) + + if position.y > Autoload.screen_size.y: + move_vector.y = -1 + elif position.y < 0: + move_vector.y = 1 + elif position.x > Autoload.screen_size.x: + move_vector.x = -1 + elif position.x < 0: + move_vector.x = 1 diff --git a/Physics/2D/StaticBody2D.tscn b/Physics/2D/StaticBody2D.tscn new file mode 100644 index 0000000..0790ae4 --- /dev/null +++ b/Physics/2D/StaticBody2D.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://icon 32x32.png" type="Texture" id=1] +[ext_resource path="res://Physics/2D/StaticBody2D.gd" type="Script" id=2] + +[node name="StaticBody2D" type="StaticBody2D"] +script = ExtResource( 2 ) + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +polygon = PoolVector2Array( -0.566719, -5.64549, -7.24092, 1.19557, -2.06841, 8.20348, 5.60692, 5.20009, 4.10522, -5.14492 ) + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0, 1, 1, 0.584314 ) +rotation = 0.270526 +texture = ExtResource( 1 ) diff --git a/README.md b/README.md index a9b2718..39111f6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,18 @@ -This repository contains Godot project, to test regression with engine. +## Godot regression test project +This repository contains Godot project which is tested in offical Godot repository(3.2 branch) -It creates and add to scene every single node. +It aims to be complex project, which will allow to find crashes, leaks and invalid memory writes before PR is merged. -For now it use only nodes with default parameters(they are add instantly after creating - add_node(Sprite.new())), but it should add as much parameters as possible. +Sadly it can't find any logic errors. -Project shouldn't use too much randomize functions, because reproducing bugs would be a madness. +For now it is really simple, but some I think that it can be improved over time. + +## Contributions +Contributions are welcome. + +For now there is no requirements to format code. + +New functionalities(e.g. physics checks) should be done in different folders(cleaner view to resources) + +## Epilepsy Warning +Due using by project a lot of functions from each type of Node, screen may flicker, images and objects may change randomly color and size which may lead some users to health problems. diff --git a/icon 32x32.png b/icon 32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5a4bb69c9246c86eb2063a51f80b953e91c6d GIT binary patch literal 7102 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 z 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 Yy;}mn%dTSqhYS!@Rz;>l%INF=1A-^RUH||9 literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..96cbf46 --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/misc/check_ci_log.py b/misc/check_ci_log.py new file mode 100755 index 0000000..19d0362 --- /dev/null +++ b/misc/check_ci_log.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys + +if len(sys.argv) < 2: + print("ERROR: You must run program with file name as argument.") + sys.exit(1) + +fname = sys.argv[1] + +fileread = open(fname.strip(), "r") +file_contents = fileread.read() + +# If find "ERROR: AddressSanitizer:", then happens invalid read or write +# This is critical bug, so we need to fix this as fast as possible + +if file_contents.find("ERROR: AddressSanitizer:") != -1: + print("FATAL ERROR: An incorrectly used memory was found.") + sys.exit(1) + +# There is also possible, that program crashed with or without backtrace. + +if ( + file_contents.find("Program crashed with signal") != -1 + or file_contents.find("Dumping the backtrace") != -1 + or file_contents.find("Segmentation fault (core dumped)") != -1 +): + print("FATAL ERROR: Godot has been crashed.") + sys.exit(1) + +# Finding memory leaks in Godot is quite difficult, because we need to take into +# account leaks also in external libraries. They are usually provided without +# debugging symbols, so the leak report from it usually has only 2/3 lines, +# so searching for 5 element - "#4 0x" - should correctly detect the vast +# majority of memory leaks + +if file_contents.find("ERROR: LeakSanitizer:") != -1: + if file_contents.find("#4 0x") != -1: + print("ERROR: Memory leak was found") + sys.exit(1) + +# It may happen that Godot detects leaking nodes/resources and removes them, so +# this possibility should also be handled as a potential error, even if +# LeakSanitizer doesn't report anything + +if file_contents.find("ObjectDB instances leaked at exit") != -1: + print("ERROR: Memory leak was found") + sys.exit(1) + +sys.exit(0) diff --git a/project.godot b/project.godot index 626f745..0601b3f 100644 --- a/project.godot +++ b/project.godot @@ -8,23 +8,41 @@ config_version=4 -_global_script_classes=[ ] +_global_script_classes=[ { +"base": "Node2D", +"class": "Operators", +"language": "GDScript", +"path": "res://MainScenes/Operators.gd" +} ] _global_script_class_icons={ - +"Operators": "" } [application] run/main_scene="res://All.tscn" +config/icon="res://icon.png" [autoload] -Autoload="*res://Autoload.gd" +Autoload="*res://Autoload/Autoload.gd" + +[debug] + +gdscript/warnings/enable=false +gdscript/warnings/standalone_expression=false [memory] limits/message_queue/max_size_kb=131072 +[network] + +limits/debugger_stdout/max_chars_per_second=16384 +limits/debugger_stdout/max_messages_per_frame=100 +limits/debugger_stdout/max_errors_per_second=1000 +limits/debugger_stdout/max_warnings_per_second=1000 + [rendering] environment/default_environment="res://Environment.tres"