diff --git a/BasisTraces.gd b/BasisTraces.gd new file mode 100644 index 0000000..8e3a1bc --- /dev/null +++ b/BasisTraces.gd @@ -0,0 +1,103 @@ +extends ImmediateGeometry + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +var tipXHistory = [] +var tipYHistory = [] +var tipZHistory = [] + +const tipHistoryLength = 1000 + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + var interpolatedTipX = get_node("../LOSolver_Interpolated/Basis/XAxisTip") + var interpolatedTipY = get_node("../LOSolver_Interpolated/Basis/YAxisTip") + var interpolatedTipZ = get_node("../LOSolver_Interpolated/Basis/ZAxisTip") + + if (tipXHistory.size() == 0 or + interpolatedTipX.global_transform.origin != tipXHistory[tipXHistory.size()-1] or + interpolatedTipY.global_transform.origin != tipYHistory[tipYHistory.size()-1] or + interpolatedTipZ.global_transform.origin != tipZHistory[tipZHistory.size()-1] + ): + tipXHistory.push_back(interpolatedTipX.global_transform.origin) + tipYHistory.push_back(interpolatedTipY.global_transform.origin) + tipZHistory.push_back(interpolatedTipZ.global_transform.origin) + + while tipXHistory.size() > tipHistoryLength: + tipXHistory.pop_front() + while tipYHistory.size() > tipHistoryLength: + tipYHistory.pop_front() + while tipZHistory.size() > tipHistoryLength: + tipZHistory.pop_front() + + clear() + + begin(Mesh.PRIMITIVE_POINTS) + set_color(Color(0.5,0,0,1)) + for coords in tipXHistory: + add_vertex(coords) + end() + + begin(Mesh.PRIMITIVE_POINTS) + set_color(Color(0,0.5,0,1)) + for coords in tipYHistory: + add_vertex(coords) + end() + + begin(Mesh.PRIMITIVE_POINTS) + set_color(Color(0,0,0.5,1)) + for coords in tipZHistory: + add_vertex(coords) + end() + + var PreATipX = get_node("../LOSolver_Object_Pre_A/BasisTips/XAxisTip") + var PreATipY = get_node("../LOSolver_Object_Pre_A/BasisTips/YAxisTip") + var PreATipZ = get_node("../LOSolver_Object_Pre_A/BasisTips/ZAxisTip") + + var ATipX = get_node("../LOSolver_Object_A/BasisTips/XAxisTip") + var ATipY = get_node("../LOSolver_Object_A/BasisTips/YAxisTip") + var ATipZ = get_node("../LOSolver_Object_A/BasisTips/ZAxisTip") + + var BTipX = get_node("../LOSolver_Object_B/BasisTips/XAxisTip") + var BTipY = get_node("../LOSolver_Object_B/BasisTips/YAxisTip") + var BTipZ = get_node("../LOSolver_Object_B/BasisTips/ZAxisTip") + + var PostBTipX = get_node("../LOSolver_Object_Post_B/BasisTips/XAxisTip") + var PostBTipY = get_node("../LOSolver_Object_Post_B/BasisTips/YAxisTip") + var PostBTipZ = get_node("../LOSolver_Object_Post_B/BasisTips/ZAxisTip") + + begin(Mesh.PRIMITIVE_LINE_STRIP) + set_color(Color(0,0,0,1)) + add_vertex(PreATipX.global_transform.origin) + add_vertex(ATipX.global_transform.origin) + add_vertex(BTipX.global_transform.origin) + add_vertex(PostBTipX.global_transform.origin) + end() + + begin(Mesh.PRIMITIVE_LINE_STRIP) + set_color(Color(0,0,0,1)) + add_vertex(PreATipY.global_transform.origin) + add_vertex(ATipY.global_transform.origin) + add_vertex(BTipY.global_transform.origin) + add_vertex(PostBTipY.global_transform.origin) + end() + + begin(Mesh.PRIMITIVE_LINE_STRIP) + set_color(Color(0,0,0,1)) + add_vertex(PreATipZ.global_transform.origin) + add_vertex(ATipZ.global_transform.origin) + add_vertex(BTipZ.global_transform.origin) + add_vertex(PostBTipZ.global_transform.origin) + end() + +func clearHistory(): + tipXHistory.clear() + tipYHistory.clear() + tipZHistory.clear() diff --git a/DebugIndicator.tscn b/DebugIndicator.tscn new file mode 100644 index 0000000..427ed23 --- /dev/null +++ b/DebugIndicator.tscn @@ -0,0 +1,172 @@ +[gd_scene load_steps=21 format=2] + +[sub_resource type="CylinderMesh" id=1] +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=2] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="CylinderMesh" id=3] +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=4] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="SpatialMaterial" id=5] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="CylinderMesh" id=6] +material = SubResource( 5 ) +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 + +[sub_resource type="CylinderMesh" id=7] +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=8] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="CylinderMesh" id=9] +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=10] +albedo_color = Color( 0, 0, 1, 1 ) + +[sub_resource type="SpatialMaterial" id=11] +albedo_color = Color( 0, 0, 1, 1 ) + +[sub_resource type="CylinderMesh" id=12] +material = SubResource( 11 ) +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="CylinderMesh" id=13] +top_radius = 0.02 +bottom_radius = 0.02 +height = 50.0 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=14] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="SpatialMaterial" id=15] +render_priority = 1 +flags_transparent = true +albedo_color = Color( 1, 0, 0, 0.690196 ) +uv1_scale = Vector3( 200, 200, 1 ) + +[sub_resource type="CubeMesh" id=16] +material = SubResource( 15 ) +size = Vector3( 10, 10, 0.001 ) + +[sub_resource type="SpatialMaterial" id=17] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="CylinderMesh" id=18] +material = SubResource( 17 ) +top_radius = 0.025 +bottom_radius = 0.025 +height = 4.0 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=19] +albedo_color = Color( 0, 0, 1, 1 ) + +[sub_resource type="CylinderMesh" id=20] +material = SubResource( 19 ) +top_radius = 0.025 +bottom_radius = 0.025 +height = 4.0 +radial_segments = 8 +rings = 1 + +[node name="DebugIndicator" type="Spatial"] + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +visible = false +editor_only = true + +[node name="XAxis" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0.4, 0, 0 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) + +[node name="XAxisTipCone" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, 1, 0, -1, -1.62921e-07, 0, 0, 0, 1, 0.9, 0, 0 ) +mesh = SubResource( 3 ) +material/0 = SubResource( 4 ) + +[node name="YAxis" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0 ) +mesh = SubResource( 6 ) +material/0 = null + +[node name="YAxisTipCone" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0 ) +mesh = SubResource( 7 ) +material/0 = SubResource( 8 ) + +[node name="ZAxis" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0.4 ) +mesh = SubResource( 9 ) +material/0 = SubResource( 10 ) + +[node name="ZAxisTipCone" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0.9 ) +mesh = SubResource( 12 ) +material/0 = null + +[node name="XAxisLong" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 25, 0, 0 ) +visible = false +mesh = SubResource( 13 ) +material/0 = SubResource( 14 ) + +[node name="XYPlane" type="MeshInstance" parent="."] +visible = false +mesh = SubResource( 16 ) +material/0 = null + +[node name="RefAngleA" type="MeshInstance" parent="."] +transform = Transform( 0.866025, -0.5, 0, 0.5, 0.866025, 0, 0, 0, 1, -1, 1.732, 0 ) +visible = false +mesh = SubResource( 18 ) +material/0 = null + +[node name="RefAngleB" type="MeshInstance" parent="."] +transform = Transform( -0.866026, -0.5, 0, 0.5, -0.866026, 0, 0, 0, 1, -1, -1.732, 0 ) +visible = false +mesh = SubResource( 20 ) +material/0 = null + +[node name="XAxisTip" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 ) + +[node name="YAxisTip" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 ) + +[node name="ZAxisTip" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1 ) diff --git a/DebugIndicator_TipsOnly.tscn b/DebugIndicator_TipsOnly.tscn new file mode 100644 index 0000000..a41b712 --- /dev/null +++ b/DebugIndicator_TipsOnly.tscn @@ -0,0 +1,169 @@ +[gd_scene load_steps=21 format=2] + +[sub_resource type="CylinderMesh" id=1] +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=2] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="CylinderMesh" id=3] +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=4] +flags_transparent = true +albedo_color = Color( 1, 0, 0, 0.784314 ) + +[sub_resource type="SpatialMaterial" id=5] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="CylinderMesh" id=6] +material = SubResource( 5 ) +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 + +[sub_resource type="CylinderMesh" id=7] +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=8] +flags_transparent = true +albedo_color = Color( 0, 1, 0, 0.784314 ) + +[sub_resource type="CylinderMesh" id=9] +top_radius = 0.05 +bottom_radius = 0.05 +height = 0.8 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=10] +albedo_color = Color( 0, 0, 1, 1 ) + +[sub_resource type="SpatialMaterial" id=11] +flags_transparent = true +albedo_color = Color( 0, 0, 1, 0.784314 ) + +[sub_resource type="CylinderMesh" id=12] +material = SubResource( 11 ) +top_radius = 0.001 +bottom_radius = 0.1 +height = 0.2 +radial_segments = 8 +rings = 1 + +[sub_resource type="CylinderMesh" id=13] +top_radius = 0.02 +bottom_radius = 0.02 +height = 50.0 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=14] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="SpatialMaterial" id=15] +render_priority = 1 +flags_transparent = true +albedo_color = Color( 1, 0, 0, 0.690196 ) +uv1_scale = Vector3( 200, 200, 1 ) + +[sub_resource type="CubeMesh" id=16] +material = SubResource( 15 ) +size = Vector3( 10, 10, 0.001 ) + +[sub_resource type="SpatialMaterial" id=17] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="CylinderMesh" id=18] +material = SubResource( 17 ) +top_radius = 0.025 +bottom_radius = 0.025 +height = 4.0 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=19] +albedo_color = Color( 0, 0, 1, 1 ) + +[sub_resource type="CylinderMesh" id=20] +material = SubResource( 19 ) +top_radius = 0.025 +bottom_radius = 0.025 +height = 4.0 +radial_segments = 8 +rings = 1 + +[node name="DebugIndicator" type="Spatial"] + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +visible = false +editor_only = true + +[node name="XAxis" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0.4, 0, 0 ) +visible = false +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) + +[node name="XAxisTip" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, 1, 0, -1, -1.62921e-07, 0, 0, 0, 1, 0.9, 0, 0 ) +mesh = SubResource( 3 ) +material/0 = SubResource( 4 ) + +[node name="YAxis" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0 ) +visible = false +mesh = SubResource( 6 ) +material/0 = null + +[node name="YAxisTip" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0 ) +mesh = SubResource( 7 ) +material/0 = SubResource( 8 ) + +[node name="ZAxis" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0.4 ) +visible = false +mesh = SubResource( 9 ) +material/0 = SubResource( 10 ) + +[node name="ZAxisTip" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0.9 ) +mesh = SubResource( 12 ) +material/0 = null + +[node name="XAxisLong" type="MeshInstance" parent="."] +transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 25, 0, 0 ) +visible = false +mesh = SubResource( 13 ) +material/0 = SubResource( 14 ) + +[node name="XYPlane" type="MeshInstance" parent="."] +visible = false +mesh = SubResource( 16 ) +material/0 = null + +[node name="RefAngleA" type="MeshInstance" parent="."] +transform = Transform( 0.866025, -0.5, 0, 0.5, 0.866025, 0, 0, 0, 1, -1, 1.732, 0 ) +visible = false +mesh = SubResource( 18 ) +material/0 = null + +[node name="RefAngleB" type="MeshInstance" parent="."] +transform = Transform( -0.866026, -0.5, 0, 0.5, -0.866026, 0, 0, 0, 1, -1, -1.732, 0 ) +visible = false +mesh = SubResource( 20 ) +material/0 = null diff --git a/Gary.gd b/Gary.gd index f8e32eb..8e036d1 100644 --- a/Gary.gd +++ b/Gary.gd @@ -10,7 +10,7 @@ var direction = Vector3() var velocityMultiplier = 0.2 #fly variables -const FLY_SPEED = 20 +const FLY_SPEED = 5 const FLY_ACCEL = 4 var mouse_captured = false diff --git a/Gary.tscn b/Gary.tscn index eed4a05..141fd76 100644 --- a/Gary.tscn +++ b/Gary.tscn @@ -63,6 +63,7 @@ shape = SubResource( 1 ) [node name="FirstPersonCamera" type="Camera" parent="Head"] current = true +near = 0.01 far = 10000.0 [node name="OmniLight" type="OmniLight" parent="."] diff --git a/GreenCylinder.gd b/GreenCylinder.gd index 49f73c5..1a25b32 100644 --- a/GreenCylinder.gd +++ b/GreenCylinder.gd @@ -14,7 +14,7 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): - var loSolverObject = get_node("../LOSolver_Object") + var loSolverObject = get_node("../LOSolver_Interpolated") var newTranslation = loSolverObject.global_transform.origin newTranslation += loSolverObject.global_transform.basis.z * 0.25 newTranslation[1] = max((1.85 - 2.0 + groundLevel), (loSolverObject.global_transform.origin.y - 2.0 + 0.05)) diff --git a/LOScriptReplayer.gd b/LOScriptReplayer.gd index 5c76864..d6da4f4 100644 --- a/LOScriptReplayer.gd +++ b/LOScriptReplayer.gd @@ -1,6 +1,6 @@ extends Spatial -enum QUAT_INTERPOLATION_METHOD { lastValue, nextValue, nearestValue, slerp, slerpni, cubic_slerp } +enum QUAT_INTERPOLATION_METHOD { lastLastValue, lastValue, nextValue, nextNextValue, nearestValue, slerp, slerpni, cubic_slerp } enum ORIGIN_INTERPOLATION_METHOD { lastValue, nextValue, nearestValue, linear, cubic } export var loFilename:String = "" @@ -10,6 +10,10 @@ export var quatInterpolationDebugOutput:bool = false export (ORIGIN_INTERPOLATION_METHOD) var originInterpolationMethod = ORIGIN_INTERPOLATION_METHOD.cubic export(QUAT_INTERPOLATION_METHOD) var quatInterpolationMethod = QUAT_INTERPOLATION_METHOD.slerp +# To get sparser data for quaternion interpolation tests: +# 0 -> Does not skip any lines, 1 -> Skips every other line etc. +const readLineSkip = 3 + class LOItem: var origin:Vector3 var quat:Quat @@ -55,14 +59,22 @@ func loadFile(fileName): return while not file.eof_reached(): + + for _i in range(readLineSkip): + # To get sparser data for quaternion interpolation tests + file.get_line() + # TODO: Maybe add some error checking here... + line = file.get_line() var subStrings = line.split("\t") if (subStrings.size() >= (1 + (4 * 3))): var iTOW = subStrings[0].to_int() #Coordinates in Godot's native "EUS"-convention: - var origin = Vector3(subStrings[1], subStrings[2], subStrings[3]) + # (Replaced with a constant here for quaternion interpolation bug-testing) +# var origin = Vector3(subStrings[1], subStrings[2], subStrings[3]) + var origin = Vector3(0, 2, 0) var unitVecX = Vector3(subStrings[4], subStrings[5], subStrings[6]) var unitVecY = Vector3(subStrings[7], subStrings[8], subStrings[9]) var unitVecZ = Vector3(subStrings[10], subStrings[11], subStrings[12]) @@ -167,10 +179,14 @@ func _process(_delta): var quat_pre_a:Quat = loData[loDataKeys[lastITOWIndex - 1]].quat var quat_post_b:Quat = loData[loDataKeys[nextITOWIndex + 1]].quat match quatInterpolationMethod: + QUAT_INTERPOLATION_METHOD.lastLastValue: + quat = quat_pre_a QUAT_INTERPOLATION_METHOD.lastValue: quat = quat_a QUAT_INTERPOLATION_METHOD.nextValue: quat = quat_b + QUAT_INTERPOLATION_METHOD.nextNextValue: + quat = quat_post_b QUAT_INTERPOLATION_METHOD.nearestValue: quat = quat_a if fraction < 0.5 else quat_b QUAT_INTERPOLATION_METHOD.slerp: @@ -192,10 +208,10 @@ func _process(_delta): # Small value added here to prevent flickering "-"-sign in output var dbgDiffQuat = Quat( - quat.x - dbgSlerpedQuat.x + 0.00001, - quat.y - dbgSlerpedQuat.y + 0.00001, - quat.z - dbgSlerpedQuat.z + 0.00001, - quat.w - dbgSlerpedQuat.w + 0.00001) + quat.x - dbgSlerpedQuat.x + 0.000001, + quat.y - dbgSlerpedQuat.y + 0.000001, + quat.z - dbgSlerpedQuat.z + 0.000001, + quat.w - dbgSlerpedQuat.w + 0.000001) var dbgString = "\n%s\n%s\n%s (frac: %.3f)\n%s\n%s\n\n%s\n%s" % [ quatToString(quat_pre_a), quatToString(quat_a), @@ -211,4 +227,4 @@ func _process(_delta): transform = tr func quatToString(quat:Quat): - return "w: %.3f, x: %.3f, y: %.3f, z: %.3f" % [quat.w, quat.x, quat.y, quat.z] + return "w: %.4f, x: %.4f, y: %.4f, z: %.4f" % [quat.w, quat.x, quat.y, quat.z] diff --git a/Main.gd b/Main.gd index 110a665..c973ecb 100644 --- a/Main.gd +++ b/Main.gd @@ -19,7 +19,7 @@ var datasets = [ # This is for a special quaternion interpolation test [124168900, 124188100, "res://LOScripts/ObjectWiggle_Object.LOScript", "res://LOScripts/ObjectWiggle_Camera_Averaged.LOScript"], - [384480000, 384662000, "res://LOScripts/AllMoving_Object.LOScript", "res://LOScripts/AllMoving_Camera.LOScript"], + [384481600, 384662000, "res://LOScripts/AllMoving_Object.LOScript", "res://LOScripts/AllMoving_Camera.LOScript"], [384909000, 385002000, "res://LOScripts/AllMoving2_Object.LOScript", "res://LOScripts/AllMoving2_Camera.LOScript"], [29300000, 29357000, "res://LOScripts/AllMoving3_Object.LOScript", "res://LOScripts/AllMoving3_Camera.LOScript"], [383596000, 383748000, "res://LOScripts/ObjectStill_AndCat_Object.LOScript", "res://LOScripts/ObjectStill_AndCat_Camera.LOScript"], @@ -50,7 +50,7 @@ const V_HORSE:int = 1 << 3 const V_HORSE_SIDEWAYS:int = 1 << 4 const V_AEROPLANE:int = 1 << 5 const V_SPACESHIP:int = 1 << 6 -const V_WEIGHTS:int = 1 << 7 +const V_BASIS:int = 1 << 7 # Scripts defining visibilities of different objects. # ITOW value is used as a "key". @@ -61,7 +61,7 @@ var visibilityScripts = { 0: [ # ITOW, objects, TimeShifted object, Timeshift value [384433000, V_CAR, 0, -25000], [384522111, V_SPACESHIP, 0, -25000], - [384547045, V_WEIGHTS, 0, -25000], + [384547045, V_BASIS, 0, -25000], [384555000, V_CAR, 0, -25000], [384572000, V_CAR, V_SPACESHIP, -25000], # Sped-up spaceship between this and the next step (timeshift changes by 7 s in 2 seconds of "real time") [384574000, V_HORSE, V_SPACESHIP, -18000], # Little less sped-up spaceship (timeshift changes by 12 s in about 21 seconds of "real time") @@ -75,7 +75,7 @@ var visibilityScripts = { [384851500, V_CAR, 0, -5000], [384935000, V_HORSE_SIDEWAYS, 0, -5000], [384944000, V_HORSE, 0, -5000], - [384955000, V_WEIGHTS, 0, -5000], + [384955000, V_BASIS, 0, -5000], [384961000, V_AEROPLANE, 0, -5000], [384966000, V_AEROPLANE, V_HORSE, -5000], [384994000, V_AEROPLANE, 0, -5000], @@ -96,6 +96,10 @@ func _ready(): datasetSpinBox.min_value = 1 datasetSpinBox.max_value = datasets.size() _on_SpinBox_Dataset_value_changed(datasetSpinBox.value) + + var camera = get_node("FirstPerson/Head/FirstPersonCamera") + camera.current = true + # Called every frame. 'delta' is the elapsed time since the previous frame. # (delta not used here to get better sync when generating video) @@ -141,7 +145,7 @@ func _process(_delta): get_node("Panel_UIControls/CheckBox_Object_HorseSideways").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][1] & V_HORSE_SIDEWAYS get_node("Panel_UIControls/CheckBox_Object_Aeroplane").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][1] & V_AEROPLANE get_node("Panel_UIControls/CheckBox_Object_Spaceship").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][1] & V_SPACESHIP - get_node("Panel_UIControls/CheckBox_Object_Weights").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][1] & V_WEIGHTS + get_node("Panel_UIControls/CheckBox_Object_Basis").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][1] & V_BASIS get_node("Panel_UIControls/CheckBox_Timeshift_Triangle").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_TRIANGLE get_node("Panel_UIControls/CheckBox_Timeshift_Car").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_CAR @@ -150,7 +154,7 @@ func _process(_delta): get_node("Panel_UIControls/CheckBox_Timeshift_HorseSideways").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_HORSE_SIDEWAYS get_node("Panel_UIControls/CheckBox_Timeshift_Aeroplane").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_AEROPLANE get_node("Panel_UIControls/CheckBox_Timeshift_Spaceship").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_SPACESHIP - get_node("Panel_UIControls/CheckBox_Timeshift_Weights").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_WEIGHTS + get_node("Panel_UIControls/CheckBox_Timeshift_Basis").pressed = visibilityScripts[dataSetIndexInUse][visibilityScriptIndex][2] & V_BASIS visibilityScriptIndex += 1 @@ -165,8 +169,14 @@ func _on_SpinBox_Dataset_value_changed(value): dataSetIndexInUse = index visibilityScriptIndex = 0 - get_node("LOSolver_Object").loadFile(datasets[index][2]) - get_node("LOSolver_TimeShift").loadFile(datasets[index][2]) + get_node("LOSolver_Object_A").loadFile(datasets[index][2]) + + get_node("LOSolver_Object_Pre_A").loadFile(datasets[index][2]) + get_node("LOSolver_Object_B").loadFile(datasets[index][2]) + get_node("LOSolver_Object_Post_B").loadFile(datasets[index][2]) + + + get_node("LOSolver_Interpolated").loadFile(datasets[index][2]) get_node("LOSolver_Camera").loadFile(datasets[index][3]) else: print("Dataset not found!") @@ -179,7 +189,10 @@ func camSwitch(): var camera = get_node("LOSolver_Camera/RigCamera") camera.current = true if Input.is_action_pressed("camera_3"): - var camera = get_node("LOSolver_Object/ObjectCamera") + var camera = get_node("LOSolver_Interpolated/ObjectCamera") + camera.current = true + if Input.is_action_pressed("camera_4"): + var camera = get_node("LOSolver_Interpolated/ObjectCamera_Zoomed") camera.current = true func handleScriptPlaybackControls(): @@ -189,3 +202,4 @@ func handleScriptPlaybackControls(): iTOWstartTicks_msec = iTOWstartTicks_msec - 5000 if Input.is_action_pressed("resetITOW"): iTOWstartTicks_msec = OS.get_ticks_msec() + $BasisTraces.clearHistory() diff --git a/Main.tscn b/Main.tscn index 8901220..f8cf641 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=42 format=2] +[gd_scene load_steps=50 format=2] [ext_resource path="res://GreenCylinder.gd" type="Script" id=1] [ext_resource path="res://Label_ITOW.gd" type="Script" id=2] @@ -22,6 +22,9 @@ [ext_resource path="res://Weight.tscn" type="PackedScene" id=20] [ext_resource path="res://CheckBox_ShowControls.gd" type="Script" id=21] [ext_resource path="res://CheckBox_ShowInfo.gd" type="Script" id=22] +[ext_resource path="res://DebugIndicator.tscn" type="PackedScene" id=23] +[ext_resource path="res://DebugIndicator_TipsOnly.tscn" type="PackedScene" id=24] +[ext_resource path="res://BasisTraces.gd" type="Script" id=25] [sub_resource type="PrismMesh" id=1] size = Vector3( 1, 2, 5 ) @@ -113,14 +116,36 @@ albedo_color = Color( 0.529412, 0.219608, 0.219608, 1 ) material = SubResource( 18 ) size = Vector3( 5, 3, 7.5 ) +[sub_resource type="SpatialMaterial" id=20] +flags_unshaded = true +flags_use_point_size = true +vertex_color_use_as_albedo = true +params_point_size = 5.0 + +[sub_resource type="CylinderMesh" id=21] +top_radius = 0.01 +bottom_radius = 0.01 +height = 5.0 +radial_segments = 8 +rings = 1 + +[sub_resource type="SpatialMaterial" id=22] +albedo_color = Color( 1, 0, 0, 1 ) + +[sub_resource type="SpatialMaterial" id=23] +albedo_color = Color( 0, 1, 0, 1 ) + +[sub_resource type="SpatialMaterial" id=24] +albedo_color = Color( 0, 0, 1, 1 ) + [node name="Main" type="Node"] pause_mode = 2 script = ExtResource( 18 ) -replaySpeed = 0.2 +replaySpeed = 0.1 [node name="FirstPerson" parent="." instance=ExtResource( 7 )] pause_mode = 2 -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 7 ) +transform = Transform( 0.848048, 0.26496, -0.458924, 0, 0.866025, 0.5, 0.529919, -0.424024, 0.734431, -1.14905, 2.78599, 1.90628 ) [node name="Panel_ShowControls" type="Panel" parent="."] anchor_left = 1.0 @@ -210,7 +235,6 @@ text = "Objects:" margin_top = 60.0 margin_right = 114.0 margin_bottom = 84.0 -pressed = true text = "Triangle" __meta__ = { "_edit_use_anchors_": false @@ -265,22 +289,23 @@ margin_right = 92.0001 margin_bottom = 204.62 text = "Spaceship" -[node name="CheckBox_Object_Weights" type="CheckBox" parent="Panel_UIControls"] +[node name="CheckBox_Object_Basis" type="CheckBox" parent="Panel_UIControls"] margin_left = 6.10352e-05 margin_top = 200.62 margin_right = 115.0 margin_bottom = 224.62 -text = "Weights" +pressed = true +text = "Basis" __meta__ = { "_edit_use_anchors_": false } [node name="Label_TimeShiftedObjects" type="Label" parent="Panel_UIControls"] -margin_left = 112.0 +margin_left = 80.502 margin_top = 46.0 -margin_right = 256.0 +margin_right = 249.502 margin_bottom = 60.0 -text = "Timeshifted objects:" +text = "Quat-interpolated objects:" __meta__ = { "_edit_use_anchors_": false } @@ -300,7 +325,6 @@ margin_left = 125.0 margin_top = 80.0 margin_right = 230.0 margin_bottom = 104.0 -pressed = true text = "Car" __meta__ = { "_edit_use_anchors_": false @@ -350,12 +374,13 @@ margin_right = 217.0 margin_bottom = 204.62 text = "Spaceship" -[node name="CheckBox_Timeshift_Weights" type="CheckBox" parent="Panel_UIControls"] +[node name="CheckBox_Timeshift_Basis" type="CheckBox" parent="Panel_UIControls"] margin_left = 125.0 margin_top = 200.62 margin_right = 239.0 margin_bottom = 224.62 -text = "Weights" +pressed = true +text = "Basis" __meta__ = { "_edit_use_anchors_": false } @@ -539,73 +564,101 @@ shape = SubResource( 5 ) [node name="EEgg" parent="." instance=ExtResource( 15 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 110 ) -[node name="LOSolver_Object" parent="." instance=ExtResource( 8 )] +[node name="LOSolver_Object_Pre_A" parent="." instance=ExtResource( 8 )] +quatInterpolationMethod = 0 + +[node name="BasisTips" parent="LOSolver_Object_Pre_A" instance=ExtResource( 24 )] + +[node name="LOSolver_Object_A" parent="." instance=ExtResource( 8 )] +quatInterpolationMethod = 1 -[node name="Triangle" parent="LOSolver_Object" instance=ExtResource( 12 )] +[node name="Triangle" parent="LOSolver_Object_A" instance=ExtResource( 12 )] -[node name="Car" parent="LOSolver_Object" instance=ExtResource( 10 )] +[node name="Car" parent="LOSolver_Object_A" instance=ExtResource( 10 )] transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5, 0 ) -[node name="Car_Big" parent="LOSolver_Object" instance=ExtResource( 10 )] +[node name="Car_Big" parent="LOSolver_Object_A" instance=ExtResource( 10 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0 ) visible = false -[node name="Horse" parent="LOSolver_Object" instance=ExtResource( 9 )] +[node name="Horse" parent="LOSolver_Object_A" instance=ExtResource( 9 )] transform = Transform( -1.62921e-07, 0, -1, 0, 1, 0, 1, 0, -1.62921e-07, -0.054, -0.863, 0.2 ) visible = false -[node name="Horse_Sideways" parent="LOSolver_Object" instance=ExtResource( 9 )] +[node name="Horse_Sideways" parent="LOSolver_Object_A" instance=ExtResource( 9 )] transform = Transform( 0.987055, 0.160381, 0, -0.160381, 0.987055, 0, 0, 0, 1, -0.241781, -0.897645, 0.125785 ) -[node name="Aeroplane" parent="LOSolver_Object" instance=ExtResource( 13 )] +[node name="Aeroplane" parent="LOSolver_Object_A" instance=ExtResource( 13 )] visible = false -[node name="Spaceship" parent="LOSolver_Object" instance=ExtResource( 11 )] +[node name="Spaceship" parent="LOSolver_Object_A" instance=ExtResource( 11 )] transform = Transform( -0.1, 0, 0, 0, 0.1, 0, 0, 0, -0.1, 0, -0.2, 0.0729586 ) visible = false -[node name="ObjectCamera" type="Camera" parent="LOSolver_Object"] -transform = Transform( 1, 0, 0, 0, 0.934466, 0.356053, 0, -0.356053, 0.934466, 0, 0.772761, 2.47205 ) -current = true -far = 1000.0 +[node name="Weights" parent="LOSolver_Object_A" instance=ExtResource( 20 )] +visible = false + +[node name="BasisTips" parent="LOSolver_Object_A" instance=ExtResource( 24 )] + +[node name="LOSolver_Object_B" parent="." instance=ExtResource( 8 )] +quatInterpolationMethod = 2 + +[node name="BasisTips" parent="LOSolver_Object_B" instance=ExtResource( 24 )] -[node name="Weights" parent="LOSolver_Object" instance=ExtResource( 20 )] +[node name="LOSolver_Object_Post_B" parent="." instance=ExtResource( 8 )] +quatInterpolationMethod = 3 -[node name="LOSolver_TimeShift" parent="." instance=ExtResource( 8 )] +[node name="BasisTips" parent="LOSolver_Object_Post_B" instance=ExtResource( 24 )] + +[node name="LOSolver_Interpolated" parent="." instance=ExtResource( 8 )] quatInterpolationDebugOutput = true -quatInterpolationMethod = 5 +quatInterpolationMethod = 7 -[node name="Triangle" parent="LOSolver_TimeShift" instance=ExtResource( 12 )] +[node name="Triangle" parent="LOSolver_Interpolated" instance=ExtResource( 12 )] -[node name="Car" parent="LOSolver_TimeShift" instance=ExtResource( 10 )] +[node name="Car" parent="LOSolver_Interpolated" instance=ExtResource( 10 )] transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5, 0 ) visible = false -[node name="Car_Big" parent="LOSolver_TimeShift" instance=ExtResource( 10 )] +[node name="Car_Big" parent="LOSolver_Interpolated" instance=ExtResource( 10 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0 ) visible = false -[node name="Horse" parent="LOSolver_TimeShift" instance=ExtResource( 9 )] +[node name="Horse" parent="LOSolver_Interpolated" instance=ExtResource( 9 )] transform = Transform( -1.62921e-07, 0, -1, 0, 1, 0, 1, 0, -1.62921e-07, -0.054, -0.863, 0.2 ) visible = false -[node name="Horse_Sideways" parent="LOSolver_TimeShift" instance=ExtResource( 9 )] +[node name="Horse_Sideways" parent="LOSolver_Interpolated" instance=ExtResource( 9 )] transform = Transform( 0.987055, 0.160381, 0, -0.160381, 0.987055, 0, 0, 0, 1, -0.241781, -0.897645, 0.125785 ) -[node name="Aeroplane" parent="LOSolver_TimeShift" instance=ExtResource( 13 )] +[node name="Aeroplane" parent="LOSolver_Interpolated" instance=ExtResource( 13 )] visible = false -[node name="Spaceship" parent="LOSolver_TimeShift" instance=ExtResource( 11 )] +[node name="Spaceship" parent="LOSolver_Interpolated" instance=ExtResource( 11 )] transform = Transform( -0.1, 0, 0, 0, 0.1, 0, 0, 0, -0.1, 0, -0.2, 0.0729586 ) visible = false -[node name="Weights" parent="LOSolver_TimeShift" instance=ExtResource( 20 )] +[node name="Weights" parent="LOSolver_Interpolated" instance=ExtResource( 20 )] +visible = false + +[node name="Basis" parent="LOSolver_Interpolated" instance=ExtResource( 23 )] + +[node name="ObjectCamera" type="Camera" parent="LOSolver_Interpolated"] +transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 2, 0, 0 ) +far = 1000.0 + +[node name="ObjectCamera_Zoomed" type="Camera" parent="LOSolver_Interpolated"] +transform = Transform( -1.62921e-07, 0, 1, 0, 1, 0, -1, 0, -1.62921e-07, 2, 0, 0 ) +fov = 25.8 +far = 1000.0 [node name="LOSolver_Camera" parent="." instance=ExtResource( 8 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.46194, 5.06226 ) +visible = false [node name="RigCamera" type="Camera" parent="LOSolver_Camera"] transform = Transform( 1, 0, 0, 0, 0.999657, 0.026177, 0, -0.026177, 0.999657, 0, 0, 0 ) +current = true fov = 42.0 far = 1000.0 @@ -626,9 +679,11 @@ script = ExtResource( 1 ) [node name="LowPolyCar_Parked" parent="." instance=ExtResource( 10 )] transform = Transform( -0.186987, 0, -0.982362, 0, 1, 0, 0.982362, 0, -0.186987, 0.538, -0.0552456, -3.495 ) +visible = false [node name="Spruce" type="Spatial" parent="."] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -11.75, -0.661975, 13.2 ) +visible = false [node name="Trunk" type="MeshInstance" parent="Spruce"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 15, 0 ) @@ -644,6 +699,7 @@ material/0 = null [node name="House" type="Spatial" parent="."] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 16.7, 3.5, 12.5 ) +visible = false [node name="MeshInstance" type="MeshInstance" parent="House"] mesh = SubResource( 14 ) @@ -665,10 +721,10 @@ mesh = SubResource( 19 ) material/0 = null [node name="Panel_Quat" type="Panel" parent="."] -anchor_top = 0.793 +anchor_top = 1.0 anchor_bottom = 1.0 margin_left = 2.0 -margin_top = -69.22 +margin_top = -162.0 margin_right = 517.0 __meta__ = { "_edit_use_anchors_": false @@ -700,4 +756,26 @@ align = 2 __meta__ = { "_edit_use_anchors_": false } + +[node name="BasisTraces" type="ImmediateGeometry" parent="."] +material_override = SubResource( 20 ) +cast_shadow = 0 +script = ExtResource( 25 ) + +[node name="WorldAxes" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0 ) + +[node name="X" type="MeshInstance" parent="WorldAxes"] +transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, 0, 0, 0 ) +mesh = SubResource( 21 ) +material/0 = SubResource( 22 ) + +[node name="Y" type="MeshInstance" parent="WorldAxes"] +mesh = SubResource( 21 ) +material/0 = SubResource( 23 ) + +[node name="Z" type="MeshInstance" parent="WorldAxes"] +transform = Transform( 2.65431e-14, 1.62921e-07, 1, 1, -1.62921e-07, 0, 1.62921e-07, 1, -1.62921e-07, 0, 0, 0 ) +mesh = SubResource( 21 ) +material/0 = SubResource( 24 ) [connection signal="value_changed" from="Panel_UIControls/SpinBox_Dataset" to="." method="_on_SpinBox_Dataset_value_changed"] diff --git a/Panel_UIControls.gd b/Panel_UIControls.gd index f0b91d4..4364f94 100644 --- a/Panel_UIControls.gd +++ b/Panel_UIControls.gd @@ -17,24 +17,29 @@ func _process(_delta): get_node("../Ground").visible = get_node("CheckBox_Ground").pressed get_node("../GreenCylinder").visible = get_node("CheckBox_GreenCylinder").pressed - get_node("../LOSolver_Object/Triangle").visible = get_node("CheckBox_Object_Triangle").pressed - get_node("../LOSolver_Object/Car").visible = get_node("CheckBox_Object_Car").pressed - get_node("../LOSolver_Object/Car_Big").visible = get_node("CheckBox_Object_Car_Big").pressed - get_node("../LOSolver_Object/Horse").visible = get_node("CheckBox_Object_Horse").pressed - get_node("../LOSolver_Object/Horse_Sideways").visible = get_node("CheckBox_Object_HorseSideways").pressed - get_node("../LOSolver_Object/Aeroplane").visible = get_node("CheckBox_Object_Aeroplane").pressed - get_node("../LOSolver_Object/Spaceship").visible = get_node("CheckBox_Object_Spaceship").pressed - get_node("../LOSolver_Object/Weights").visible = get_node("CheckBox_Object_Weights").pressed - - get_node("../LOSolver_TimeShift/Triangle").visible = get_node("CheckBox_Timeshift_Triangle").pressed - get_node("../LOSolver_TimeShift/Car").visible = get_node("CheckBox_Timeshift_Car").pressed - get_node("../LOSolver_TimeShift/Car_Big").visible = get_node("CheckBox_Timeshift_Car_Big").pressed - get_node("../LOSolver_TimeShift/Horse").visible = get_node("CheckBox_Timeshift_Horse").pressed - get_node("../LOSolver_TimeShift/Horse_Sideways").visible = get_node("CheckBox_Timeshift_HorseSideways").pressed - get_node("../LOSolver_TimeShift/Aeroplane").visible = get_node("CheckBox_Timeshift_Aeroplane").pressed - get_node("../LOSolver_TimeShift/Spaceship").visible = get_node("CheckBox_Timeshift_Spaceship").pressed - get_node("../LOSolver_TimeShift/Weights").visible = get_node("CheckBox_Timeshift_Weights").pressed - - get_node("../LOSolver_TimeShift").iTOWShift = get_node("SpinBox_Timeshift").value + get_node("../LOSolver_Object_A/Triangle").visible = get_node("CheckBox_Object_Triangle").pressed + get_node("../LOSolver_Object_A/Car").visible = get_node("CheckBox_Object_Car").pressed + get_node("../LOSolver_Object_A/Car_Big").visible = get_node("CheckBox_Object_Car_Big").pressed + get_node("../LOSolver_Object_A/Horse").visible = get_node("CheckBox_Object_Horse").pressed + get_node("../LOSolver_Object_A/Horse_Sideways").visible = get_node("CheckBox_Object_HorseSideways").pressed + get_node("../LOSolver_Object_A/Aeroplane").visible = get_node("CheckBox_Object_Aeroplane").pressed + get_node("../LOSolver_Object_A/Spaceship").visible = get_node("CheckBox_Object_Spaceship").pressed + get_node("../LOSolver_Object_A/BasisTips").visible = get_node("CheckBox_Object_Basis").pressed + + get_node("../LOSolver_Object_Pre_A/BasisTips").visible = get_node("CheckBox_Object_Basis").pressed + get_node("../LOSolver_Object_B/BasisTips").visible = get_node("CheckBox_Object_Basis").pressed + get_node("../LOSolver_Object_Post_B/BasisTips").visible = get_node("CheckBox_Object_Basis").pressed + + + get_node("../LOSolver_Interpolated/Triangle").visible = get_node("CheckBox_Timeshift_Triangle").pressed + get_node("../LOSolver_Interpolated/Car").visible = get_node("CheckBox_Timeshift_Car").pressed + get_node("../LOSolver_Interpolated/Car_Big").visible = get_node("CheckBox_Timeshift_Car_Big").pressed + get_node("../LOSolver_Interpolated/Horse").visible = get_node("CheckBox_Timeshift_Horse").pressed + get_node("../LOSolver_Interpolated/Horse_Sideways").visible = get_node("CheckBox_Timeshift_HorseSideways").pressed + get_node("../LOSolver_Interpolated/Aeroplane").visible = get_node("CheckBox_Timeshift_Aeroplane").pressed + get_node("../LOSolver_Interpolated/Spaceship").visible = get_node("CheckBox_Timeshift_Spaceship").pressed + get_node("../LOSolver_Interpolated/Basis").visible = get_node("CheckBox_Timeshift_Basis").pressed + + get_node("../LOSolver_Interpolated").iTOWShift = get_node("SpinBox_Timeshift").value get_node("../Panel_3DModelLicenseInfo").visible = get_node("CheckBox_3DModelInfo").pressed diff --git a/project.godot b/project.godot index d571eaf..ee9a366 100644 --- a/project.godot +++ b/project.godot @@ -21,6 +21,7 @@ config/icon="res://icon.png" [debug] +settings/fps/force_fps=60 settings/stdout/print_fps=true [display] @@ -134,6 +135,11 @@ pause={ "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":80,"unicode":0,"echo":false,"script":null) ] } +camera_4={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777247,"unicode":0,"echo":false,"script":null) + ] +} [network]