Skip to content

Commit 9eb22f9

Browse files
committed
Try implement rendering for AttenuatedCircle, try fixing terrain, but failed.
1 parent 22ae6f5 commit 9eb22f9

File tree

9 files changed

+256
-59
lines changed

9 files changed

+256
-59
lines changed

AttenuatedCircle.shader

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
shader_type spatial;
2+
// by Sairam
3+
uniform float radius = 3.0;
4+
uniform float attenuated_radius = 0.01;
5+
uniform float attenuation_strength = 1.0;
6+
uniform float attenuated_size_multiplier = 1.0;
7+
uniform float max_power = 1;
8+
uniform float min_power = 0;
9+
10+
uniform vec4 color : hint_color = vec4(0.0, 1.0, 1.0, 0.5);
11+
12+
varying vec3 vertex_1;
13+
14+
float get_power_at_position(vec3 point) {
15+
vec3 origin = vec3(0.0, 0.0, 0.0);
16+
float dist = pow(distance(origin, point), 2.0);
17+
18+
if (dist >= radius*radius) {
19+
return min_power;
20+
}
21+
if (dist <= attenuated_radius*attenuated_radius) {
22+
return max_power;
23+
}
24+
25+
float ratio = 1.0 - ((dist - attenuated_radius*attenuated_radius) / (radius*radius - attenuated_radius*attenuated_radius));
26+
return mix(min_power, max_power, ratio) * attenuation_strength*attenuated_size_multiplier;
27+
}
28+
29+
void vertex() {
30+
vertex_1 = VERTEX;
31+
}
32+
33+
void fragment() {
34+
ALBEDO = color.xyz;
35+
ALPHA = get_power_at_position(vertex_1) * color.a;
36+
}

AttenuatedCircle.tres

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[gd_resource type="ShaderMaterial" load_steps=2 format=2]
2+
3+
[ext_resource path="res://AttenuatedCircle.shader" type="Shader" id=1]
4+
5+
[resource]
6+
shader = ExtResource( 1 )
7+
shader_param/radius = 3.0
8+
shader_param/attenuated_radius = 0.01
9+
shader_param/attenuation_strength = 1.164
10+
shader_param/attenuated_size_multiplier = 1.778
11+
shader_param/max_power = 1.0
12+
shader_param/min_power = 0.0
13+
shader_param/color = Color( 0, 1, 1, 0.498039 )

CircleAttenuation.gd

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ class_name AttenuatedCircle
33

44
export var radius: float = 32 setget set_radius
55
export var attentuation_radius: float = 5 setget set_attentuation_radius
6-
export var attentuation_strength: float = 10 setget set_attentuation_strength
7-
export var attentuation_size_multiplier: float = 10 setget set_attentuation_size_multiplier
8-
export var max_power: float = 5
9-
export var min_power: float = 2
6+
export(float, 0, 1, 0.01) var attentuation_strength: float = 1 setget set_attentuation_strength
7+
export(float, 0, 20, 0.1) var attentuation_size_multiplier: float = 10 setget set_attentuation_size_multiplier
8+
export var max_power: float = 1
9+
export var min_power: float = 0
1010

1111
onready var attentuation_size: float = _update_attentuation_size()
1212
onready var radius_squared = _update_radius_squared()
@@ -35,7 +35,7 @@ func _update_attentuation_radius_squared():
3535
return attentuation_radius * attentuation_radius
3636

3737
func _update_attentuation_size():
38-
return attentuation_size_multiplier * attentuation_strength
38+
return attentuation_strength * attentuation_size_multiplier
3939

4040
func get_power_at_position(position: Vector3, sharp = false) -> float:
4141
var _translation = global_transform.origin
@@ -56,4 +56,4 @@ func get_power_at_position(position: Vector3, sharp = false) -> float:
5656
/ (radius - attentuation_radius)
5757
)
5858
# print(ratio)
59-
return lerp(min_power, max_power, ratio)
59+
return lerp(min_power, max_power, ratio) * attentuation_size

Game.tscn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.133306, 0 )
6767
script = ExtResource( 7 )
6868
radius = 3.0
6969
attentuation_radius = 0.01
70-
min_power = 0.0
70+
attentuation_size_multiplier = 0.5
7171

7272
[node name="Raise" type="AudioStreamPlayer" parent="TerrainTool"]
7373
stream = ExtResource( 8 )

Materials/Drawing.material

615 Bytes
Binary file not shown.

TerrainTool.gd

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ extends MeshInstance
22

