Improved bullet tracer graphics, fixed shell casing velocity and rotation (not entirely, but almost - player vlocity is not applied, becasue it contains gravity and that's nnot good for this case).

Also fixed bullet tracer  spawning a little further away to not clip the weapon.
Also synced spawning the shell casing wiht the animation.
godot4-port
unfa 2020-09-25 00:23:09 +02:00
parent 8035a3037d
commit c041adc786
9 changed files with 206 additions and 94 deletions

Binary file not shown.

View File

@ -14,7 +14,7 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if first:
translate_object_local(Vector3(- rand_range(0, velocity),0 ,0))
translate_object_local(Vector3(- rand_range(0, velocity) - velocity*3 ,0 ,0))
first = false
else:
translate_object_local(Vector3(-velocity,0,0))

View File

@ -15,7 +15,7 @@
"nodes" : [
{
"mesh" : 0,
"name" : "Sphere"
"name" : "Tracer"
}
],
"materials" : [
@ -23,8 +23,8 @@
"doubleSided" : true,
"emissiveFactor" : [
1,
0.6177892684936523,
0.07687932252883911
1,
1
],
"name" : "BulletTracerMaterial",
"pbrMetallicRoughness" : {
@ -47,9 +47,11 @@
"attributes" : {
"POSITION" : 0,
"NORMAL" : 1,
"TEXCOORD_0" : 2
"TANGENT" : 2,
"TEXCOORD_0" : 3,
"COLOR_0" : 4
},
"indices" : 3,
"indices" : 5,
"material" : 0
}
]
@ -59,7 +61,7 @@
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 26,
"count" : 30,
"max" : [
0.08660250902175903,
0.07499998807907104,
@ -68,55 +70,77 @@
"min" : [
-0.08660256862640381,
-0.07499998807907104,
-10.209983825683594
-12.261317253112793
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 26,
"count" : 30,
"type" : "VEC3"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 26,
"type" : "VEC2"
"count" : 30,
"type" : "VEC4"
},
{
"bufferView" : 3,
"componentType" : 5126,
"count" : 30,
"type" : "VEC2"
},
{
"bufferView" : 4,
"componentType" : 5126,
"count" : 30,
"type" : "VEC4"
},
{
"bufferView" : 5,
"componentType" : 5123,
"count" : 72,
"count" : 90,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 312,
"byteLength" : 360,
"byteOffset" : 0
},
{
"buffer" : 0,
"byteLength" : 312,
"byteOffset" : 312
"byteLength" : 360,
"byteOffset" : 360
},
{
"buffer" : 0,
"byteLength" : 208,
"byteOffset" : 624
"byteLength" : 480,
"byteOffset" : 720
},
{
"buffer" : 0,
"byteLength" : 144,
"byteOffset" : 832
"byteLength" : 240,
"byteOffset" : 1200
},
{
"buffer" : 0,
"byteLength" : 480,
"byteOffset" : 1440
},
{
"buffer" : 0,
"byteLength" : 180,
"byteOffset" : 1920
}
],
"buffers" : [
{
"byteLength" : 976,
"uri" : "data:application/octet-stream;base64,0MxMstDMTKUYXCPBqFyxPcjMzDGQp/m9sFwxPZiZmb2Qp/m9mFGMPYBbmbLAJzA8oFEMPRAKc73AJzA8AAAAANDMTKXQzMw90MxMstDMTKUYXCPBsFwxvZiZmb2Qp/m9mFEMvRAKc73IJzA8AAAAANDMTKXQzMw90MxMstDMTKUYXCPBsFyxvcjMzLGQp/m9mFGMvVCwELLQJzA8AAAAANDMTKXQzMw90MxMstDMTKUYXCPBsFwxvZiZmT2Qp/m9mFEMvRAKcz3YJzA8AAAAANDMTKXQzMw90MxMstDMTKUYXCPBsFwxvZiZmT2Qp/m9sFwxPZiZmT2Qp/m9mFEMvRAKcz3YJzA8oFEMPRAKcz3IJzA8AAAAANDMTKXQzMw90MxMstDMTKUYXCPBAAAAANDMTKXQzMw9AAAAAAAAAAAAAIC//39/PwAAAAD8AX49/33/PrtFXb/8AX493vluPwAAAABvjbc+3vnuPp71Tr9vjbc+AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC//33/vrtFXb/8AX493vnuvp71Tr9vjbc+AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC//39/vwAAAAD8AX493vluvwAAAABvjbc+AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC//33/vrtFXT/8AX493vnuvp71Tj9vjbc+AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC//33/vrtFXT/8AX49/33/PrtFXT/8AX493vnuvp71Tj9vjbc+3vnuPp71Tj9vjbc+AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIA/VVUVPwAAgD+rqio/q6oqPwAAAD+rqio/qqoqP6yqqj4AAAA/rKqqPlVVFT8AAAAAVVXVPgAAgD+rqqo+q6oqP6qqqj6sqqo+VVXVPgAAAAAAAIA+AACAP6yqKj6rqio/qqoqPqyqqj4AAIA+AAAAAKyqqj0AAIA/AAAAAKuqKj8AAAAArKqqPqyqqj0AAAAAq6pqPwAAgD///38/q6oqP1VVVT+rqio///9/P6yqqj5VVVU/rKqqPquqaj8AAAAAAQBAPwAAgD///z8/AAAAAAAAAQACAAEAAwAEAAEABAACAAMABQAEAAYAAgAHAAIABAAIAAIACAAHAAQACQAIAAoABwALAAcACAAMAAcADAALAAgADQAMAA4ACwAPAAsADAAQAAsAEAAPAAwAEQAQABIAEwAUABMAFQAWABMAFgAUABUAFwAWABgAFAABABQAFgADABQAAwABABYAGQADAA=="
"byteLength" : 2100,
"uri" : "data:application/octet-stream;base64,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"
}
]
}

