finish heat map shader
This commit is contained in:
parent
c0dccc8401
commit
586ea20d1a
|
@ -4,8 +4,10 @@
|
||||||
|
|
||||||
[sub_resource type="Gradient" id="Gradient_2jwis"]
|
[sub_resource type="Gradient" id="Gradient_2jwis"]
|
||||||
interpolation_color_space = 2
|
interpolation_color_space = 2
|
||||||
offsets = PackedFloat32Array(0.00280112, 1)
|
offsets = PackedFloat32Array(0.00840336, 0.1, 0.4375, 0.5625, 1)
|
||||||
colors = PackedColorArray(0, 0.558935, 0.886772, 1, 0.999396, 0, 0.058647, 1)
|
colors = PackedColorArray(0.533333, 0, 1, 1, 0, 0.45, 1, 1, 0, 0.95, 1, 1, 0.983333, 1, 0, 1, 0.999396, 0, 0.058647, 1)
|
||||||
|
metadata/_snap_enabled = true
|
||||||
|
metadata/_snap_count = 16
|
||||||
|
|
||||||
[sub_resource type="GradientTexture1D" id="GradientTexture1D_rrsal"]
|
[sub_resource type="GradientTexture1D" id="GradientTexture1D_rrsal"]
|
||||||
gradient = SubResource("Gradient_2jwis")
|
gradient = SubResource("Gradient_2jwis")
|
||||||
|
@ -15,5 +17,5 @@ render_priority = 0
|
||||||
shader = ExtResource("1_sbr3e")
|
shader = ExtResource("1_sbr3e")
|
||||||
shader_parameter/data = PackedFloat32Array()
|
shader_parameter/data = PackedFloat32Array()
|
||||||
shader_parameter/data_size = 0
|
shader_parameter/data_size = 0
|
||||||
shader_parameter/min_max_data = null
|
shader_parameter/alpha = 0.3
|
||||||
shader_parameter/color_gradient = SubResource("GradientTexture1D_rrsal")
|
shader_parameter/color_gradient = SubResource("GradientTexture1D_rrsal")
|
||||||
|
|
|
@ -3,32 +3,55 @@ render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_lambert, specul
|
||||||
|
|
||||||
uniform vec4 data[100];
|
uniform vec4 data[100];
|
||||||
uniform int data_size: hint_range(0, 100, 1);
|
uniform int data_size: hint_range(0, 100, 1);
|
||||||
uniform vec2 min_max_data;
|
uniform float alpha: hint_range(0.0, 1.0, 0.1) = 0.3;
|
||||||
uniform sampler2D color_gradient;
|
uniform sampler2D color_gradient;
|
||||||
|
|
||||||
varying vec3 color;
|
varying vec3 color;
|
||||||
|
|
||||||
|
float simple_weight(int index, vec3 world_pos, float p) {
|
||||||
|
return 1.0 / pow(distance(data[index].xyz, world_pos), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sphere_weight(int index, vec3 world_pos, float r) {
|
||||||
|
float dist = distance(data[index].xyz, world_pos);
|
||||||
|
return pow(max(0, r - dist) / (r * dist), 2);
|
||||||
|
}
|
||||||
|
|
||||||
void vertex() {
|
void vertex() {
|
||||||
// Calculate Global Coordinates
|
// Calculate Global Coordinates
|
||||||
vec3 world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
vec3 world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||||
|
|
||||||
color = vec3(1.0, 1.0, 1.0);
|
color = vec3(1.0, 1.0, 1.0);
|
||||||
vec2 distances[100];
|
float distances[100];
|
||||||
float dist_sum = 0.0;
|
float dist_sum = 0.0;
|
||||||
|
float data_sum = 0.0;
|
||||||
|
|
||||||
|
float closest_dist = -1.0;
|
||||||
|
int closest_index = 0;
|
||||||
|
|
||||||
if(data_size > 0) {
|
if(data_size > 0) {
|
||||||
for(int i = 0; i < data_size; i++) {
|
closest_dist = distance(data[0].xyz, world_position);
|
||||||
float delta = 1.0 / distance(data[i].xyz, world_position);
|
|
||||||
|
|
||||||
distances[i] = vec2(delta, data[i].w);
|
// Inverse distance weighting using Shepard's method
|
||||||
dist_sum += delta;
|
for(int i = 0; i < data_size; i++) {
|
||||||
|
distances[i] = sphere_weight(i, world_position, 5.0);
|
||||||
|
dist_sum += distances[i];
|
||||||
|
data_sum += distances[i] * data[i].w;
|
||||||
|
|
||||||
|
float dist = distance(data[i].xyz, world_position);
|
||||||
|
|
||||||
|
if(dist < closest_dist) {
|
||||||
|
closest_dist = dist;
|
||||||
|
closest_index = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < data_size; i++) {
|
float value = (1.0 / dist_sum) * data_sum;
|
||||||
float average = distances[i].x / dist_sum * distances[i].y;
|
|
||||||
color.xyz = texture(color_gradient, vec2(average, 0)).xyz;
|
if( value > 0.0 || value < 1.0) {
|
||||||
|
color.xyz = texture(color_gradient, vec2(value, 0)).xyz;
|
||||||
|
} else {
|
||||||
|
color.xyz = texture(color_gradient, vec2(data[closest_index].w, 0)).xyz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,14 @@ extends Node3D
|
||||||
const ConstructRoomMesh = preload ("res://lib/utils/mesh/construct_room_mesh.gd")
|
const ConstructRoomMesh = preload ("res://lib/utils/mesh/construct_room_mesh.gd")
|
||||||
const wall_material = preload ("./mini_wall.tres")
|
const wall_material = preload ("./mini_wall.tres")
|
||||||
|
|
||||||
@onready var walls_mesh = $WallsMesh
|
@onready var walls_mesh = $Body/Model/WallsMesh
|
||||||
@onready var floor_mesh = $FloorMesh
|
@onready var floor_mesh = $Body/Model/FloorMesh
|
||||||
@onready var collision_shape = $CollisionShape3D
|
@onready var collision_shape = $Body/CollisionShape3D
|
||||||
@onready var toggle_heatmap = $HeatmapButton
|
@onready var toggle_heatmap = $HeatmapButton
|
||||||
|
|
||||||
|
# var temperature_scale := Vector2( - 20.0, 60.0)
|
||||||
|
var temperature_scale := Vector2(22.0, 25.0)
|
||||||
|
|
||||||
var enabled = true:
|
var enabled = true:
|
||||||
set(value):
|
set(value):
|
||||||
enabled = value
|
enabled = value
|
||||||
|
@ -19,6 +22,9 @@ func _ready():
|
||||||
if Store.house.is_loaded() == false:
|
if Store.house.is_loaded() == false:
|
||||||
await Store.house.on_loaded
|
await Store.house.on_loaded
|
||||||
|
|
||||||
|
if Store.house.rooms.size() == 0:
|
||||||
|
return
|
||||||
|
|
||||||
var room = Store.house.rooms[0]
|
var room = Store.house.rooms[0]
|
||||||
|
|
||||||
var corners = room.corners
|
var corners = room.corners
|
||||||
|
@ -31,7 +37,7 @@ func _ready():
|
||||||
floor_mesh.material_override = wall_material
|
floor_mesh.material_override = wall_material
|
||||||
|
|
||||||
active = true
|
active = true
|
||||||
update_data(0.0)
|
EventSystem.on_slow_tick.connect(update_data)
|
||||||
|
|
||||||
toggle_heatmap.on_button_down.connect(func():
|
toggle_heatmap.on_button_down.connect(func():
|
||||||
active=true
|
active=true
|
||||||
|
@ -56,7 +62,6 @@ var active: bool = false
|
||||||
|
|
||||||
func update_data(delta: float) -> void:
|
func update_data(delta: float) -> void:
|
||||||
var data_list = []
|
var data_list = []
|
||||||
var min_max_data
|
|
||||||
|
|
||||||
for room in House.body.get_rooms(0):
|
for room in House.body.get_rooms(0):
|
||||||
for entity in room.get_node("Entities").get_children():
|
for entity in room.get_node("Entities").get_children():
|
||||||
|
@ -68,17 +73,14 @@ func update_data(delta: float) -> void:
|
||||||
|
|
||||||
var sensor_pos = sensor.global_position
|
var sensor_pos = sensor.global_position
|
||||||
|
|
||||||
if min_max_data == null:
|
|
||||||
min_max_data = Vector2(float(data), float(data))
|
|
||||||
else:
|
|
||||||
min_max_data.x = min(min_max_data.x, float(data))
|
|
||||||
min_max_data.y = max(min_max_data.y, float(data))
|
|
||||||
|
|
||||||
data_list.append(Vector4(sensor_pos.x, sensor_pos.y, sensor_pos.z, float(data)))
|
data_list.append(Vector4(sensor_pos.x, sensor_pos.y, sensor_pos.z, float(data)))
|
||||||
|
|
||||||
for data in data_list:
|
data_list = data_list.map(func(data: Vector4) -> Vector4:
|
||||||
data.w = (data.w - min_max_data.x) / (min_max_data.y - min_max_data.x)
|
data.w=(data.w - temperature_scale.x) / (temperature_scale.y - temperature_scale.x)
|
||||||
|
return data
|
||||||
|
)
|
||||||
|
|
||||||
|
print(data_list)
|
||||||
|
|
||||||
wall_material.set_shader_parameter("data", data_list)
|
wall_material.set_shader_parameter("data", data_list)
|
||||||
wall_material.set_shader_parameter("min_max_data", min_max_data)
|
|
||||||
wall_material.set_shader_parameter("data_size", data_list.size())
|
wall_material.set_shader_parameter("data_size", data_list.size())
|
||||||
|
|
|
@ -6,19 +6,24 @@
|
||||||
|
|
||||||
[sub_resource type="BoxShape3D" id="BoxShape3D_bckw3"]
|
[sub_resource type="BoxShape3D" id="BoxShape3D_bckw3"]
|
||||||
|
|
||||||
[node name="Miniature" type="StaticBody3D"]
|
[node name="Miniature" type="Node3D"]
|
||||||
script = ExtResource("1_b53yn")
|
script = ExtResource("1_b53yn")
|
||||||
|
|
||||||
[node name="WallsMesh" type="MeshInstance3D" parent="."]
|
[node name="HeatmapButton" parent="." instance=ExtResource("3_tgdcf")]
|
||||||
|
toggleable = true
|
||||||
|
|
||||||
[node name="FloorMesh" type="MeshInstance3D" parent="."]
|
[node name="Body" type="StaticBody3D" parent="."]
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
|
||||||
shape = SubResource("BoxShape3D_bckw3")
|
shape = SubResource("BoxShape3D_bckw3")
|
||||||
|
|
||||||
[node name="Movable" type="Node" parent="."]
|
[node name="Movable" type="Node" parent="Body"]
|
||||||
script = ExtResource("2_x7oed")
|
script = ExtResource("2_x7oed")
|
||||||
|
|
||||||
[node name="HeatmapButton" parent="." instance=ExtResource("3_tgdcf")]
|
[node name="Model" type="Node3D" parent="Body"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0.5, 0.48)
|
|
||||||
toggleable = true
|
[node name="WallsMesh" type="MeshInstance3D" parent="Body/Model"]
|
||||||
|
skeleton = NodePath("../../..")
|
||||||
|
|
||||||
|
[node name="FloorMesh" type="MeshInstance3D" parent="Body/Model"]
|
||||||
|
skeleton = NodePath("../../..")
|
||||||
|
|
|
@ -127,6 +127,21 @@ static func generate_ceiling_mesh_grid(corners, grid: Vector2=Vector2(0.1, 0.1))
|
||||||
|
|
||||||
var size = max_val - min_val
|
var size = max_val - min_val
|
||||||
|
|
||||||
|
# Subdivide edges to grid
|
||||||
|
for i in range(corners.size()):
|
||||||
|
var corner = corners[i]
|
||||||
|
var next_index = (i + 1) % corners.size()
|
||||||
|
var next_corner = corners[next_index]
|
||||||
|
|
||||||
|
var steps = ceil(Vector2((next_corner - corner).length() / grid.x, size.y / grid.y))
|
||||||
|
|
||||||
|
var forward_dir = (next_corner - corner).normalized() * grid.x
|
||||||
|
|
||||||
|
for x in range(1, steps.x):
|
||||||
|
var point = corner + forward_dir * x
|
||||||
|
|
||||||
|
points.append(Vector2(point.x, point.y))
|
||||||
|
|
||||||
## Fill points insde the polygon
|
## Fill points insde the polygon
|
||||||
for y in range(1, int(size.y / grid.y)):
|
for y in range(1, int(size.y / grid.y)):
|
||||||
var x_intersections: Array[float] = []
|
var x_intersections: Array[float] = []
|
||||||
|
|
Loading…
Reference in New Issue
Block a user