33
var position
44
var strength = 1
5-
var radius setget set_radius_value
5+
var radius = 3 setget set_radius_value
66

77
var mouse_pointer: Vector2 = Vector2()
8-
export(int) var strenth_factor = 1 setget set_strength_value
8+
export(int) var strength_factor = 1 setget set_strength_value
99

1010
onready var attenuated_circle = $AttenuatedCircle
1111

@@ -24,14 +24,21 @@ onready var sound_dict = {
2424
func _unhandled_input(event):
2525
if event is InputEventMouseMotion:
2626
mouse_pointer = event.position
27-
if Input.is_action_pressed("left_button"):
27+
if Input.is_action_pressed("left_button") and (!event.control and !event.shift):
2828
clicked = true
29-
strength = Input.get_action_strength("left_button") * strenth_factor * 2
30-
attenuated_circle.max_power = strength
29+
strength = Input.get_action_strength("left_button") * strength_factor * 2
30+
attenuated_circle.attentuation_strength = strength
3131
position = translation
3232
if mesh is CylinderMesh:
3333
radius = mesh.bottom_radius
3434
attenuated_circle.radius = radius
35+
elif event.control and Input.is_action_pressed("left_button"):
36+
set_strength_value(strength_factor+event.relative.x*0.02)
37+
elif event.shift and Input.is_action_pressed("left_button"):
38+
print("shift")
39+
set_radius_value(radius+event.relative.x*0.02)
40+
41+
3542
if Input.is_action_just_pressed("left_button"):
3643
position = translation
3744
for audio in sound_dict.values():
@@ -44,20 +51,20 @@ func _unhandled_input(event):
4451
clicked = false
4552

4653
func _physics_process(_delta):
47-
var camera = get_viewport().get_camera()
48-
var from = camera.project_ray_origin(mouse_pointer)
49-
var to = from + camera.project_ray_normal(mouse_pointer) * 1000
50-
var ray = get_world().direct_space_state.intersect_ray(from, to)
51-
if not ray.empty():
52-
show()
53-
translation = ray.get("position", translation)
54-
else:
55-
hide()
56-
54+
if !Input.is_key_pressed(KEY_CONTROL) and !Input.is_key_pressed(KEY_SHIFT):
55+
var camera = get_viewport().get_camera()
56+
var from = camera.project_ray_origin(mouse_pointer)
57+
var to = from + camera.project_ray_normal(mouse_pointer) * 1000
58+
var ray = get_world().direct_space_state.intersect_ray(from, to)
59+
if not ray.empty():
60+
show()
61+
translation = ray.get("position", translation)
62+
else:
63+
hide()
5764

5865
if clicked and Input.is_action_pressed("left_button"):
59-
strength = Input.get_action_strength("left_button") * strenth_factor * 2
60-
attenuated_circle.max_power = strength
66+
strength = Input.get_action_strength("left_button") * strength_factor * 2
67+
attenuated_circle.attentuation_strength = strength
6168
position = translation
6269
if mesh is CylinderMesh:
6370
radius = mesh.bottom_radius
@@ -70,7 +77,7 @@ func set_state(state):
7077
current_state = state
7178

7279
func set_strength_value(value):
73-
strenth_factor = value
80+
strength_factor = value
7481

7582
func set_radius_value(value):
7683
if mesh is CylinderMesh:
@@ -90,3 +97,6 @@ func _on_PanelContainer_strength_changed(_strength):
9097

9198
func _on_PanelContainer_radius_changed(_radius):
9299
set_radius_value(_radius)
100+
101+
func _on_PanelContainer_rotation_changed(rotation):
102+
pass # Replace with function body.

World.tres

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[gd_resource type="SpatialMaterial" format=2]
2+
3+
[resource]
4+
flags_transparent = true
5+
albedo_color = Color( 0, 1, 1, 0.501961 )

World.tscn

Lines changed: 133 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_scene load_steps=14 format=2]
1+
[gd_scene load_steps=16 format=2]
22

