Skip to content

Commit

Permalink
Fixed compute shader code (and iterate buffer) and added cube to mesh…
Browse files Browse the repository at this point in the history
… generation test
  • Loading branch information
RodZill4 committed Oct 1, 2024
1 parent c630765 commit 06c5b25
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 28 deletions.
7 changes: 4 additions & 3 deletions addons/material_maker/engine/nodes/gen_iterate_buffer.gd
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@ func do_update_shaders() -> void:
var shader_compute : MMShaderCompute = shader_computes[i]
var buffer_name : String = buffer_names[i]
if i == 1 and get_parameter("autostop"):

var shader_template : String = load("res://addons/material_maker/engine/nodes/iterate_buffer_compute.tres").text
var output_texture_type : int = 0 if (sources[i].output_type == "f") else 1
if f32:
Expand Down Expand Up @@ -177,10 +176,10 @@ func on_dep_update_buffer(buffer_name : String) -> bool:
else:
iterations = 1
if current_iteration > iterations:
print("Bad iteration for buffer %s (%d > %d)" % [ buffer_name, current_iteration, iterations ])
await get_tree().process_frame
mm_deps.dependency_update(buffer_name, null, true)
is_rendering = false
print("Bad iteration for buffer %s (%d > %d)" % [ buffer_name, current_iteration, iterations ])
return true
var check_current_iteration : int = current_iteration
var autostop : bool = get_parameter("autostop")
Expand All @@ -193,7 +192,9 @@ func on_dep_update_buffer(buffer_name : String) -> bool:
if size < 4:
size = 4