View File

@ -1,7 +1,8 @@
[gd_scene load_steps=4 format=2]
[gd_scene load_steps=5 format=2]
[ext_resource path="res://Assets/Effects/BulletTracer.gd" type="Script" id=1]
[ext_resource path="res://Assets/Effects/BulletTracer.gltf" type="PackedScene" id=2]
[ext_resource path="res://Assets/Effects/BulletTracerMaterial.tres" type="Material" id=3]
[sub_resource type="RayShape" id=1]
length = 3.0
@ -9,17 +10,21 @@ length = 3.0
[node name="BulletTracer" type="Spatial"]
script = ExtResource( 1 )
[node name="BulletTracer" parent="." instance=ExtResource( 2 )]
transform = Transform( -4.88762e-08, 0, -0.3, 0, 0.3, 0, 0.3, 0, -4.88762e-08, 0, 0, 0 )
[node name="Raycast" type="Area" parent="BulletTracer"]
transform = Transform( 3.32303, 0, 0, 0, 3.32303, 0, 0, 0, 3.32303, 0.00196616, -7.94729e-07, -9.38667 )
[node name="Raycast" type="Area" parent="."]
transform = Transform( -1.62417e-07, 0, -0.996909, 0, 0.996909, 0, 0.996909, 0, -1.62417e-07, 2.816, -2.38419e-07, 0.000590307 )
input_ray_pickable = false
monitorable = false
[node name="CollisionShape" type="CollisionShape" parent="BulletTracer/Raycast"]
[node name="CollisionShape" type="CollisionShape" parent="Raycast"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00372178, -6.92157e-07, 2.79426 )
shape = SubResource( 1 )
[connection signal="body_entered" from="BulletTracer/Raycast" to="." method="_on_Raycast_body_entered"]
[node name="BulletTracer" parent="." instance=ExtResource( 2 )]
transform = Transform( -4.07302e-08, 0, -1, 0, 0.25, 0, 0.25, 0, -1.62921e-07, -0.00849247, 0.0281134, 0.0116889 )
[node name="Tracer" parent="BulletTracer" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0101204, 0, -0.0227299 )
material/0 = ExtResource( 3 )
[connection signal="body_entered" from="Raycast" to="." method="_on_Raycast_body_entered"]
[editable path="BulletTracer"]