33
[ext_resource path="res://TerrainChunked.gd" type="Script" id=1]
44
[ext_resource path="res://Scenes/Camera.tscn" type="PackedScene" id=2]
@@ -9,22 +9,64 @@
99
[ext_resource path="res://TerrainTool.gd" type="Script" id=7]
1010
[ext_resource path="res://addons/sairam.quadtree/AABBUtils.gd" type="Script" id=8]
1111
[ext_resource path="res://Materials/Terrain.material" type="Material" id=9]
12+
[ext_resource path="res://GUI.tscn" type="PackedScene" id=10]
13+
[ext_resource path="res://Materials/Drawing.material" type="Material" id=11]
14+
15+
[sub_resource type="Shader" id=4]
16+
code = "shader_type spatial;
17+
// by Sairam
18+
uniform float radius = 3.0;
19+
uniform float attenuated_radius = 0.01;
20+
uniform float attenuation_strength = 1.0;
21+
uniform float attenuated_size_multiplier = 1.0;
22+
uniform float max_power = 1;
23+
uniform float min_power = 0;
24+
25+
uniform vec4 color : hint_color = vec4(0.0, 1.0, 1.0, 0.5);
26+
27+
varying vec3 vertex_1;
28+
29+
float get_power_at_position(vec3 point) {
30+
vec3 origin = vec3(0.0, 0.0, 0.0);
31+
float dist = pow(distance(origin, point), 2.0);
32+
33+
if (dist >= radius*radius) {
34+
return min_power;
35+
}
36+
if (dist <= attenuated_radius*attenuated_radius) {
37+
return max_power;
38+
}
39+
40+
float ratio = 1.0 - ((dist - attenuated_radius*attenuated_radius) / (radius*radius - attenuated_radius*attenuated_radius));
41+
return mix(min_power, max_power, ratio) * attenuation_strength*attenuated_size_multiplier;
42+
}
1243

13-
[sub_resource type="SpatialMaterial" id=2]
14-
albedo_color = Color( 0, 1, 1, 1 )
15-
16-
[sub_resource type="CylinderMesh" id=3]
17-
material = SubResource( 2 )
18-
top_radius = 3.0
19-
bottom_radius = 3.0
20-
height = 0.5
21-
22-
[sub_resource type="SpatialMaterial" id=4]
23-
flags_unshaded = true
24-
params_line_width = 24.8
25-
albedo_color = Color( 1, 0, 0, 1 )
44+
void vertex() {
45+
vertex_1 = VERTEX;
46+
}
2647

27-
[sub_resource type="SpatialMaterial" id=5]
48+
void fragment() {
49+
ALBEDO = color.xyz;
50+
ALPHA = get_power_at_position(vertex_1) * color.a;
51+
}"
52+
53+
[sub_resource type="ShaderMaterial" id=5]
54+
shader = SubResource( 4 )
55+
shader_param/radius = 3.0
56+
shader_param/attenuated_radius = 0.01
57+
shader_param/attenuation_strength = 1.164
58+
shader_param/attenuated_size_multiplier = 1.778
59+
shader_param/max_power = 1.0
60+
shader_param/min_power = 0.0
61+
shader_param/color = Color( 0, 1, 1, 0.498039 )
62+
63+
[sub_resource type="CylinderMesh" id=6]
64+
material = SubResource( 5 )
65+
top_radius = 4.0
66+
bottom_radius = 4.0
67+
height = 0.01
68+
69+
[sub_resource type="SpatialMaterial" id=7]
2870
flags_unshaded = true
2971
params_line_width = 24.8
3072
albedo_color = Color( 0, 0, 0, 1 )
@@ -36,9 +78,10 @@ script = ExtResource( 8 )
3678

3779
[node name="Terrain" type="Spatial" parent="."]
3880
script = ExtResource( 1 )
81+
chunk_size = 8
3982
terrain_tool_node = NodePath("../Tools/TerrainTool")
4083
terrain_material = ExtResource( 9 )
41-
size = 64
84+
size = 128
4285

4386
[node name="Camera" parent="." instance=ExtResource( 2 )]
4487
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 5, 0 )
@@ -49,14 +92,16 @@ zooming/max_distance = 300.0
4992
[node name="Tools" type="Spatial" parent="."]
5093

5194
[node name="TerrainTool" type="MeshInstance" parent="Tools"]
52-
mesh = SubResource( 3 )
95+
mesh = SubResource( 6 )
5396
material/0 = null
5497
script = ExtResource( 7 )
5598

5699
[node name="AttenuatedCircle" type="Spatial" parent="Tools/TerrainTool"]
57100
script = ExtResource( 6 )
58101
radius = 3.0
59-
attentuation_radius = 1.0
102+
attentuation_radius = 0.01
103+
attentuation_size_multiplier = 0.5
104+
min_power = 0.01
60105