var output_parameter_values : Dictionary = { mm_highest_diff = 0 }
var output_parameter_values : Dictionary = { }
if current_iteration > 0:
output_parameter_values.mm_highest_diff = 0
var status : bool = await shader_compute.compute_shader.render(texture, Vector2i(size, size), output_parameter_values)
if not status:
print("Error while rendering %s" % buffer_name)
Expand Down
7 changes: 4 additions & 3 deletions addons/material_maker/engine/pipeline/compute_shader.gd
Original file line number Diff line number Diff line change
Expand Up @@ -253,15 +253,15 @@ func do_render(rd : RenderingDevice, output_textures_rids : Array[RID], size : V
for o in output_parameters.keys():
var output_parameter : Parameter = output_parameters[o]
var output_parameter_size : int = output_parameter.offset
if output_parameter.size > 0:
if output_parameter.array_size > 0:
output_parameter_size += output_parameter.size * output_parameter.array_size
else:
output_parameter_size += output_parameter.size
if outputs_size < output_parameter_size:
outputs_size = output_parameter_size
outputs = PackedByteArray()
outputs.resize(outputs_size)
if false and has_output_parameters:
if has_output_parameters:
for p in output_parameters_values.keys():
if output_parameters.has(p):
set_parameter_value_to_buffer(output_parameters[p], outputs, output_parameters_values[p])
Expand Down Expand Up @@ -290,10 +290,11 @@ func do_render(rd : RenderingDevice, output_textures_rids : Array[RID], size : V
else:
render_loop(rd, size, chunk_height, uniform_set_0, uniform_set_1, uniform_set_2, uniform_set_4)

print(has_output_parameters)
if has_output_parameters:
for pn in output_parameters.keys():
output_parameters_values.erase(pn)
if uniform_set_4.is_valid() and has_output_parameters:
if uniform_set_4.is_valid():
time("Store output parameters")
outputs = rd.buffer_get_data(outputs_buffer)
for pn in output_parameters.keys():
Expand Down
110 changes: 110 additions & 0 deletions material_maker/panels/preview_3d/meshes/compute_cube.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#version 450
// VERTEX COUNT: 6*(size+1)*(size+1)
// INDEX COUNT: 12*size*(size+2)-2

layout(local_size_x = @LOCAL_SIZE, local_size_y = 1, local_size_z = 1) in;

@DECLARATIONS

layout(set = 3, binding = 0, std140) restrict buffer MM {
int mm_chunk_y;
};

void set_face_point(int vertex_index, vec3 vertex, vec3 normal, vec3 tangent, vec2 tex_uvs) {
mm_out.vertices[3*vertex_index+0] = vertex.x;
mm_out.vertices[3*vertex_index+1] = vertex.y;
mm_out.vertices[3*vertex_index+2] = vertex.z;
mm_out.normals[3*vertex_index+0] = normal.x;
mm_out.normals[3*vertex_index+1] = normal.y;
mm_out.normals[3*vertex_index+2] = normal.z;
mm_out.tangents[4*vertex_index+0] = tangent.x;
mm_out.tangents[4*vertex_index+1] = tangent.y;
mm_out.tangents[4*vertex_index+2] = tangent.z;
mm_out.tangents[4*vertex_index+3] = 1.0;
mm_out.tex_uvs[2*vertex_index+0] = tex_uvs.x;
mm_out.tex_uvs[2*vertex_index+1] = tex_uvs.y;
}

void set_point(int x, int y) {
int vertex_index = x+(size+1)*y;
int vertex_offset = (size+1)*(size+1);
float scale = 1.0/float(size);
vec2 p = vec2(scale*x-0.5, scale*y-0.5);
vec3 vertex;
vec3 tangent;
vec3 normal;
vec2 tex_uvs;
vec2 angle;
vec2 base = p;
int round = 0;
float radius = curvature*0.70710678118;
if (2.0*scale*x < curvature) {
base.x = -0.5+0.5*curvature;
round += 1;
} else if (2.0*scale*x > 2.0-curvature) {
base.x = 0.5-0.5*curvature;
round += 1;
}
if (2.0*scale*y < curvature) {
base.y = -0.5+0.5*curvature;
round += 1;
} else if (2.0*scale*y > 2.0-curvature) {
base.y = 0.5-0.5*curvature;
round += 1;
}
if (p == base) {
angle = vec2(0.0);
} else {
angle = p-base;
angle *= 0.78539816339;
angle /= 0.5*curvature;
if (round > 1) {
float m = max(abs(angle.x), abs(angle.y));
angle = 1.1*m*normalize(angle/m);
}
}
vec2 sin_angle = sin(angle);
normal = vec3(sin_angle.x, sqrt(1.0-dot(sin_angle, sin_angle)), sin_angle.y);
vertex = vec3(base.x, 0.5-0.72*radius, base.y)+radius*normal;
tangent = normalize(vec3(1.0, 0.0, 0.0));
tex_uvs = scale*vec2(x, y);
set_face_point(vertex_index, vertex, normal, tangent, tex_uvs);
set_face_point(vertex_index+vertex_offset, vertex.yzx, normal.yzx, tangent.yzx, tex_uvs);
set_face_point(vertex_index+2*vertex_offset, vertex.zxy, normal.zxy, tangent.zxy, tex_uvs);
set_face_point(vertex_index+3*vertex_offset, -vertex.xzy, -normal.xzy, -tangent.xzy, tex_uvs);
set_face_point(vertex_index+4*vertex_offset, -vertex.yxz, -normal.yxz, -tangent.yxz, tex_uvs);
set_face_point(vertex_index+5*vertex_offset, -vertex.zyx, -normal.zyx, -tangent.zyx, tex_uvs);
}

void main() {
ivec2 c = ivec2(gl_GlobalInvocationID.xy)+ivec2(0, mm_chunk_y);
set_point(c.x, c.y);
if (c.x == size-1) {
set_point(size, c.y);
if (c.y == size-1) {
set_point(size, size);
}
}
if (c.y == size-1) {
set_point(c.x, size);
}
int index_offset = 0;
int vertex_offset = 0;
for (int i = 0; i < 6; ++i) {
mm_out.indexes[index_offset+2*(c.x+(size+2)*c.y)] = vertex_offset+c.x+(size+1)*(c.y+1);
mm_out.indexes[index_offset+2*(c.x+(size+2)*c.y)+1] = vertex_offset+c.x+(size+1)*c.y;
if (c.x == size-1) {
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)] = vertex_offset+size+(size+1)*(c.y+1);
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)+1] = vertex_offset+size+(size+1)*c.y;
if (c.y != size-1) {
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)+2] = vertex_offset+size+(size+1)*c.y;
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)+3] = vertex_offset+(size+1)*(c.y+2);
} else if (i < 5) {
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)+2] = vertex_offset+size+(size+1)*c.y;
mm_out.indexes[index_offset+2*(size+(size+2)*c.y)+3] = vertex_offset+(size+1)*(size+2);
}
}
index_offset += 2*(size+2)*size;
vertex_offset += (size+1)*(size+1);
}
}
6 changes: 3 additions & 3 deletions material_maker/panels/preview_3d/meshes/mesh_generator.gd
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var shader : MMComputeShader = MMComputeShader.new()
var size : int = 2

@onready var generated_mesh = $Pivot/MeshInstance
@onready var plane = $Pivot/Plane
@onready var ref_mesh = $Pivot/Ref