View File

@ -1,19 +1,48 @@
[gd_resource type="ShaderMaterial" load_steps=6 format=2]
[gd_resource type="ShaderMaterial" load_steps=15 format=2]
[sub_resource type="VisualShaderNodeFresnel" id=1]
default_input_values = [ 2, true, 3, 3.0 ]
[sub_resource type="VisualShaderNodeColorConstant" id=2]
output_port_for_preview = 0
constant = Color( 1, 0.937255, 0.215686, 1 )
[sub_resource type="VisualShaderNodeVectorOp" id=3]
[sub_resource type="VisualShaderNodeScalarOp" id=1]
default_input_values = [ 0, 0.0, 1, 1.3 ]
operator = 2
[sub_resource type="VisualShaderNodeScalarConstant" id=4]
[sub_resource type="VisualShaderNodeScalarOp" id=2]
[sub_resource type="VisualShaderNodeScalarOp" id=3]
default_input_values = [ 0, 0.0, 1, 0.5 ]
operator = 2
[sub_resource type="VisualShaderNodeVectorOp" id=13]
operator = 2
[sub_resource type="VisualShaderNodeScalarConstant" id=14]
constant = 8.0
[sub_resource type="VisualShaderNodeVectorScalarMix" id=15]
[sub_resource type="VisualShaderNodeFresnel" id=4]
default_input_values = [ 2, true, 3, 0.5 ]
[sub_resource type="VisualShaderNodeColorConstant" id=5]
output_port_for_preview = 0
constant = Color( 1, 0.859069, 0.215686, 1 )
[sub_resource type="VisualShaderNodeVectorOp" id=6]
operator = 2
[sub_resource type="VisualShaderNodeScalarConstant" id=7]
constant = 2.0
[sub_resource type="VisualShader" id=5]
[sub_resource type="VisualShaderNodeInput" id=8]
output_port_for_preview = 0
input_name = "color"
[sub_resource type="VisualShaderNodeColorConstant" id=9]
output_port_for_preview = 0
constant = Color( 0.650391, 0.192161, 0.0203247, 1 )
[sub_resource type="VisualShaderNodeScalarFunc" id=11]
function = 18
[sub_resource type="VisualShader" id=12]
code = "shader_type spatial;
render_mode specular_disabled, unshaded;
@ -26,24 +55,54 @@ void vertex() {
}
void fragment() {
// Color:7
vec3 n_out7p0 = vec3(0.650391, 0.192161, 0.020325);
float n_out7p1 = 1.000000;
// Color:3
vec3 n_out3p0 = vec3(1.000000, 0.937255, 0.215686);
vec3 n_out3p0 = vec3(1.000000, 0.859069, 0.215686);
float n_out3p1 = 1.000000;
// Scalar:14
float n_out14p0 = 8.000000;
// VectorOp:13
vec3 n_out13p0 = n_out3p0 * vec3(n_out14p0);
// Input:6
vec3 n_out6p0 = COLOR.rgb;
// ScalarOp:10
float n_in10p1 = 1.30000;
float n_out10p0 = dot(n_out6p0, vec3(0.333333, 0.333333, 0.333333)) * n_in10p1;
// ScalarFunc:9
float n_out9p0 = min(max(n_out10p0, 0.0), 1.0);
// VectorScalarMix:15
vec3 n_out15p0 = mix(n_out7p0, n_out13p0, n_out9p0);
// Scalar:5
float n_out5p0 = 2.000000;
// VectorOp:4
vec3 n_out4p0 = n_out3p0 * vec3(n_out5p0);
vec3 n_out4p0 = n_out15p0 * vec3(n_out5p0);
// Fresnel:2
bool n_in2p2 = true;
float n_in2p3 = 3.00000;
float n_in2p3 = 0.50000;
float n_out2p0 = n_in2p2 ? (pow(clamp(dot(NORMAL, VIEW), 0.0, 1.0), n_in2p3)) : (pow(1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0), n_in2p3));
// ScalarOp:12
float n_in12p1 = 0.50000;
float n_out12p0 = n_out2p0 * n_in12p1;
// ScalarOp:11
float n_out11p0 = n_out12p0 + dot(n_out6p0, vec3(0.333333, 0.333333, 0.333333));
// Output:0
ALBEDO = n_out4p0;
ALPHA = n_out2p0;
ALPHA = n_out11p0;
}
@ -52,19 +111,37 @@ void light() {
}
"
graph_offset = Vector2( -509, -65.75 )
graph_offset = Vector2( -221, -337.75 )
modes/specular = 4
flags/unshaded = true
nodes/fragment/0/position = Vector2( 760, 120 )
nodes/fragment/2/node = SubResource( 1 )
nodes/fragment/2/position = Vector2( -380, 80 )
nodes/fragment/3/node = SubResource( 2 )
nodes/fragment/3/position = Vector2( -120, 260 )
nodes/fragment/4/node = SubResource( 3 )
nodes/fragment/4/position = Vector2( 280, 60 )
nodes/fragment/5/node = SubResource( 4 )
nodes/fragment/5/position = Vector2( 200, 380 )
nodes/fragment/connections = PoolIntArray( 3, 0, 4, 0, 4, 0, 0, 0, 5, 0, 4, 1, 2, 0, 0, 1 )
nodes/fragment/0/position = Vector2( 560, -300 )
nodes/fragment/2/node = SubResource( 4 )
nodes/fragment/2/position = Vector2( -640, -540 )
nodes/fragment/3/node = SubResource( 5 )
nodes/fragment/3/position = Vector2( -680, 260 )
nodes/fragment/4/node = SubResource( 6 )
nodes/fragment/4/position = Vector2( 260, 60 )
nodes/fragment/5/node = SubResource( 7 )
nodes/fragment/5/position = Vector2( 40, 260 )
nodes/fragment/6/node = SubResource( 8 )
nodes/fragment/6/position = Vector2( -640, -220 )
nodes/fragment/7/node = SubResource( 9 )
nodes/fragment/7/position = Vector2( -400, 40 )
nodes/fragment/9/node = SubResource( 11 )
nodes/fragment/9/position = Vector2( -80, -180 )
nodes/fragment/10/node = SubResource( 1 )
nodes/fragment/10/position = Vector2( -400, -160 )
nodes/fragment/11/node = SubResource( 2 )
nodes/fragment/11/position = Vector2( 100, -340 )
nodes/fragment/12/node = SubResource( 3 )
nodes/fragment/12/position = Vector2( -260, -520 )
nodes/fragment/13/node = SubResource( 13 )
nodes/fragment/13/position = Vector2( -380, 300 )
nodes/fragment/14/node = SubResource( 14 )
nodes/fragment/14/position = Vector2( -520, 460 )
nodes/fragment/15/node = SubResource( 15 )
nodes/fragment/15/position = Vector2( 40, 60 )
nodes/fragment/connections = PoolIntArray( 5, 0, 4, 1, 6, 0, 10, 0, 10, 0, 9, 0, 6, 0, 11, 1, 2, 0, 12, 0, 12, 0, 11, 0, 11, 0, 0, 1, 4, 0, 0, 0, 3, 0, 13, 0, 14, 0, 13, 1, 7, 0, 15, 0, 13, 0, 15, 1, 9, 0, 15, 2, 15, 0, 4, 0 )
[resource]
shader = SubResource( 5 )
shader = SubResource( 12 )