61106
[node name="Raise" type="AudioStreamPlayer" parent="Tools/TerrainTool"]
62107
stream = ExtResource( 4 )
@@ -69,16 +114,77 @@ volume_db = -3.098
69114
[node name="ImmediateGeometry" type="ImmediateGeometry" parent="Tools"]
70115
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 )
71116
visible = false
72-
material_override = SubResource( 4 )
117+
material_override = ExtResource( 11 )
73118

74119
[node name="ImmediateGeometry2" type="ImmediateGeometry" parent="Tools"]
75120
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 )
76121
visible = false
77-
material_override = SubResource( 5 )
122+
material_override = SubResource( 7 )
123+
124+
[node name="Control2" parent="." instance=ExtResource( 10 )]
125+
mouse_filter = 2
126+
127+
[node name="PanelContainer" parent="Control2" index="0"]
128+
margin_left = -509.0
129+
margin_top = -208.0
130+
mouse_filter = 1
131+
132+
[node name="VBoxContainer" parent="Control2/PanelContainer" index="0"]
133+
margin_right = 447.0
134+
margin_bottom = 141.0
135+
136+
[node name="Radius" parent="Control2/PanelContainer/VBoxContainer" index="0"]
137+
margin_right = 440.0
138+
139+
[node name="Radius" parent="Control2/PanelContainer/VBoxContainer/Radius" index="1"]
140+
margin_right = 412.0
141+
142+
[node name="Label2" parent="Control2/PanelContainer/VBoxContainer/Radius" index="2"]
143+
margin_left = 416.0
144+
margin_right = 440.0
145+
146+
[node name="Strength" parent="Control2/PanelContainer/VBoxContainer" index="1"]
147+
margin_right = 440.0
148+
149+
[node name="Strength" parent="Control2/PanelContainer/VBoxContainer/Strength" index="1"]
150+
margin_right = 412.0
151+
152+
[node name="Label2" parent="Control2/PanelContainer/VBoxContainer/Strength" index="2"]
153+
margin_left = 416.0
154+
margin_right = 440.0
155+
156+
[node name="RotationDegrees" parent="Control2/PanelContainer/VBoxContainer" index="2"]
157+
margin_right = 440.0
158+
159+
[node name="RotationDegrees" parent="Control2/PanelContainer/VBoxContainer/RotationDegrees" index="1"]
160+
margin_right = 412.0
161+
162+
[node name="Label2" parent="Control2/PanelContainer/VBoxContainer/RotationDegrees" index="2"]
163+
margin_left = 416.0
164+
margin_right = 440.0
165+
166+
[node name="HBoxContainer4" parent="Control2/PanelContainer/VBoxContainer" index="3"]
167+
margin_right = 440.0
168+
margin_bottom = 134.0
169+
170+
[node name="Button" parent="Control2/PanelContainer/VBoxContainer/HBoxContainer4" index="0"]
171+
margin_right = 131.0
172+
margin_bottom = 56.0
173+
174+
[node name="Button2" parent="Control2/PanelContainer/VBoxContainer/HBoxContainer4" index="1"]
175+
margin_left = 154.0
176+
margin_right = 285.0
177+
margin_bottom = 56.0
178+
179+
[node name="Button3" parent="Control2/PanelContainer/VBoxContainer/HBoxContainer4" index="2"]
180+
margin_left = 308.0
181+
margin_right = 440.0
182+
margin_bottom = 56.0
78183

79184
[node name="Control" type="Control" parent="."]
80185
margin_right = 40.0
81186
margin_bottom = 40.0
187+
mouse_filter = 1
82188
script = ExtResource( 3 )
83189
__meta__ = {
84190
"_edit_use_anchors_": false
@@ -93,3 +199,10 @@ __meta__ = {
93199

94200
[node name="DirectionalLight" type="DirectionalLight" parent="."]
95201
transform = Transform( 1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0, 0 )
202+
203+
[connection signal="radius_changed" from="Control2/PanelContainer" to="Tools/TerrainTool" method="_on_PanelContainer_radius_changed"]
204+
[connection signal="rotation_changed" from="Control2/PanelContainer" to="Tools/TerrainTool" method="_on_PanelContainer_rotation_changed"]
205+
[connection signal="state_changed" from="Control2/PanelContainer" to="Tools/TerrainTool" method="_on_PanelContainer_state_changed"]
206+
[connection signal="strength_changed" from="Control2/PanelContainer" to="Tools/TerrainTool" method="_on_PanelContainer_strength_changed"]
207+
208+
[editable path="Control2"]

0 commit comments

Comments
 (0)