Skip to content

Commit bcad4d9

Browse files
authored
Merge pull request #21 from jackyarndley/development
Development
2 parents 22d1ef0 + 80ec460 commit bcad4d9

18 files changed

+469
-104
lines changed

.cargo/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[build]
2+
rustflags = "-C target-cpu=native"

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
*.svg
66
*.data
77
*.old
8-
/output
8+
/output
9+
/.vscode
10+
*.mp4

Cargo.lock

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
[package]
22
name = "rust_fractal"
3-
version = "0.5.0"
3+
version = "0.6.0"
44
authors = ["jackyarndley <34801340+jackyarndley@users.noreply.github.com>"]
55
description = "Fast, efficient mandelbrot set renderer."
66
edition = "2018"
77

88
[dependencies]
9-
image = "0.23.6"
9+
image = "^0.23.6"
1010
rand = "^0.7.3"
1111
num-complex = "^0.2.4"
12-
rayon = "1.3.1"
12+
rayon = "^1.3.1"
1313
exr = "^0.8.0"
1414
smallvec = "^1.4.2"
1515
clap = "3.0.0-beta.1"
1616
config = "0.9"
17+
half = "^1.6.0"
1718

1819
[dependencies.rug]
1920
version = "1.10"
@@ -22,6 +23,7 @@ features = ["float", "complex"]
2223

2324
#Additional commands that can improve performance (maybe by around 5-10%)
2425
[profile.release]
25-
#lto = "fat"
26-
#codegen-units = 1
26+
lto = "fat"
27+
codegen-units = 1
2728
#debug = true
29+
opt-level=3

TODO.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

assemble_video.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import imageio
2+
import numpy as np
3+
import time
4+
import os
5+
import math
6+
import glob
7+
8+
from PIL import Image
9+
10+
frames_between_keyframes = 60
11+
maximum_keyframe_number = 728
12+
zoom_scale = 2.0
13+
14+
# log1.1 of 2 is 7.27
15+
# 60 / that is 8.25, so lets take 8 frames per keyframe
16+
17+
# Arguments for ffmpeg
18+
kargs = {
19+
'macro_block_size': 8,
20+
'fps': 60,
21+
'format': 'FFMPEG',
22+
'quality': 8
23+
}
24+
25+
t0 = time.time()
26+
27+
segment = 0
28+
segment_names = []
29+
30+
framebuffer = []
31+
32+
writer = imageio.get_writer(f"segment_{segment:08}.mp4", **kargs)
33+
segment_names.append(f"segment_{segment:08}.mp4")
34+
35+
files = glob.glob("output/*.png")
36+
files.sort()
37+
38+
# We start with the previous image, this is modified
39+
previous_keyframe = Image.open(files[0])
40+
41+
(width, height) = (previous_keyframe.width, previous_keyframe.height)
42+
(scaled_width, scaled_height) = (int(zoom_scale * width), int(zoom_scale * height))
43+
44+
val1 = (scaled_width - width) // 2
45+
val2 = (scaled_height - height) // 2
46+
47+
placement_box = (val1, val2, val1 + width, val2 + height)
48+
49+
for i in range(0, maximum_keyframe_number):
50+
# Creates 10 second segments
51+
if (i * frames_between_keyframes) % 600 == 0 and i != 0:
52+
# Add current_framebuffer frames
53+
for frame in reversed(framebuffer):
54+
writer.append_data(frame)
55+
56+
segment += 1
57+
58+
framebuffer = []
59+
60+
# Writer for adding frames to the video
61+
writer = imageio.get_writer(f"segment_{segment:08}.mp4", **kargs)
62+
segment_names.append(f"segment_{segment:08}.mp4")
63+
64+
next_keyframe = Image.open(files[i + 1])
65+
66+
# This has to be nearest
67+
scaled_keyframe = next_keyframe.resize((scaled_width, scaled_height), resample=Image.NEAREST)
68+
69+
scaled_keyframe.paste(previous_keyframe, placement_box)
70+
71+
current_scale = zoom_scale
72+
factor = 10**(math.log10(zoom_scale) / frames_between_keyframes)
73+
74+
for j in range(0, frames_between_keyframes):
75+
# zoom = 1.0 + (2**(1.0 - j / frames_between_keyframes) - 1.0) * (zoom_scale - 1.0)
76+
# zoom = zoom_scale**(1.0 - j / frames_between_keyframes)
77+
# zoom = zoom_scale**((1.0 - j / frames_between_keyframes))
78+
current_scale /= factor
79+
80+
temp1 = (1.0 - 1.0 / current_scale) * (scaled_width // 2)
81+
temp2 = (1.0 - 1.0 / current_scale) * (scaled_height // 2)
82+
temp3 = scaled_width - temp1
83+
temp4 = scaled_height - temp2
84+
85+
next_frame = scaled_keyframe.crop((temp1, temp2, temp3, temp4)).resize((width, height), resample=Image.LANCZOS)
86+
87+
framebuffer.append(np.array(next_frame))
88+
89+
elapsed = time.time() - t0
90+
print(f"{i * frames_between_keyframes + j + 1}/{maximum_keyframe_number * frames_between_keyframes + 1} {elapsed:.2f}s {((i * frames_between_keyframes + j + 1)/elapsed):.2f} fps")
91+
92+
previous_keyframe = scaled_keyframe.resize((width, height), resample=Image.LANCZOS)
93+
94+
95+
framebuffer.append(np.array(previous_keyframe))
96+
97+
for frame in reversed(framebuffer):
98+
writer.append_data(frame)
99+
100+
with open('segments.txt', 'w') as f:
101+
for segment in reversed(segment_names):
102+
f.write(f"file '{segment}'\n")
103+
104+
writer.close()
105+
106+
elapsed = time.time() - t0
107+
print(f"{maximum_keyframe_number * frames_between_keyframes + 1}/{maximum_keyframe_number * frames_between_keyframes + 1} {elapsed:.2f}s {((maximum_keyframe_number * frames_between_keyframes + 1)/elapsed):.2f} fps")
108+
109+
os.system("ffmpeg -y -f concat -safe 0 -i segments.txt -c copy output.mp4")

default.toml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
image_width = 1920
2-
image_height = 1080
3-
frames = 50
4-
export = "kfb"
5-
rotate = 0
6-
glitch_tolerance = 0.000001
1+
image_width = 1000
2+
image_height = 1000
3+
frames = 1
4+
export = "both"
5+
glitch_tolerance = 0.000001
6+
zoom_scale = 2.0
7+
auto_adjust_iterations = true

locations/11-dimensions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
real = "-1.7891690186048231066744683411888387638173618368159070155822017397181006156270275749142369245820396054406395755675312183271534128923049471434097690222315419202715383264050159131947029173677395015878767362862533310902938210320999999999999999999999999999999998"
2+
imag = "-0.0000003393685157671825660282302661468127283482188945938569013974696942388736569110136147219176174266842972236468548795141989046122450230790250469659063534132826324119846599278074403635939133245821264547306595273202030703232999999999999999999999999999999998"
3+
zoom = "1.41200697933E219"
4+
iterations = 200000
File renamed without changes.

locations/e52464.toml

Lines changed: 4 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)