File diff suppressed because one or more lines are too long

View File

@ -27,7 +27,7 @@ meshes/lightmap_texel_size=0.1
skins/use_named_skins=true
external_files/store_in_subdir=false
animation/import=true
animation/fps=15
animation/fps=30.0
animation/filter_script=""
animation/storage=false
animation/keep_custom_tracks=false

View File

@ -48,13 +48,8 @@ size = Vector2( 0.3, 0.3 )
[node name="Weapon" type="Spatial"]
script = ExtResource( 2 )
[node name="Handgun" parent="." instance=ExtResource( 1 )]
[node name="Muzzle" parent="Handgun" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.3684, 0, 0 )
[node name="MuzzleFlash" type="Particles" parent="Handgun/Muzzle" index="0"]
transform = Transform( -4.37113e-08, 0, 0.999999, 0, 0.999999, 0, -1, 0, -4.37114e-08, 0.0630998, 0.124057, 0 )
[node name="MuzzleFlash" type="Particles" parent="."]
transform = Transform( -4.37113e-08, 0, 0.999999, 0, 0.999999, 0, -1, 0, -4.37114e-08, -0.3053, 0.124057, 0 )
cast_shadow = 0
emitting = false
amount = 16
@ -65,6 +60,11 @@ visibility_aabb = AABB( -0.176241, -0.185755, -0.556571, 0.352482, 0.37151, 0.65
process_material = SubResource( 5 )
draw_pass_1 = SubResource( 7 )
[node name="Handgun" parent="." instance=ExtResource( 1 )]
[node name="Muzzle" parent="Handgun" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.331868, 0.125291, 0 )
[node name="Ejector" parent="Handgun" index="1"]
transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, -0.0373496, 0.126382, -0.00737098 )

