diff --git a/src/Animation.jl b/src/Animation.jl index edc4ad6..790c8b8 100644 --- a/src/Animation.jl +++ b/src/Animation.jl @@ -26,13 +26,16 @@ function animate_bundle!(args, sim_consts) color = get(args.color_scheme, rem2pi(bundle_φ[i, frame], RoundDown) / π2) args.colors[][i] = RGBAf(color) - if args.debug + if args.show_interaction_circle args.interaction_circles[][i] = Circle( Point2(c[1], c[2]), sim_consts.interaction_r ) + args.interaction_colors[][i] = RGBAf(color, 0.08) + end + + if args.show_skin_circle args.skin_circles[][i] = Circle(Point2(c[1], c[2]), sim_consts.skin_r) - args.interaction_colors[][i] = RGBAf(color, 0.08) args.skin_colors[][i] = RGBAf(color, 0.04) end end @@ -47,21 +50,24 @@ function animate_bundle!(args, sim_consts) ) end - if args.n_bundle == 1 + if args.n_bundle == 1 # First and only frame of first bundle poly!(args.ax, args.circles; color=args.colors) if args.show_center_of_mass poly!(args.ax, args.center_of_mass_circle; color=RGBAf(1, 1, 1, 0.5)) end - if args.debug + if args.show_interaction_circle poly!(args.ax, args.interaction_circles; color=args.interaction_colors) + end + + if args.show_skin_circle poly!(args.ax, args.skin_circles; color=args.skin_colors) end println("Recording started!") else - if args.debug && frame > 1 + if args.show_frame_diff && frame > 1 @simd for i in 1:(sim_consts.n_particles) first_ind = 2 * i - 1 second_ind = 2 * i @@ -79,6 +85,9 @@ function animate_bundle!(args, sim_consts) args.ax, args.segments_x, args.segments_y; color=args.colors ) end + + notify(args.segments_x) + notify(args.segments_y) end notify(args.circles) @@ -88,15 +97,14 @@ function animate_bundle!(args, sim_consts) notify(args.center_of_mass_circle) end - if args.debug && frame > 1 + if args.show_interaction_circle notify(args.interaction_circles) notify(args.interaction_colors) + end + if args.show_skin_circle notify(args.skin_circles) notify(args.skin_colors) - - notify(args.segments_x) - notify(args.segments_y) end end @@ -108,8 +116,32 @@ function animate_bundle!(args, sim_consts) return nothing end +function sort_bundle_paths(bundle_paths::Vector{String}) + n_bundles = length(bundle_paths) + + bundle_nums = Vector{Int64}(undef, n_bundles) + + extension_length = 5 # == length(".jld2") + + for i in 1:n_bundles + bundle_path = bundle_paths[i] + bundle_num_string = bundle_path[(findfirst("bundle_", s).stop + 1):(end - extension_length)] + bundle_nums[i] = parse(Int64, bundle_num_string) + end + + sort_perm = sortperm(bundle_nums) + + return bundle_paths[sort_perm] +end + function animate_with_sim_consts( - dir::String, sim_consts, framerate::Int64, show_center_of_mass::Bool, debug::Bool + dir::String, + sim_consts, + framerate::Int64, + show_center_of_mass::Bool, + show_interaction_circle::Bool, + show_skin_circle::Bool, + show_frame_diff::Bool, ) set_theme!(theme_black()) @@ -153,26 +185,24 @@ function animate_with_sim_consts( ) end - if debug - segments_x = Observable(zeros(2 * n_particles)) - segments_y = Observable(zeros(2 * n_particles)) - + if show_interaction_circle interaction_circles = Observable(Vector{Circle}(undef, n_particles)) skin_circles = Observable(Vector{Circle}(undef, n_particles)) + end + if show_skin_circle interaction_colors = Observable(Vector{RGBAf}(undef, n_particles)) skin_colors = Observable(Vector{RGBAf}(undef, n_particles)) end + if show_frame_diff + segments_x = Observable(zeros(2 * n_particles)) + segments_y = Observable(zeros(2 * n_particles)) + end + bundle_paths = readdir("$dir/bundles"; join=true, sort=false) - sort_perm = sortperm([ - parse(Int64, s[(findfirst("bundle_", s).stop + 1):(end - length(".jld2"))]) for - s in bundle_paths - ]) - - bundle_paths = bundle_paths[sort_perm] - sort_perm = nothing + bundle_paths = sort_bundle_paths(bundle_paths) @showprogress 1 for (n_bundle, bundle_path) in enumerate(bundle_paths) bundle::Bundle = JLD2.load_object(bundle_path) @@ -180,7 +210,9 @@ function animate_with_sim_consts( args = (; # Input show_center_of_mass, - debug, + show_interaction_circle, + show_skin_circle, + show_frame_diff, # Intern io, ax, @@ -207,13 +239,26 @@ function animate_with_sim_consts( end function animate( - dir::String; framerate::Int64=1, show_center_of_mass::Bool=false, debug::Bool=false + dir::String; + framerate::Int64=1, + show_center_of_mass::Bool=false, + show_interaction_circle::Bool=false, + show_skin_circle::Bool=false, + show_frame_diff::Bool=false, ) println("Generating animation...") sim_consts = JSON3.read(read("$dir/sim_consts.json", String)) - animate_with_sim_consts(dir, sim_consts, framerate, show_center_of_mass, debug) + animate_with_sim_consts( + dir, + sim_consts, + framerate, + show_center_of_mass, + show_interaction_circle, + show_skin_circle, + show_frame_diff, + ) println("Animation done.")