# Called when the node enters the scene tree for the first time.
func _ready():
Expand Down Expand Up @@ -34,7 +34,7 @@ func get_expression_value_from_string(string : String, prefix: String, values: D
return rv

func setup_shader():
var string : String = FileAccess.open("res://material_maker/panels/preview_3d/meshes/compute_plane.txt", FileAccess.READ).get_as_text()
var string : String = FileAccess.open("res://material_maker/panels/preview_3d/meshes/compute_cube.txt", FileAccess.READ).get_as_text()
var vertex_count : int = get_expression_value_from_string(string, "// VERTEX COUNT:", {size=size})
var index_count : int = get_expression_value_from_string(string, "// INDEX COUNT:", {size=size})
shader.local_size = size if size < 32 else 32
Expand Down Expand Up @@ -71,7 +71,7 @@ func _on_reload_shader_pressed():

func _on_model_pressed():
generated_mesh.visible = not generated_mesh.visible
plane.visible = not plane.visible
ref_mesh.visible = not ref_mesh.visible

func _on_size_value_changed(value):
size = 1 << int(value)
Expand Down
38 changes: 19 additions & 19 deletions material_maker/panels/preview_3d/meshes/mesh_generator.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ uniform vec3 uv2_scale;
uniform vec3 uv2_offset;

void vertex() {
VERTEX += NORMAL * texture(texture_heightmap, UV).r * heightmap_scale;
VERTEX += NORMAL * texture(texture_heightmap, UV).r * heightmap_scale;
UV = UV * uv1_scale.xy + uv1_offset.xy;
}

Expand Down Expand Up @@ -80,7 +80,7 @@ shader_parameter/metallic = 1.0
shader_parameter/normal_scale = 1.0
shader_parameter/ao_texture_channel = null
shader_parameter/ao_light_affect = 0.0
shader_parameter/heightmap_scale = 0.2
shader_parameter/heightmap_scale = 0.1
shader_parameter/uv1_scale = Vector3(1, 1, 1)
shader_parameter/uv1_offset = Vector3(0, 0, 0)
shader_parameter/uv2_scale = Vector3(1, 1, 1)
Expand All @@ -94,37 +94,37 @@ shader_parameter/texture_heightmap = ExtResource("4_87aax")

[sub_resource type="ArrayMesh" id="ArrayMesh_nb5y3"]

[sub_resource type="PlaneMesh" id="PlaneMesh_tpjls"]
[sub_resource type="BoxMesh" id="BoxMesh_np4y6"]

[sub_resource type="Animation" id="Animation_umfat"]
resource_name = "rotate"
loop_mode = 1
[sub_resource type="Animation" id="Animation_lmjcq"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 6.28319, 0)]
"values": [Vector3(0, 0, 0)]
}

[sub_resource type="Animation" id="Animation_lmjcq"]
length = 0.001
[sub_resource type="Animation" id="Animation_umfat"]
resource_name = "rotate"
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:rotation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0)]
"values": [Vector3(0, 0, 0), Vector3(0, 6.28319, 0)]
}

[sub_resource type="AnimationLibrary" id="AnimationLibrary_s43cy"]
Expand All @@ -147,7 +147,7 @@ sky = SubResource("Sky_f7iul")
script = ExtResource("1_m0lfx")

[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(-3.78552e-08, -0.5, 0.866025, -2.18557e-08, 0.866025, 0.5, -1, 1.95399e-14, -4.37114e-08, 1.68223, 0.650311, 0)
transform = Transform3D(-3.78552e-08, -0.5, 0.866025, -2.18557e-08, 0.866025, 0.5, -1, 1.95399e-14, -4.37114e-08, 1.68223, 1.12409, 0)

[node name="Pivot" type="Node3D" parent="."]

Expand All @@ -157,11 +157,11 @@ material_override = SubResource("ShaderMaterial_8fhl5")
mesh = SubResource("ArrayMesh_nb5y3")
skeleton = NodePath("../..")

[node name="Plane" type="MeshInstance3D" parent="Pivot"]
[node name="Ref" type="MeshInstance3D" parent="Pivot"]
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
visible = false
material_override = SubResource("ShaderMaterial_8fhl5")
mesh = SubResource("PlaneMesh_tpjls")
mesh = SubResource("BoxMesh_np4y6")
skeleton = NodePath("../..")

[node name="AnimationPlayer" type="AnimationPlayer" parent="Pivot"]
Expand All @@ -175,7 +175,7 @@ speed_scale = 0.1
environment = SubResource("Environment_73u55")

[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(-0.0616537, -0.773177, -0.631186, -0.0687772, -0.627595, 0.775496, -0.995725, 0.0912234, -0.0144834, -0.086213, 2.8091, 0)
transform = Transform3D(-0.0942471, 0.777948, 0.62122, -0.0687772, -0.627595, 0.775496, 0.99317, 0.0303625, 0.112654, -0.086213, 2.8091, 0)
light_energy = 2.0

[node name="UI" type="Control" parent="."]
Expand Down Expand Up @@ -205,7 +205,7 @@ prefix = "Size: "

[node name="Curvature" type="HSlider" parent="UI/VBoxContainer"]
layout_mode = 2
max_value = 5.0
max_value = 1.0
step = 0.01
scrollable = false
tick_count = 5
Expand Down

0 comments on commit 06c5b25

Please sign in to comment.