View File

@ -5,6 +5,12 @@ export(int) var Damage = 100
onready var camera = get_parent().get_parent()
onready var player = get_parent().get_parent().get_parent()
onready var ejector = find_node("Ejector")
onready var sound_shoot = $SoundShoot
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
@ -15,7 +21,7 @@ var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
sound_shoot.global_transform = camera.get_global_transform()
# Called every frame. 'delta' is the elapsed time since the previous frame.
@ -25,36 +31,36 @@ func _ready():
remote func shoot():
#print ("Camera location: ", camera.global_transform.origin)
var casing_instance = casing.instance()
casing_instance.global_transform = find_node("Ejector").global_transform
casing_instance.rotate_y(deg2rad(90))
casing_instance.angular_velocity = Vector3(rand_range(0, 40), 0, 0)
casing_instance.linear_velocity = Vector3(rand_range(0, 1), 5, 0)
get_tree().root.call_deferred("add_child", casing_instance)
var tracer_instance = tracer.instance()
tracer_instance.hide()
tracer_instance.global_transform = find_node("Muzzle").global_transform
get_tree().root.call_deferred("add_child", tracer_instance)
#tracer_instance.rotate_object_local(Vector3.AXIS_Y, PI/4)
#tracer_instance.angular_velocity = Vector3(rand_range(0, 40), 0, 0)
#tracer_instance.linear_velocity = Vector3(rand_range(0, 1), 5, 0)
# TODO - fix casing rotation
# TODO - apply initial linear and angular velocity
tracer_instance.call_deferred("show")
$Handgun/AnimationPlayer.stop()
$Handgun/AnimationPlayer.play("Shoot", -1, 2)
$SoundShoot.play()
$Handgun/Muzzle/MuzzleFlash.emitting = true
yield(get_tree().create_timer(0.1),"timeout")
$Handgun/Muzzle/MuzzleFlash.emitting = false
$MuzzleFlash.emitting = true
yield(get_tree().create_timer(0.05),"timeout")
var casing_instance = casing.instance()
casing_instance.global_transform = ejector.global_transform
casing_instance.rotate_object_local(Vector3.FORWARD, deg2rad(90))
casing_instance.angular_velocity = - ejector.global_transform.basis[2] * rand_range(23, 37)
casing_instance.linear_velocity = ejector.global_transform.basis[0] * rand_range(3.2, 4.5) - ejector.global_transform.basis[2] * rand_range(2.6, 3.7)
get_tree().root.call_deferred("add_child", casing_instance)
yield(get_tree().create_timer(0.05),"timeout")
$MuzzleFlash.emitting = false