Skip to content

Commit

Permalink
Supporting shader hot reload. (#77)
Browse files Browse the repository at this point in the history
  • Loading branch information
edisonlee0212 authored Dec 22, 2024
1 parent 9d20c47 commit 51cc48d
Show file tree
Hide file tree
Showing 68 changed files with 2,877 additions and 2,795 deletions.
2 changes: 1 addition & 1 deletion EvoEngine_App/DemoApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ void SetupDemoScene(DemoSetup demo_setup, ApplicationInfo& application_info) {
#pragma region Set main camera to correct position and rotation
const auto main_camera = scene->main_camera.Get<Camera>();
main_camera->Resize({640, 480});
main_camera->post_processing_stack = ProjectManager::CreateTemporaryAsset<PostProcessingStack>();
main_camera->post_processing_stack_ref = ProjectManager::CreateTemporaryAsset<PostProcessingStack>();
const auto main_camera_entity = main_camera->GetOwner();
auto main_camera_transform = scene->GetDataComponent<Transform>(main_camera_entity);
main_camera_transform.SetPosition(glm::vec3(0, 0, 4));
Expand Down
3 changes: 2 additions & 1 deletion EvoEngine_App/EcoSysLabApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,10 @@ int main() {

EngineSetup();

Application::PushLayer<RenderLayer>();
Application::PushLayer<WindowLayer>();
Application::PushLayer<EditorLayer>();
Application::PushLayer<RenderLayer>();

#ifdef CUDA_MODULE_PLUGIN
Application::PushLayer<RayTracerLayer>();
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ void main(){
if(segment_pair_index >= segment_pair_size) break;

SegmentPair segment_pair = segment_pairs[segment_pair_index];
if(segment_pair.connectivity_valid == 0) continue;
if(segment_pair.connectivity_integrity <= 0.f) continue;
Segment segment0 = segments[segment_pair.segment0_handle];
Segment segment1 = segments[segment_pair.segment1_handle];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ void main() {
if (pair_handle < 0)
continue;
SegmentPair segment_pair = segment_pairs[pair_handle];
if (segment_pair.connectivity_valid == 0 && segment_pair.bend_twist_bundle_valid == 0)
if (segment_pair.connectivity_integrity <= 0.0f && segment_pair.bend_twist_bundle_integrity <= 0.0f)
continue;
bool is_segment0 = segment_index == segment_pair.segment0_handle;
int neighbor_group_index = segments[is_segment0 ? segment_pair.segment1_handle : segment_pair.segment0_handle].group_index;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ void main(){
vec2 segment1_screen = vec2((segment1_screen_space_position.x + 1.0f) * 0.5f, (-segment1_screen_space_position.y + 1.0f) * 0.5f);

if(LineIntersect(segment0_screen, segment1_screen, line_start, line_end)){
if(cut_mode == 0) segment_pairs[segment_pair_index].connectivity_valid = 0;
segment_pairs[segment_pair_index].bend_twist_bundle_valid = 0;
if(cut_mode == 0) segment_pairs[segment_pair_index].connectivity_integrity = 0.f;
segment_pairs[segment_pair_index].bend_twist_bundle_integrity = 0.f;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require
#extension GL_KHR_shader_subgroup_basic : require
#extension GL_KHR_shader_subgroup_ballot : require
#extension GL_KHR_shader_subgroup_vote : require
#extension GL_ARB_shading_language_include : enable
#extension GL_EXT_control_flow_attributes : require

#define DYNAMIC_STRANDS_SET 0
#include "DynamicStrands.glsl"
#include "Math.glsl"

const uint WORKGROUP_SIZE = COMPUTE_SUBGROUP_COUNT * SUBGROUP_SIZE;

const uint ITERATIONS_PER_TASK = ((COMPUTE_WORK_GROUP_INVOCATIONS + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE);

uint baseID = gl_WorkGroupID.x * COMPUTE_WORK_GROUP_INVOCATIONS;
uint laneID = gl_LocalInvocationID.x;

layout(local_size_x = WORKGROUP_SIZE, local_size_y = 1, local_size_z = 1) in;

#define BARRIER() \
memoryBarrierShared(); \
barrier();

struct SegmentUpdate{
float axis_offset;
float axis_distance;
uint segment_index;
uint particle0_closer;
};

layout(std430, set = 1, binding = 0) readonly buffer SEGMENT_UPDATE_BLOCK {
SegmentUpdate segment_updates[];
};

layout(push_constant) uniform PUSH_CONSTANTS {
vec3 pivot_position;
uint command_size;
vec3 axis;
};

void main(){
[[unroll]]
for (uint i = 0; i < ITERATIONS_PER_TASK; i++)
{
uint local_index = laneID + i * WORKGROUP_SIZE;
uint global_index = baseID + local_index;

if(global_index >= command_size) break;

SegmentUpdate segment_update = segment_updates[global_index];
uint segment_index = segment_update.segment_index;
Segment segment = segments[segment_index];
segment.torque = vec3(0, 0, 0);

vec3 front_direction = normalize(rotate_vec3(segment.q, vec3(0, 0, -1)));
vec3 up_direction = normalize(rotate_vec3(segment.q, vec3(0, 1, 0)));

float current_segment_length = distance(segment.particle0.x, segment.particle1.x);
vec3 segment_center_position = (segment.particle0.x + segment.particle1.x) * 0.5f;

vec3 axis_position = pivot_position + segment_update.axis_offset * axis;
vec3 line_projection = dot(segment_center_position - pivot_position, axis) * axis;
vec3 diff = segment_center_position - pivot_position - line_projection;
vec3 direction = length(diff) == 0.0f ? front_direction : normalize(diff);
vec3 desired_segment_center_position = axis_position + segment_update.axis_distance * direction;

//if(segment_update.particle0_closer == 0){
// direction = -direction;
//}

//segment.q = segment.last_q = quatLookAt(direction, up_direction);
vec3 offset = direction * 0.5f * current_segment_length;

//segment.particle0.x = segment.particle0.last_x = desired_segment_center_position - offset;
//segment.particle0.acceleration.xyz = vec3(0, 0, 0);

segment.particle1.x = segment.particle1.last_x = desired_segment_center_position - offset;
segment.particle1.acceleration.xyz = vec3(0, 0, 0);

segments[segment_index] = segment;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ void main(){
}

if(intersect){
if(cut_mode == 0) segment_pairs[segment_pair_index].connectivity_valid = 0;
segment_pairs[segment_pair_index].bend_twist_bundle_valid = 0;
if(cut_mode == 0) segment_pairs[segment_pair_index].connectivity_integrity = 0.f;
segment_pairs[segment_pair_index].bend_twist_bundle_integrity = 0.f;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,14 @@ barrier();
struct SegmentUpdate{
vec4 new_rotation;
vec3 new_particle0_position;
uint segment_index;
uint fix_particle0;
vec3 new_particle1_position;
uint fix_particle1;

uint segment_index;
uint padding0;
uint padding1;
uint padding2;
};

layout(std430, set = 1, binding = 0) readonly buffer SEGMENT_UPDATE_BLOCK {
Expand All @@ -52,13 +57,15 @@ void main(){
Segment segment = segments[segment_index];
segment.q = segment.last_q = segment_update.new_rotation;
segment.torque = vec3(0, 0, 0);
segment.inv_mass = 0.0;

segment.particle0.x = segment.particle0.last_x = segment_update.new_particle0_position;
segment.particle0.acceleration.xyz = vec3(0, 0, 0);
segment.particle1.x = segment.particle1.last_x = segment_update.new_particle1_position;
segment.particle1.acceleration.xyz = vec3(0, 0, 0);

segment.inv_mass = 0.0f;
if(segment_update.fix_particle0 == 1){
segment.particle0.x = segment.particle0.last_x = segment_update.new_particle0_position;
segment.particle0.acceleration.xyz = vec3(0, 0, 0);
}
if(segment_update.fix_particle1 == 1){
segment.particle1.x = segment.particle1.last_x = segment_update.new_particle1_position;
segment.particle1.acceleration.xyz = vec3(0, 0, 0);
}
segments[segment_index] = segment;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ barrier();

layout(push_constant) uniform PUSH_CONSTANTS {
uint pair_size;
uint allow_disconnection;
uint allow_breaking;
};

Expand All @@ -35,8 +36,8 @@ void main(){
uint pair_index = baseID + local_index;
if(pair_index >= pair_size) break;
SegmentPair segment_pair = segment_pairs[pair_index];
uint connectivity_valid = segment_pair.connectivity_valid;
uint bend_twist_bundle_valid = segment_pair.bend_twist_bundle_valid;
float connectivity_integrity = segment_pair.connectivity_integrity;
float bend_twist_bundle_integrity = segment_pair.bend_twist_bundle_integrity;
//Modify limit here.
vec4 bending_twist_bundle_strain_limit = segment_pair.max_bending_twist_bundle_strain;

Expand All @@ -45,27 +46,32 @@ void main(){

float original_distance0 = distance(segment0.particle0.x0.xyz, segment1.particle0.x0.xyz);
float current_distance0 = distance(segment0.particle0.x, segment1.particle0.x);
float strain0 = abs(current_distance0 - original_distance0) / (segment0.rest_length + segment1.rest_length) * 2.0;
float strain0 = abs(current_distance0 - original_distance0) / (segment0.rest_length + segment1.rest_length) * 2.0f;
float original_distance1 = distance(segment0.particle1.x0.xyz, segment1.particle1.x0.xyz);
float current_distance1 = distance(segment0.particle1.x, segment1.particle1.x);
float strain1 = abs(current_distance1 - original_distance1) / (segment0.rest_length + segment1.rest_length) * 2.0;
float strain1 = abs(current_distance1 - original_distance1) / (segment0.rest_length + segment1.rest_length) * 2.0f;

float bundle_strain = max(strain0, strain1);
vec2 bend_twist_strain = bend_twist_strain(segment0.q, segment1.q, segment_pair.rest_darboux_vector);

if(allow_disconnection == 1){
if(abs(segment0.shear_stretch_strain.x) > segment0.shear_stretch_strain_limit.x
|| abs(segment0.shear_stretch_strain.y) > segment0.shear_stretch_strain_limit.y
|| abs(segment1.shear_stretch_strain.x) > segment1.shear_stretch_strain_limit.x
|| abs(segment1.shear_stretch_strain.y) > segment1.shear_stretch_strain_limit.y){
connectivity_integrity = -1.0f;
}
}
if(allow_breaking == 1){
connectivity_valid = ((connectivity_valid == 1)
&& abs(segment0.shear_stretch_strain.x) < segment0.shear_stretch_strain_limit.x
&& abs(segment0.shear_stretch_strain.y) < segment0.shear_stretch_strain_limit.y
&& abs(segment1.shear_stretch_strain.x) < segment1.shear_stretch_strain_limit.x
&& abs(segment1.shear_stretch_strain.y) < segment1.shear_stretch_strain_limit.y) ? 1 : 0;
if(abs(bend_twist_strain.x) > bending_twist_bundle_strain_limit.x
|| abs(bend_twist_strain.y) > bending_twist_bundle_strain_limit.z
|| bundle_strain > bending_twist_bundle_strain_limit.z){
bend_twist_bundle_integrity = -1.0f;
}
}

bend_twist_bundle_valid = ((bend_twist_bundle_valid == 1) && abs(bend_twist_strain.x) < bending_twist_bundle_strain_limit.x
&& abs(bend_twist_strain.y) < bending_twist_bundle_strain_limit.z
&& bundle_strain < bending_twist_bundle_strain_limit.z) ? 1 : 0;
segment_pairs[pair_index].bending_twist_bundle_strain = vec4(bend_twist_strain.x, bend_twist_strain.y, bundle_strain, 0.0f);
segment_pairs[pair_index].bend_twist_bundle_valid = bend_twist_bundle_valid;
segment_pairs[pair_index].connectivity_valid = connectivity_valid;
segment_pairs[pair_index].bend_twist_bundle_integrity = bend_twist_bundle_integrity;
segment_pairs[pair_index].connectivity_integrity = connectivity_integrity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void main(){
Segment segment0 = segments[segment_pair.segment0_handle];
Segment segment1 = segments[segment_pair.segment1_handle];
bool render = !(segment_pair_index_global >= segment_pairs_size)
&& (segment_pair.connectivity_valid == 1 || segment_pair.bend_twist_bundle_valid == 1)
&& (segment_pair.connectivity_integrity > 0.0f || segment_pair.bend_twist_bundle_integrity > 0.0f)
&& segment0.strand_handle != segment1.strand_handle;

uvec4 vote_segment_pairs = subgroupBallot(render);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ struct Segment {
struct SegmentPair {
int segment0_handle;
int segment1_handle;
uint bend_twist_bundle_valid;
uint connectivity_valid;
float bend_twist_bundle_integrity;
float connectivity_integrity;

float bending_alpha;
float twisting_alpha;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ void project_shear_stretch_constraint(in float inv_time_step, in int segment_han
SegmentData segment_data = segment_data_list[segment_handle];

if (segment.prev_handle != -1) {
if (segment_pairs[segment_data.pair_handles[0]].connectivity_valid == 1) {
if (segment_pairs[segment_data.pair_handles[0]].connectivity_integrity > 0.f) {
segments[segment.prev_handle].particle1.x = particle0_new_position;
}
}
if (segment.next_handle != -1) {
if (segment_pairs[segment_data.pair_handles[1]].connectivity_valid == 1) {
if (segment_pairs[segment_data.pair_handles[1]].connectivity_integrity > 0.f) {
segments[segment.next_handle].particle0.x = particle1_new_position;
}
}
Expand Down Expand Up @@ -136,7 +136,7 @@ void project_shear_stretch_constraint(in float inv_time_step, in vec3 p0, in vec

void project_bend_twist_constraint(in float inv_time_step, in int segment_pair_handle) {
SegmentPair segment_pair = segment_pairs[segment_pair_handle];
if (segment_pair.bend_twist_bundle_valid == 0)
if (segment_pair.bend_twist_bundle_integrity <= 0.f)
return;

vec4 q0_correction, q1_correction;
Expand All @@ -159,7 +159,7 @@ void project_bend_twist_constraint(in float inv_time_step, in int segment_pair_h
void project_bend_twist_constraint(in float inv_time_step, in int segment_pair_handle, out vec4 q0_correction,
out vec4 q1_correction) {
SegmentPair segment_pair = segment_pairs[segment_pair_handle];
if (segment_pair.bend_twist_bundle_valid == 0)
if (segment_pair.bend_twist_bundle_integrity <= 0.f)
return;
int segment0_handle = segment_pair.segment0_handle;
int segment1_handle = segment_pair.segment1_handle;
Expand Down Expand Up @@ -232,7 +232,7 @@ void BundleSegment(in uint segment_handle, in float inv_time_step, in float over
if (pair_handle < 0)
continue;
SegmentPair segment_pair = segment_pairs[pair_handle];
if (segment_pair.bend_twist_bundle_valid == 0)
if (segment_pair.bend_twist_bundle_integrity <= 0.f)
continue;
bool is_segment0 = segment_handle == segment_pair.segment0_handle;
Segment segment1 = segments[is_segment0 ? segment_pair.segment1_handle : segment_pair.segment0_handle];
Expand Down Expand Up @@ -288,7 +288,7 @@ void BundleSegmentBendTwist(in uint segment_handle, in float inv_time_step, in f
if (pair_handle < 0)
continue;
SegmentPair segment_pair = segment_pairs[pair_handle];
if (segment_pair.bend_twist_bundle_valid == 0)
if (segment_pair.bend_twist_bundle_integrity <= 0.f)
continue;
bool is_segment0 = segment_handle == segment_pair.segment0_handle;
vec4 q0_correction, q1_correction;
Expand Down
Loading

0 comments on commit 51cc48d

Please sign in to comment.