Compare commits
No commits in common. "5a36bfb40b23da079cd8744b1b2541aeba31ce95" and "f8eba44e4c6fb3cfa04e36d027da3d5d4b502a42" have entirely different histories.
5a36bfb40b
...
f8eba44e4c
|
@ -2,27 +2,6 @@
|
||||||
|
|
||||||
use crate::gegl_enum;
|
use crate::gegl_enum;
|
||||||
|
|
||||||
gegl_enum!(
|
|
||||||
/// The abyss policy for various GEGL operations.
|
|
||||||
AbyssPolicy,
|
|
||||||
Black => "black",
|
|
||||||
Clamp => "clamp",
|
|
||||||
Loop => "loop",
|
|
||||||
None => "none",
|
|
||||||
White => "white",
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_enum!(
|
|
||||||
/// The detection algorithm for [`Edge`][super::Edge].
|
|
||||||
EdgeAlgorithm,
|
|
||||||
Differential => "differential",
|
|
||||||
Gradient => "gradient",
|
|
||||||
Laplace => "laplace",
|
|
||||||
PrewittCompass => "prewitt",
|
|
||||||
Roberts => "roberts",
|
|
||||||
Sobel => "sobel",
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_enum!(
|
gegl_enum!(
|
||||||
/// The shape for [`FocusBlur`][super::FocusBlur].
|
/// The shape for [`FocusBlur`][super::FocusBlur].
|
||||||
FocusBlurShape,
|
FocusBlurShape,
|
||||||
|
@ -90,20 +69,6 @@ gegl_enum!(
|
||||||
WhiteOnBlack => "white-on-black",
|
WhiteOnBlack => "white-on-black",
|
||||||
);
|
);
|
||||||
|
|
||||||
gegl_enum!(
|
|
||||||
/// The spiral swirl direction for [`Spiral`][super::Spiral]
|
|
||||||
SpiralDirection,
|
|
||||||
Clockwise => "cw",
|
|
||||||
CounterClockwise => "ccw",
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_enum!(
|
|
||||||
/// The spiral type for [`Spiral`][super::Spiral]
|
|
||||||
SpiralType,
|
|
||||||
Linear => "linear",
|
|
||||||
Logarithmic => "logarithmic",
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_enum!(
|
gegl_enum!(
|
||||||
/// The sampler type for [`StereographicProjection`][super::StereographicProjection].
|
/// The sampler type for [`StereographicProjection`][super::StereographicProjection].
|
||||||
StereographicProjectionSamplerType,
|
StereographicProjectionSamplerType,
|
||||||
|
|
|
@ -111,32 +111,6 @@ gegl_operation!(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
gegl_operation!(
|
|
||||||
struct_name: Edge,
|
|
||||||
gegl_name: "edge",
|
|
||||||
append_crop: false,
|
|
||||||
values: (
|
|
||||||
/// The edge detection algorithm to use.
|
|
||||||
algorithm: EdgeAlgorithm, EdgeAlgorithm::Sobel,
|
|
||||||
/// The amount of edge detection to perform.
|
|
||||||
amount: f64, 2.0,
|
|
||||||
/// The edge detection border behavior.
|
|
||||||
border_behavior: AbyssPolicy, AbyssPolicy::Clamp,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_operation!(
|
|
||||||
struct_name: EdgeNeon,
|
|
||||||
gegl_name: "edge-neon",
|
|
||||||
append_crop: false,
|
|
||||||
values: (
|
|
||||||
/// Strength of effect.
|
|
||||||
amount: f64, 0.0,
|
|
||||||
/// Radius of effect in pixels.
|
|
||||||
radius: f64, 5.0,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_operation!(
|
gegl_operation!(
|
||||||
struct_name: FocusBlur,
|
struct_name: FocusBlur,
|
||||||
gegl_name: "focus-blur",
|
gegl_name: "focus-blur",
|
||||||
|
@ -415,38 +389,6 @@ gegl_operation!(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
gegl_operation!(
|
|
||||||
struct_name: Spiral,
|
|
||||||
gegl_name: "spiral",
|
|
||||||
append_crop: true,
|
|
||||||
values: (
|
|
||||||
/// The area balance between the two colors.
|
|
||||||
balance: f64, 0.0,
|
|
||||||
/// The logarithmic spiral base.
|
|
||||||
base: f64, 2.0,
|
|
||||||
/// The primary color.
|
|
||||||
color1: String, "#000".to_string(),
|
|
||||||
/// The secondary color.
|
|
||||||
color2: String, "#fff".to_string(),
|
|
||||||
/// The spiral swirl direction.
|
|
||||||
direction: SpiralDirection, SpiralDirection::Clockwise,
|
|
||||||
/// The height of the generated buffer.
|
|
||||||
height: i64, 768,
|
|
||||||
/// The spiral radius.
|
|
||||||
radius: f64, 100.0,
|
|
||||||
/// The spiral rotation.
|
|
||||||
rotation: f64, 0.0,
|
|
||||||
/// The spiral type.
|
|
||||||
spiral_type: SpiralType, SpiralType::Linear,
|
|
||||||
/// The X origin coordinate.
|
|
||||||
x: f64, 0.5,
|
|
||||||
/// The Y origin coordinate.
|
|
||||||
y: f64, 0.5,
|
|
||||||
/// The width of the generated buffer.
|
|
||||||
width: i64, 1024,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
gegl_operation!(
|
gegl_operation!(
|
||||||
struct_name: StereographicProjection,
|
struct_name: StereographicProjection,
|
||||||
gegl_name: "stereographic-projection",
|
gegl_name: "stereographic-projection",
|
||||||
|
|
|
@ -11,12 +11,5 @@ pub fn all_projects() -> Vec<Project> {
|
||||||
year_2022::day_2022_03_07(),
|
year_2022::day_2022_03_07(),
|
||||||
year_2022::day_2022_03_08(),
|
year_2022::day_2022_03_08(),
|
||||||
year_2022::day_2022_03_09(),
|
year_2022::day_2022_03_09(),
|
||||||
year_2022::day_2022_03_10(),
|
|
||||||
year_2022::day_2022_03_11(),
|
|
||||||
year_2022::day_2022_03_12(),
|
|
||||||
year_2022::day_2022_03_13(),
|
|
||||||
year_2022::day_2022_03_14(),
|
|
||||||
year_2022::day_2022_03_15(),
|
|
||||||
year_2022::day_2022_03_29(),
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,291 +182,3 @@ pub fn day_2022_03_09() -> Project {
|
||||||
turn_off_alpha: true,
|
turn_off_alpha: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The project made on 2022-03-10.
|
|
||||||
pub fn day_2022_03_10() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-10".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
CellNoise::default()
|
|
||||||
.with_scale(0.5)
|
|
||||||
.with_seed(2_762_328_325.0)
|
|
||||||
.boxed(),
|
|
||||||
Newsprint::default()
|
|
||||||
.with_angle4(75.85)
|
|
||||||
.with_color_model(NewsprintColorModel::Rgb)
|
|
||||||
.with_pattern2(NewsprintPattern::Circle)
|
|
||||||
.with_pattern4(NewsprintPattern::Cross)
|
|
||||||
.with_period2(42.38)
|
|
||||||
.with_period3(0.0)
|
|
||||||
.with_period4(135.1)
|
|
||||||
.with_turbulence(0.454)
|
|
||||||
.boxed(),
|
|
||||||
Waves::default()
|
|
||||||
.with_amplitude(67.6)
|
|
||||||
.with_clamp(true)
|
|
||||||
.with_period(514.8)
|
|
||||||
.with_phi(-0.529)
|
|
||||||
.with_sampler_type(WavesSamplerType::Cubic)
|
|
||||||
.with_x(-0.25)
|
|
||||||
.with_y(-0.75)
|
|
||||||
.boxed(),
|
|
||||||
Bloom::default()
|
|
||||||
.with_radius(20.0)
|
|
||||||
.with_softness(57.0)
|
|
||||||
.with_strength(90.0)
|
|
||||||
.with_threshold(10.0)
|
|
||||||
.boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-11.
|
|
||||||
pub fn day_2022_03_11() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: true,
|
|
||||||
name: "2022-03-11".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
Plasma::default()
|
|
||||||
.with_seed(168_139_081.0)
|
|
||||||
.with_turbulence(1.5)
|
|
||||||
.with_height(2160)
|
|
||||||
.with_width(3840)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(40.0)
|
|
||||||
.with_pct_black(0.2)
|
|
||||||
.boxed(),
|
|
||||||
Waterpixels::default().with_size(64).boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(40.0)
|
|
||||||
.with_pct_black(0.2)
|
|
||||||
.boxed(),
|
|
||||||
Newsprint::default()
|
|
||||||
.with_color_model(NewsprintColorModel::Rgb)
|
|
||||||
.with_pattern2(NewsprintPattern::Circle)
|
|
||||||
.with_pattern3(NewsprintPattern::Cross)
|
|
||||||
.with_pattern4(NewsprintPattern::Circle)
|
|
||||||
.with_period2(15.0)
|
|
||||||
.with_period3(150.0)
|
|
||||||
.with_period4(30.0)
|
|
||||||
.with_turbulence(0.9)
|
|
||||||
.boxed(),
|
|
||||||
Bloom::default()
|
|
||||||
.with_radius(7.48)
|
|
||||||
.with_strength(115.29)
|
|
||||||
.with_threshold(65.88)
|
|
||||||
.boxed(),
|
|
||||||
NoisePick::default().with_repeat(5).with_seed(0.0).boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-12.
|
|
||||||
pub fn day_2022_03_12() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-12".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
DiffractionPatterns::default()
|
|
||||||
.with_brightness(0.382)
|
|
||||||
.with_polarization(0.67)
|
|
||||||
.with_scattering(53.21)
|
|
||||||
.with_height(2160)
|
|
||||||
.with_width(3840)
|
|
||||||
.boxed(),
|
|
||||||
Waterpixels::default().with_smoothness(2.0).boxed(),
|
|
||||||
EdgeNeon::default()
|
|
||||||
.with_amount(0.5)
|
|
||||||
.with_radius(3.0)
|
|
||||||
.boxed(),
|
|
||||||
Mirrors::default()
|
|
||||||
.with_o_x(0.365)
|
|
||||||
.with_o_y(0.694)
|
|
||||||
.with_trim_x(0.375)
|
|
||||||
.with_trim_y(0.375)
|
|
||||||
.boxed(),
|
|
||||||
Newsprint::default().with_turbulence(0.996).boxed(),
|
|
||||||
MedianBlur::default()
|
|
||||||
.with_neighborhood(MedianBlurNeighborhood::Diamond)
|
|
||||||
.boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-13.
|
|
||||||
pub fn day_2022_03_13() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-13".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
Plasma::default()
|
|
||||||
.with_seed(65_198_886.0)
|
|
||||||
.with_height(2160)
|
|
||||||
.with_width(3840)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(50.0)
|
|
||||||
.with_pct_black(1.0)
|
|
||||||
.boxed(),
|
|
||||||
Waterpixels::default().with_size(64).boxed(),
|
|
||||||
Oilify::default().with_mask_radius(8).boxed(),
|
|
||||||
Mirrors::default()
|
|
||||||
.with_n_segs(8)
|
|
||||||
.with_o_x(0.829)
|
|
||||||
.with_o_y(0.812)
|
|
||||||
.with_trim_x(0.325)
|
|
||||||
.with_trim_y(0.09)
|
|
||||||
.boxed(),
|
|
||||||
StereographicProjection::default().with_tilt(-73.42).boxed(),
|
|
||||||
Oilify::default().with_mask_radius(8).boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-14.
|
|
||||||
pub fn day_2022_03_14() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-14".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
DiffractionPatterns::default()
|
|
||||||
.with_height(2160)
|
|
||||||
.with_width(3840)
|
|
||||||
.boxed(),
|
|
||||||
Mirrors::default()
|
|
||||||
.with_n_segs(7)
|
|
||||||
.with_o_x(0.347)
|
|
||||||
.with_o_y(0.1)
|
|
||||||
.with_r_angle(13.0)
|
|
||||||
.with_trim_x(0.051)
|
|
||||||
.with_trim_y(0.253)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(50.0)
|
|
||||||
.with_pct_black(1.0)
|
|
||||||
.boxed(),
|
|
||||||
MedianBlur::default().with_radius(5.0).boxed(),
|
|
||||||
Edge::default()
|
|
||||||
.with_algorithm(EdgeAlgorithm::PrewittCompass)
|
|
||||||
.with_amount(10.0)
|
|
||||||
.with_border_behavior(AbyssPolicy::Clamp)
|
|
||||||
.boxed(),
|
|
||||||
MedianBlur::default().with_radius(5.0).boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-15.
|
|
||||||
pub fn day_2022_03_15() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-15".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
Spiral::default()
|
|
||||||
.with_balance(0.424)
|
|
||||||
.with_color1("#3078d2".to_string())
|
|
||||||
.with_color2("#ff00dc".to_string())
|
|
||||||
.with_direction(SpiralDirection::Clockwise)
|
|
||||||
.with_height(2160)
|
|
||||||
.with_radius(918.7)
|
|
||||||
.with_spiral_type(SpiralType::Linear)
|
|
||||||
.with_width(3840)
|
|
||||||
.with_x(0.307)
|
|
||||||
.with_y(0.542)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(50.0)
|
|
||||||
.with_pct_black(1.0)
|
|
||||||
.boxed(),
|
|
||||||
Newsprint::default()
|
|
||||||
.with_color_model(NewsprintColorModel::Rgb)
|
|
||||||
.with_pattern2(NewsprintPattern::Line)
|
|
||||||
.with_pattern3(NewsprintPattern::Diamond)
|
|
||||||
.with_pattern4(NewsprintPattern::Pssquare)
|
|
||||||
.with_period2(105.96)
|
|
||||||
.with_period3(30.46)
|
|
||||||
.with_period4(125.83)
|
|
||||||
.with_turbulence(0.182)
|
|
||||||
.boxed(),
|
|
||||||
Bloom::default()
|
|
||||||
.with_radius(2.08)
|
|
||||||
.with_softness(87.94)
|
|
||||||
.with_strength(165.29)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(50.0)
|
|
||||||
.with_pct_black(1.0)
|
|
||||||
.boxed(),
|
|
||||||
Waves::default()
|
|
||||||
.with_amplitude(65.0)
|
|
||||||
.with_clamp(true)
|
|
||||||
.with_period(500.0)
|
|
||||||
.with_phi(0.5)
|
|
||||||
.with_x(0.0)
|
|
||||||
.with_y(0.1)
|
|
||||||
.boxed(),
|
|
||||||
Mirrors::default()
|
|
||||||
.with_r_angle(30.0)
|
|
||||||
.with_n_segs(3)
|
|
||||||
.with_o_x(0.312)
|
|
||||||
.with_o_y(1.0)
|
|
||||||
.with_trim_x(0.162)
|
|
||||||
.with_trim_y(0.031)
|
|
||||||
.boxed(),
|
|
||||||
FocusBlur::default()
|
|
||||||
.with_blur_radius(5.4)
|
|
||||||
.with_blur_type(FocusBlurType::Lens)
|
|
||||||
.with_focus(0.154)
|
|
||||||
.with_highlight_factor(0.75)
|
|
||||||
.with_midpoint(0.38)
|
|
||||||
.with_radius(0.802)
|
|
||||||
.boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The project made on 2022-03-29.
|
|
||||||
pub fn day_2022_03_29() -> Project {
|
|
||||||
Project {
|
|
||||||
create_input_image: false,
|
|
||||||
name: "2022-03-29".to_string(),
|
|
||||||
operations: vec![
|
|
||||||
Plasma::default()
|
|
||||||
.with_seed(3_474_742_930.0)
|
|
||||||
.with_turbulence(2.0)
|
|
||||||
.with_height(2160)
|
|
||||||
.with_width(3840)
|
|
||||||
.boxed(),
|
|
||||||
Cartoon::default()
|
|
||||||
.with_mask_radius(50.0)
|
|
||||||
.with_pct_black(1.0)
|
|
||||||
.boxed(),
|
|
||||||
FocusBlur::default()
|
|
||||||
.with_blur_type(FocusBlurType::Lens)
|
|
||||||
.boxed(),
|
|
||||||
Mirrors::default().with_o_x(0.406).with_o_y(0.588).boxed(),
|
|
||||||
Oilify::default().with_mask_radius(8).boxed(),
|
|
||||||
Bloom::default()
|
|
||||||
.with_radius(2.08)
|
|
||||||
.with_softness(87.94)
|
|
||||||
.with_strength(165.29)
|
|
||||||
.boxed(),
|
|
||||||
],
|
|
||||||
resolution: (3840, 2160),
|
|
||||||
turn_off_alpha: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
import {
|
||||||
|
FocusBlur,
|
||||||
|
Mirrors,
|
||||||
|
Newsprint,
|
||||||
|
SimplexNoise,
|
||||||
|
Softglow,
|
||||||
|
StereographicProjection,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [1920, 1080];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-06',
|
||||||
|
operations: [
|
||||||
|
new SimplexNoise({scale: 4, seed: 2_071_140_406}),
|
||||||
|
new Newsprint({
|
||||||
|
colorModel: 'rgb',
|
||||||
|
pattern2: 'line',
|
||||||
|
period2: 200,
|
||||||
|
angle2: 15,
|
||||||
|
pattern3: 'line',
|
||||||
|
period3: 200,
|
||||||
|
angle3: 45,
|
||||||
|
pattern4: 'line',
|
||||||
|
period4: 200,
|
||||||
|
angle4: 0,
|
||||||
|
}),
|
||||||
|
new Mirrors(),
|
||||||
|
new Softglow(),
|
||||||
|
new Newsprint(),
|
||||||
|
new StereographicProjection({tilt: 123}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurType: 'gaussian',
|
||||||
|
blurRadius: 11.5,
|
||||||
|
radius: 0.9,
|
||||||
|
midpoint: 0.6,
|
||||||
|
}),
|
||||||
|
new Newsprint({
|
||||||
|
colorModel: 'rgb',
|
||||||
|
pattern2: 'diamond',
|
||||||
|
period2: 200,
|
||||||
|
angle2: 0,
|
||||||
|
pattern3: 'diamond',
|
||||||
|
period3: 200,
|
||||||
|
angle3: 35,
|
||||||
|
pattern4: 'diamond',
|
||||||
|
period4: 200,
|
||||||
|
angle4: 55,
|
||||||
|
}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurType: 'gaussian',
|
||||||
|
blurRadius: 11.5,
|
||||||
|
radius: 0.9,
|
||||||
|
midpoint: 0.6,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,68 @@
|
||||||
|
import {
|
||||||
|
Cartoon,
|
||||||
|
MedianBlur,
|
||||||
|
Mirrors,
|
||||||
|
Mosaic,
|
||||||
|
Plasma,
|
||||||
|
Waterpixels,
|
||||||
|
Waves,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [1920, 1080];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-07',
|
||||||
|
operations: [
|
||||||
|
new Plasma({
|
||||||
|
height,
|
||||||
|
seed: 2_000_111_903,
|
||||||
|
turbulence: 1,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Mosaic({
|
||||||
|
colorVariation: 1,
|
||||||
|
tileHeight: 5,
|
||||||
|
tileNeatness: 1,
|
||||||
|
tileSize: 116.53,
|
||||||
|
tileSurface: true,
|
||||||
|
tileType: 'triangles',
|
||||||
|
}),
|
||||||
|
new Waves({
|
||||||
|
amplitude: 2.9,
|
||||||
|
clamp: true,
|
||||||
|
samplerType: 'cubic',
|
||||||
|
}),
|
||||||
|
new Waves({
|
||||||
|
amplitude: 17.3,
|
||||||
|
clamp: true,
|
||||||
|
samplerType: 'cubic',
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
oX: 1,
|
||||||
|
oY: 0.353,
|
||||||
|
nSegs: 2,
|
||||||
|
}),
|
||||||
|
new Cartoon(),
|
||||||
|
new Waterpixels({
|
||||||
|
fill: 'average',
|
||||||
|
size: 32,
|
||||||
|
smoothness: 1,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
oX: 0.01,
|
||||||
|
oY: 0.01,
|
||||||
|
nSegs: 5,
|
||||||
|
rAngle: 342,
|
||||||
|
}),
|
||||||
|
new MedianBlur(),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,42 @@
|
||||||
|
import {
|
||||||
|
DiffractionPatterns,
|
||||||
|
FocusBlur,
|
||||||
|
Newsprint,
|
||||||
|
StereographicProjection,
|
||||||
|
TileSeamless,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [1920, 1080];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-08',
|
||||||
|
operations: [
|
||||||
|
new DiffractionPatterns({
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new TileSeamless(),
|
||||||
|
new StereographicProjection(),
|
||||||
|
new Newsprint({
|
||||||
|
colorModel: 'cmyk',
|
||||||
|
period: 4,
|
||||||
|
}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurRadius: 9.72,
|
||||||
|
blurType: 'lens',
|
||||||
|
focus: 0,
|
||||||
|
highlightFactor: 0.924,
|
||||||
|
radius: 1.173,
|
||||||
|
shape: 'circle',
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,60 @@
|
||||||
|
import {
|
||||||
|
FocusBlur,
|
||||||
|
Maze,
|
||||||
|
MedianBlur,
|
||||||
|
Mirrors,
|
||||||
|
Newsprint,
|
||||||
|
Oilify,
|
||||||
|
TileGlass,
|
||||||
|
TileSeamless,
|
||||||
|
Waterpixels,
|
||||||
|
Waves,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [1920, 1080];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: true,
|
||||||
|
name: '2022-03-09',
|
||||||
|
operations: [
|
||||||
|
new Maze(),
|
||||||
|
new TileGlass(),
|
||||||
|
new Waterpixels(),
|
||||||
|
new Newsprint({
|
||||||
|
angle2: -55.4,
|
||||||
|
angle3: 60.77,
|
||||||
|
angle4: 103.55,
|
||||||
|
colorModel: 'rgb',
|
||||||
|
}),
|
||||||
|
new Waves({
|
||||||
|
amplitude: 5.9,
|
||||||
|
clamp: true,
|
||||||
|
}),
|
||||||
|
new Oilify(),
|
||||||
|
new TileSeamless(),
|
||||||
|
new MedianBlur({
|
||||||
|
percentile: 2.35,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
nSegs: 3,
|
||||||
|
oX: 0.1,
|
||||||
|
oY: 0.2,
|
||||||
|
rAngle: 330,
|
||||||
|
}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurRadius: 33.57,
|
||||||
|
blurType: 'lens',
|
||||||
|
focus: 0.111,
|
||||||
|
highlightFactor: 0.529,
|
||||||
|
radius: 1.173,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: true,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,47 @@
|
||||||
|
import {Bloom, CellNoise, Newsprint, Waves} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-10',
|
||||||
|
operations: [
|
||||||
|
new CellNoise({
|
||||||
|
scale: 0.5,
|
||||||
|
seed: 2_762_328_325,
|
||||||
|
}),
|
||||||
|
new Newsprint({
|
||||||
|
angle4: 75.85,
|
||||||
|
colorModel: 'rgb',
|
||||||
|
pattern2: 'circle',
|
||||||
|
pattern4: 'cross',
|
||||||
|
period2: 42.38,
|
||||||
|
period3: 0,
|
||||||
|
period4: 135.1,
|
||||||
|
turbulence: 0.454,
|
||||||
|
}),
|
||||||
|
new Waves({
|
||||||
|
amplitude: 67.6,
|
||||||
|
clamp: true,
|
||||||
|
period: 514.8,
|
||||||
|
phi: -0.529,
|
||||||
|
samplerType: 'cubic',
|
||||||
|
x: -0.25,
|
||||||
|
y: -0.75,
|
||||||
|
}),
|
||||||
|
new Bloom({
|
||||||
|
radius: 20,
|
||||||
|
softness: 57,
|
||||||
|
strength: 90,
|
||||||
|
threshold: 10,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,61 @@
|
||||||
|
import {
|
||||||
|
Bloom,
|
||||||
|
Cartoon,
|
||||||
|
Newsprint,
|
||||||
|
NoisePick,
|
||||||
|
Plasma,
|
||||||
|
Waterpixels,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: true,
|
||||||
|
name: '2022-03-11',
|
||||||
|
operations: [
|
||||||
|
new Plasma({
|
||||||
|
seed: 168_139_081,
|
||||||
|
turbulence: 1.5,
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 40,
|
||||||
|
pctBlack: 0.2,
|
||||||
|
}),
|
||||||
|
new Waterpixels({
|
||||||
|
size: 64,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 40,
|
||||||
|
pctBlack: 0.2,
|
||||||
|
}),
|
||||||
|
new Newsprint({
|
||||||
|
colorModel: 'rgb',
|
||||||
|
pattern2: 'circle',
|
||||||
|
pattern3: 'cross',
|
||||||
|
pattern4: 'circle',
|
||||||
|
period2: 15,
|
||||||
|
period3: 150,
|
||||||
|
period4: 30,
|
||||||
|
turbulence: 0.9,
|
||||||
|
}),
|
||||||
|
new Bloom({
|
||||||
|
radius: 7.48,
|
||||||
|
strength: 115.29,
|
||||||
|
threshold: 65.88,
|
||||||
|
}),
|
||||||
|
new NoisePick({
|
||||||
|
repeat: 5,
|
||||||
|
seed: 0,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,51 @@
|
||||||
|
import {
|
||||||
|
DiffractionPatterns,
|
||||||
|
Generic,
|
||||||
|
MedianBlur,
|
||||||
|
Mirrors,
|
||||||
|
Newsprint,
|
||||||
|
Waterpixels,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-12',
|
||||||
|
operations: [
|
||||||
|
new DiffractionPatterns({
|
||||||
|
brightness: 0.382,
|
||||||
|
polarization: 0.67,
|
||||||
|
scattering: 53.21,
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Waterpixels({
|
||||||
|
smoothness: 2,
|
||||||
|
}),
|
||||||
|
new Generic('gegl:edge-neon', {
|
||||||
|
amount: 0.5,
|
||||||
|
radius: 3,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
oX: 0.365,
|
||||||
|
oY: 0.694,
|
||||||
|
trimX: 0.375,
|
||||||
|
trimY: 0.375,
|
||||||
|
}),
|
||||||
|
new Newsprint({
|
||||||
|
turbulence: 0.996,
|
||||||
|
}),
|
||||||
|
new MedianBlur({
|
||||||
|
neighborhood: 'diamond',
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,53 @@
|
||||||
|
import {
|
||||||
|
Cartoon,
|
||||||
|
Mirrors,
|
||||||
|
Oilify,
|
||||||
|
Plasma,
|
||||||
|
StereographicProjection,
|
||||||
|
Waterpixels,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-13',
|
||||||
|
operations: [
|
||||||
|
new Plasma({
|
||||||
|
seed: 65_198_886,
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 50,
|
||||||
|
pctBlack: 1,
|
||||||
|
}),
|
||||||
|
new Waterpixels({
|
||||||
|
size: 64,
|
||||||
|
}),
|
||||||
|
new Oilify({
|
||||||
|
maskRadius: 8,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
nSegs: 8,
|
||||||
|
oX: 0.829,
|
||||||
|
oY: 0.812,
|
||||||
|
trimX: 0.325,
|
||||||
|
trimY: 0.09,
|
||||||
|
}),
|
||||||
|
new StereographicProjection({
|
||||||
|
tilt: -73.42,
|
||||||
|
}),
|
||||||
|
new Oilify({
|
||||||
|
maskRadius: 8,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,51 @@
|
||||||
|
import {
|
||||||
|
Cartoon,
|
||||||
|
DiffractionPatterns,
|
||||||
|
Generic,
|
||||||
|
MedianBlur,
|
||||||
|
Mirrors,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-14',
|
||||||
|
operations: [
|
||||||
|
new DiffractionPatterns({
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
nSegs: 7,
|
||||||
|
oX: 0.347,
|
||||||
|
oY: 0.1,
|
||||||
|
rAngle: 13,
|
||||||
|
trimX: 0.051,
|
||||||
|
trimY: 0.253,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 50,
|
||||||
|
pctBlack: 1,
|
||||||
|
}),
|
||||||
|
new MedianBlur({
|
||||||
|
radius: 5,
|
||||||
|
}),
|
||||||
|
new Generic('gegl:edge', {
|
||||||
|
algorithm: 'prewitt',
|
||||||
|
amount: 10,
|
||||||
|
borderBehavior: 'clamp',
|
||||||
|
}),
|
||||||
|
new MedianBlur({
|
||||||
|
radius: 5,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,90 @@
|
||||||
|
import {
|
||||||
|
Bloom,
|
||||||
|
Cartoon,
|
||||||
|
Crop,
|
||||||
|
FocusBlur,
|
||||||
|
Generic,
|
||||||
|
Mirrors,
|
||||||
|
Newsprint,
|
||||||
|
Waves,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-15',
|
||||||
|
operations: [
|
||||||
|
new Generic('gegl:spiral', {
|
||||||
|
balance: 0.424,
|
||||||
|
color1: '#3078d2',
|
||||||
|
color2: '#ff00dc',
|
||||||
|
direction: 'cw',
|
||||||
|
height,
|
||||||
|
radius: 918.7,
|
||||||
|
type: 'linear',
|
||||||
|
width,
|
||||||
|
x: 0.307,
|
||||||
|
y: 0.542,
|
||||||
|
}),
|
||||||
|
new Crop({
|
||||||
|
height,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 50,
|
||||||
|
pctBlack: 1,
|
||||||
|
}),
|
||||||
|
new Newsprint({
|
||||||
|
colorModel: 'rgb',
|
||||||
|
pattern2: 'line',
|
||||||
|
pattern3: 'diamond',
|
||||||
|
pattern4: 'pssquare',
|
||||||
|
period2: 105.96,
|
||||||
|
period3: 30.46,
|
||||||
|
period4: 125.83,
|
||||||
|
turbulence: 0.182,
|
||||||
|
}),
|
||||||
|
new Bloom({
|
||||||
|
radius: 2.08,
|
||||||
|
softness: 87.94,
|
||||||
|
strength: 165.29,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 50,
|
||||||
|
pctBlack: 1,
|
||||||
|
}),
|
||||||
|
new Waves({
|
||||||
|
amplitude: 65,
|
||||||
|
clamp: true,
|
||||||
|
period: 500,
|
||||||
|
phi: 0.5,
|
||||||
|
x: 0,
|
||||||
|
y: 1,
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
rAngle: 30,
|
||||||
|
nSegs: 3,
|
||||||
|
oX: 0.312,
|
||||||
|
oY: 1,
|
||||||
|
trimX: 0.162,
|
||||||
|
trimY: 0.031,
|
||||||
|
}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurRadius: 5.4,
|
||||||
|
blurType: 'lens',
|
||||||
|
focus: 0.154,
|
||||||
|
highlightFactor: 0.75,
|
||||||
|
midpoint: 0.38,
|
||||||
|
radius: 0.802,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,50 @@
|
||||||
|
import {
|
||||||
|
Bloom,
|
||||||
|
Cartoon,
|
||||||
|
FocusBlur,
|
||||||
|
Mirrors,
|
||||||
|
Oilify,
|
||||||
|
Plasma,
|
||||||
|
} from '../../gegl/exports.js';
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
const [width, height] = [3840, 2160];
|
||||||
|
|
||||||
|
const project: Project = {
|
||||||
|
createInputImage: false,
|
||||||
|
name: '2022-03-29',
|
||||||
|
operations: [
|
||||||
|
new Plasma({
|
||||||
|
height,
|
||||||
|
seed: 3_474_742_930,
|
||||||
|
turbulence: 2,
|
||||||
|
width,
|
||||||
|
}),
|
||||||
|
new Cartoon({
|
||||||
|
maskRadius: 50,
|
||||||
|
pctBlack: 1,
|
||||||
|
}),
|
||||||
|
new FocusBlur({
|
||||||
|
blurType: 'lens',
|
||||||
|
}),
|
||||||
|
new Mirrors({
|
||||||
|
oX: 0.406,
|
||||||
|
oY: 0.588,
|
||||||
|
}),
|
||||||
|
new Oilify({
|
||||||
|
maskRadius: 8,
|
||||||
|
}),
|
||||||
|
new Bloom({
|
||||||
|
radius: 2.08,
|
||||||
|
softness: 87.94,
|
||||||
|
strength: 165.29,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
resetAlpha: false,
|
||||||
|
resolution: {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default project;
|
|
@ -0,0 +1,29 @@
|
||||||
|
import Project from '../../project.js';
|
||||||
|
|
||||||
|
import p2022_03_06 from './2022-03-06.js';
|
||||||
|
import p2022_03_07 from './2022-03-07.js';
|
||||||
|
import p2022_03_08 from './2022-03-08.js';
|
||||||
|
import p2022_03_09 from './2022-03-09.js';
|
||||||
|
import p2022_03_10 from './2022-03-10.js';
|
||||||
|
import p2022_03_11 from './2022-03-11.js';
|
||||||
|
import p2022_03_12 from './2022-03-12.js';
|
||||||
|
import p2022_03_13 from './2022-03-13.js';
|
||||||
|
import p2022_03_14 from './2022-03-14.js';
|
||||||
|
import p2022_03_15 from './2022-03-15.js';
|
||||||
|
import p2022_03_29 from './2022-03-29.js';
|
||||||
|
|
||||||
|
const projects: Project[] = [
|
||||||
|
p2022_03_06,
|
||||||
|
p2022_03_07,
|
||||||
|
p2022_03_08,
|
||||||
|
p2022_03_09,
|
||||||
|
p2022_03_10,
|
||||||
|
p2022_03_11,
|
||||||
|
p2022_03_12,
|
||||||
|
p2022_03_13,
|
||||||
|
p2022_03_14,
|
||||||
|
p2022_03_15,
|
||||||
|
p2022_03_29,
|
||||||
|
];
|
||||||
|
|
||||||
|
export default projects;
|
|
@ -0,0 +1,6 @@
|
||||||
|
import Project from '../project.js';
|
||||||
|
import p2022_03 from './03/projects.js';
|
||||||
|
|
||||||
|
const projects: Project[] = [...p2022_03];
|
||||||
|
|
||||||
|
export default projects;
|
|
@ -0,0 +1,39 @@
|
||||||
|
export abstract class BaseOperation<P extends {}> {
|
||||||
|
public abstract get default(): P;
|
||||||
|
|
||||||
|
public parameters: P;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some GEGL operations will run infinitely unless you limit the buffer in
|
||||||
|
* some way, so all operations must indicate whether or not they should be
|
||||||
|
* followed by a crop operation.
|
||||||
|
*/
|
||||||
|
public abstract appendCrop: boolean;
|
||||||
|
|
||||||
|
/** The GEGL operation name, starting with `gegl:`. */
|
||||||
|
public abstract name: string;
|
||||||
|
|
||||||
|
constructor(parameters: P) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public graph(includeDefaults = false): string[] {
|
||||||
|
const defaults = this.default;
|
||||||
|
const graph: string[] = [this.name];
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(this.parameters)) {
|
||||||
|
if (
|
||||||
|
!includeDefaults &&
|
||||||
|
key in defaults &&
|
||||||
|
(defaults as Record<string, any>)[key] === value
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const kebabCasedKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
|
||||||
|
graph.push(`${kebabCasedKey}=${value as string}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return graph;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface BloomParameters {
|
||||||
|
limitExposure: boolean;
|
||||||
|
radius: number;
|
||||||
|
softness: number;
|
||||||
|
strength: number;
|
||||||
|
threshold: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Bloom extends BaseOperation<BloomParameters> {
|
||||||
|
public static default: BloomParameters = {
|
||||||
|
limitExposure: false,
|
||||||
|
radius: 10,
|
||||||
|
softness: 25,
|
||||||
|
strength: 50,
|
||||||
|
threshold: 50,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Bloom.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:bloom';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<BloomParameters>) {
|
||||||
|
super({...Bloom.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface CartoonParameters {
|
||||||
|
maskRadius: number;
|
||||||
|
pctBlack: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Cartoon extends BaseOperation<CartoonParameters> {
|
||||||
|
public static default: CartoonParameters = {
|
||||||
|
maskRadius: 7,
|
||||||
|
pctBlack: 0.2,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Cartoon.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:cartoon';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<CartoonParameters>) {
|
||||||
|
super({...Cartoon.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface CellNoiseParameters {
|
||||||
|
iterations: number;
|
||||||
|
palettize: boolean;
|
||||||
|
rank: number;
|
||||||
|
scale: number;
|
||||||
|
seed: number;
|
||||||
|
shape: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class CellNoise extends BaseOperation<CellNoiseParameters> {
|
||||||
|
public static default: CellNoiseParameters = {
|
||||||
|
iterations: 1,
|
||||||
|
palettize: false,
|
||||||
|
rank: 1,
|
||||||
|
scale: 1,
|
||||||
|
seed: 0,
|
||||||
|
shape: 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return CellNoise.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:cell-noise';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<CellNoiseParameters>) {
|
||||||
|
super({...CellNoise.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface CropParameters {
|
||||||
|
height: number;
|
||||||
|
resetOrigin: boolean;
|
||||||
|
width: number;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Crop extends BaseOperation<CropParameters> {
|
||||||
|
public static default: CropParameters = {
|
||||||
|
height: 0,
|
||||||
|
resetOrigin: false,
|
||||||
|
width: 0,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Crop.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:crop';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<CropParameters>) {
|
||||||
|
super({...Crop.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface DiffractionPatternsParameters {
|
||||||
|
blueContours: number;
|
||||||
|
blueFrequency: number;
|
||||||
|
blueSedges: number;
|
||||||
|
brightness: number;
|
||||||
|
greenContours: number;
|
||||||
|
greenFrequency: number;
|
||||||
|
greenSedges: number;
|
||||||
|
height: number;
|
||||||
|
polarization: number;
|
||||||
|
redContours: number;
|
||||||
|
redFrequency: number;
|
||||||
|
redSedges: number;
|
||||||
|
scattering: number;
|
||||||
|
width: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DiffractionPatterns extends BaseOperation<DiffractionPatternsParameters> {
|
||||||
|
public static default: DiffractionPatternsParameters = {
|
||||||
|
blueContours: 0.97,
|
||||||
|
blueFrequency: 1.12,
|
||||||
|
blueSedges: 0.64,
|
||||||
|
brightness: 0.07,
|
||||||
|
greenContours: 0.82,
|
||||||
|
greenFrequency: 1.22,
|
||||||
|
greenSedges: 0.68,
|
||||||
|
height: 200,
|
||||||
|
polarization: -0.47,
|
||||||
|
redContours: 0.82,
|
||||||
|
redFrequency: 0.81,
|
||||||
|
redSedges: 0.61,
|
||||||
|
scattering: 37.13,
|
||||||
|
width: 200,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return DiffractionPatterns.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:diffraction-patterns';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<DiffractionPatternsParameters>) {
|
||||||
|
super({...DiffractionPatterns.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
export * from './base.js';
|
||||||
|
export * from './bloom.js';
|
||||||
|
export * from './cartoon.js';
|
||||||
|
export * from './cell-noise.js';
|
||||||
|
export * from './crop.js';
|
||||||
|
export * from './diffraction-patterns.js';
|
||||||
|
export * from './focus-blur.js';
|
||||||
|
export * from './generic.js';
|
||||||
|
export * from './maze.js';
|
||||||
|
export * from './median-blur.js';
|
||||||
|
export * from './mirrors.js';
|
||||||
|
export * from './mosaic.js';
|
||||||
|
export * from './newsprint.js';
|
||||||
|
export * from './noise-pick.js';
|
||||||
|
export * from './oilify.js';
|
||||||
|
export * from './plasma.js';
|
||||||
|
export * from './simplex-noise.js';
|
||||||
|
export * from './softglow.js';
|
||||||
|
export * from './stereographic-projection.js';
|
||||||
|
export * from './tile-glass.js';
|
||||||
|
export * from './tile-seamless.js';
|
||||||
|
export * from './waterpixels.js';
|
||||||
|
export * from './waves.js';
|
|
@ -0,0 +1,48 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface FocusBlurParameters {
|
||||||
|
aspectRatio: number;
|
||||||
|
blurRadius: number;
|
||||||
|
blurType: 'gaussian' | 'lens';
|
||||||
|
focus: number;
|
||||||
|
highlightFactor: number;
|
||||||
|
highlightThresholdHigh: number;
|
||||||
|
highlightThresholdLow: number;
|
||||||
|
highQuality: boolean;
|
||||||
|
midpoint: number;
|
||||||
|
radius: number;
|
||||||
|
rotation: number;
|
||||||
|
shape: 'circle' | 'square' | 'diamond' | 'horizontal' | 'vertical';
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FocusBlur extends BaseOperation<FocusBlurParameters> {
|
||||||
|
public static default: FocusBlurParameters = {
|
||||||
|
aspectRatio: 0,
|
||||||
|
blurRadius: 25,
|
||||||
|
blurType: 'gaussian',
|
||||||
|
focus: 0.25,
|
||||||
|
highlightFactor: 0,
|
||||||
|
highlightThresholdHigh: 1,
|
||||||
|
highlightThresholdLow: 0,
|
||||||
|
highQuality: false,
|
||||||
|
midpoint: 0.5,
|
||||||
|
radius: 0.75,
|
||||||
|
rotation: 0,
|
||||||
|
shape: 'circle',
|
||||||
|
x: 0.5,
|
||||||
|
y: 0.5,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return FocusBlur.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:focus-blur';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<FocusBlurParameters>) {
|
||||||
|
super({...FocusBlur.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export type GenericParameters = Record<string, number | string | boolean>;
|
||||||
|
|
||||||
|
export class Generic extends BaseOperation<GenericParameters> {
|
||||||
|
public get default() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop: boolean;
|
||||||
|
public name: string;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
name: string,
|
||||||
|
parameters?: GenericParameters,
|
||||||
|
appendCrop?: boolean,
|
||||||
|
) {
|
||||||
|
super(parameters ?? {});
|
||||||
|
this.name = name;
|
||||||
|
this.appendCrop = appendCrop ?? false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface MazeParameters {
|
||||||
|
algorithmType: 'depth-first' | 'prim';
|
||||||
|
bgColor: string;
|
||||||
|
fgColor: string;
|
||||||
|
seed: number;
|
||||||
|
tileable: boolean;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Maze extends BaseOperation<MazeParameters> {
|
||||||
|
public static default: MazeParameters = {
|
||||||
|
algorithmType: 'depth-first',
|
||||||
|
bgColor: '#fff',
|
||||||
|
fgColor: '#000',
|
||||||
|
seed: 0,
|
||||||
|
tileable: false,
|
||||||
|
x: 16,
|
||||||
|
y: 16,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Maze.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:maze';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<MazeParameters>) {
|
||||||
|
super({...Maze.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface MedianBlurParameters {
|
||||||
|
abyssPolicy: 'none' | 'clamp';
|
||||||
|
alphaPercentile: number;
|
||||||
|
highPrecision: boolean;
|
||||||
|
neighborhood: 'square' | 'circle' | 'diamond';
|
||||||
|
percentile: number;
|
||||||
|
radius: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MedianBlur extends BaseOperation<MedianBlurParameters> {
|
||||||
|
public static default: MedianBlurParameters = {
|
||||||
|
abyssPolicy: 'clamp',
|
||||||
|
alphaPercentile: 50,
|
||||||
|
highPrecision: false,
|
||||||
|
neighborhood: 'circle',
|
||||||
|
percentile: 50,
|
||||||
|
radius: 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return MedianBlur.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:median-blur';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<MedianBlurParameters>) {
|
||||||
|
super({...MedianBlur.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface MirrorsParameters {
|
||||||
|
clip: boolean;
|
||||||
|
cX: number;
|
||||||
|
cY: number;
|
||||||
|
inputScale: number;
|
||||||
|
mAngle: number;
|
||||||
|
nSegs: number;
|
||||||
|
outputScale: number;
|
||||||
|
oX: number;
|
||||||
|
oY: number;
|
||||||
|
rAngle: number;
|
||||||
|
trimX: number;
|
||||||
|
trimY: number;
|
||||||
|
warp: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Mirrors extends BaseOperation<MirrorsParameters> {
|
||||||
|
public static default: MirrorsParameters = {
|
||||||
|
clip: true,
|
||||||
|
cX: 0.5,
|
||||||
|
cY: 0.5,
|
||||||
|
inputScale: 100,
|
||||||
|
mAngle: 0,
|
||||||
|
nSegs: 6,
|
||||||
|
outputScale: 1,
|
||||||
|
oX: 0,
|
||||||
|
oY: 0,
|
||||||
|
rAngle: 0,
|
||||||
|
trimX: 0,
|
||||||
|
trimY: 0,
|
||||||
|
warp: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Mirrors.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:mirrors';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<MirrorsParameters>) {
|
||||||
|
super({...Mirrors.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface MosaicParameters {
|
||||||
|
antialiasing: boolean;
|
||||||
|
colorAveraging: boolean;
|
||||||
|
colorVariation: number;
|
||||||
|
jointsColor: string;
|
||||||
|
lightColor: string;
|
||||||
|
lightDir: number;
|
||||||
|
seed: number;
|
||||||
|
tileAllowSplit: boolean;
|
||||||
|
tileHeight: number;
|
||||||
|
tileNeatness: number;
|
||||||
|
tileSize: number;
|
||||||
|
tileSpacing: number;
|
||||||
|
tileSurface: boolean;
|
||||||
|
tileType: 'squares' | 'hexagons' | 'octagons' | 'triangles';
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Mosaic extends BaseOperation<MosaicParameters> {
|
||||||
|
public static default: MosaicParameters = {
|
||||||
|
antialiasing: true,
|
||||||
|
colorAveraging: true,
|
||||||
|
colorVariation: 0.2,
|
||||||
|
jointsColor: '#000',
|
||||||
|
lightColor: '#fff',
|
||||||
|
lightDir: 135,
|
||||||
|
seed: 0,
|
||||||
|
tileAllowSplit: true,
|
||||||
|
tileHeight: 4,
|
||||||
|
tileNeatness: 0.65,
|
||||||
|
tileSize: 15,
|
||||||
|
tileSpacing: 1,
|
||||||
|
tileSurface: false,
|
||||||
|
tileType: 'hexagons',
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Mosaic.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:mosaic';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<MosaicParameters>) {
|
||||||
|
super({...Mosaic.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
type NewsprintPattern = 'line' | 'circle' | 'diamond' | 'pssquare' | 'cross';
|
||||||
|
|
||||||
|
export interface NewsprintParameters {
|
||||||
|
aaSamples: number;
|
||||||
|
angle: number;
|
||||||
|
angle2: number;
|
||||||
|
angle3: number;
|
||||||
|
angle4: number;
|
||||||
|
angleboost: number;
|
||||||
|
blackPullout: number;
|
||||||
|
blocksize: number;
|
||||||
|
colorModel: 'black-on-white' | 'cmyk' | 'rgb' | 'white-on-black';
|
||||||
|
pattern: NewsprintPattern;
|
||||||
|
pattern2: NewsprintPattern;
|
||||||
|
pattern3: NewsprintPattern;
|
||||||
|
pattern4: NewsprintPattern;
|
||||||
|
period: number;
|
||||||
|
period2: number;
|
||||||
|
period3: number;
|
||||||
|
period4: number;
|
||||||
|
turbulence: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Newsprint extends BaseOperation<NewsprintParameters> {
|
||||||
|
public static default: NewsprintParameters = {
|
||||||
|
aaSamples: 16,
|
||||||
|
angle: 75,
|
||||||
|
angle2: 15,
|
||||||
|
angle3: 45,
|
||||||
|
angle4: 0,
|
||||||
|
angleboost: 0,
|
||||||
|
blackPullout: 1,
|
||||||
|
blocksize: -1,
|
||||||
|
colorModel: 'black-on-white',
|
||||||
|
pattern: 'line',
|
||||||
|
pattern2: 'line',
|
||||||
|
pattern3: 'line',
|
||||||
|
pattern4: 'line',
|
||||||
|
period: 12,
|
||||||
|
period2: 12,
|
||||||
|
period3: 12,
|
||||||
|
period4: 12,
|
||||||
|
turbulence: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Newsprint.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:newsprint';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<NewsprintParameters>) {
|
||||||
|
super({...Newsprint.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface NoisePickParameters {
|
||||||
|
pctRandom: number;
|
||||||
|
repeat: number;
|
||||||
|
seed: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class NoisePick extends BaseOperation<NoisePickParameters> {
|
||||||
|
public static default: NoisePickParameters = {
|
||||||
|
pctRandom: 50,
|
||||||
|
repeat: 1,
|
||||||
|
seed: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return NoisePick.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:noise-pick';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<NoisePickParameters>) {
|
||||||
|
super({...NoisePick.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface OilifyParameters {
|
||||||
|
exponent: number;
|
||||||
|
intensities: number;
|
||||||
|
maskRadius: number;
|
||||||
|
useInten: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Oilify extends BaseOperation<OilifyParameters> {
|
||||||
|
public static default: OilifyParameters = {
|
||||||
|
exponent: 8,
|
||||||
|
intensities: 128,
|
||||||
|
maskRadius: 4,
|
||||||
|
useInten: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Oilify.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:oilify';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<OilifyParameters>) {
|
||||||
|
super({...Oilify.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface PlasmaParameters {
|
||||||
|
height: number;
|
||||||
|
seed: number;
|
||||||
|
turbulence: number;
|
||||||
|
width: number;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Plasma extends BaseOperation<PlasmaParameters> {
|
||||||
|
public static default: PlasmaParameters = {
|
||||||
|
height: 768,
|
||||||
|
seed: 0,
|
||||||
|
turbulence: 1,
|
||||||
|
width: 1024,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Plasma.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:plasma';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<PlasmaParameters>) {
|
||||||
|
super({...Plasma.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface SimplexNoiseParameters {
|
||||||
|
iterations: number;
|
||||||
|
scale: number;
|
||||||
|
seed: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SimplexNoise extends BaseOperation<SimplexNoiseParameters> {
|
||||||
|
public static default: SimplexNoiseParameters = {
|
||||||
|
iterations: 1,
|
||||||
|
scale: 1,
|
||||||
|
seed: 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return SimplexNoise.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:simplex-noise';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<SimplexNoiseParameters>) {
|
||||||
|
super({...SimplexNoise.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface SoftglowParameters {
|
||||||
|
brightness: number;
|
||||||
|
glowRadius: number;
|
||||||
|
sharpness: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Softglow extends BaseOperation<SoftglowParameters> {
|
||||||
|
public static default: SoftglowParameters = {
|
||||||
|
brightness: 0.3,
|
||||||
|
glowRadius: 10,
|
||||||
|
sharpness: 0.85,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Softglow.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:softglow';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<SoftglowParameters>) {
|
||||||
|
super({...Softglow.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface StereographicProjectionParameters {
|
||||||
|
height: number;
|
||||||
|
inverse: boolean;
|
||||||
|
pan: number;
|
||||||
|
samplerType: 'nearest' | 'linear' | 'cubic' | 'nohalo' | 'lohalo';
|
||||||
|
spin: number;
|
||||||
|
tilt: number;
|
||||||
|
width: number;
|
||||||
|
zoom: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StereographicProjection extends BaseOperation<StereographicProjectionParameters> {
|
||||||
|
public static default: StereographicProjectionParameters = {
|
||||||
|
height: -1,
|
||||||
|
inverse: false,
|
||||||
|
pan: 0,
|
||||||
|
samplerType: 'nearest',
|
||||||
|
spin: 0,
|
||||||
|
tilt: 90,
|
||||||
|
width: -1,
|
||||||
|
zoom: 100,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return StereographicProjection.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:stereographic-projection';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<StereographicProjectionParameters>) {
|
||||||
|
super({...StereographicProjection.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface TileGlassParameters {
|
||||||
|
tileHeight: number;
|
||||||
|
tileWidth: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TileGlass extends BaseOperation<TileGlassParameters> {
|
||||||
|
public static default: TileGlassParameters = {
|
||||||
|
tileHeight: 25,
|
||||||
|
tileWidth: 25,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return TileGlass.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:tile-glass';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<TileGlassParameters>) {
|
||||||
|
super({...TileGlass.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export type TileSeamlessParameters = Record<string, unknown>;
|
||||||
|
|
||||||
|
export class TileSeamless extends BaseOperation<TileSeamlessParameters> {
|
||||||
|
public get default() {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:tile-seamless';
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super({});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface WaterpixelsParameters {
|
||||||
|
fill: 'average' | 'random';
|
||||||
|
regularization: number;
|
||||||
|
size: number;
|
||||||
|
smoothness: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Waterpixels extends BaseOperation<WaterpixelsParameters> {
|
||||||
|
public static default: WaterpixelsParameters = {
|
||||||
|
fill: 'average',
|
||||||
|
regularization: 0,
|
||||||
|
size: 32,
|
||||||
|
smoothness: 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Waterpixels.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = false;
|
||||||
|
public name = 'gegl:waterpixels';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<WaterpixelsParameters>) {
|
||||||
|
super({...Waterpixels.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
import {BaseOperation} from './base.js';
|
||||||
|
|
||||||
|
export interface WavesParameters {
|
||||||
|
amplitude: number;
|
||||||
|
aspect: number;
|
||||||
|
clamp: boolean;
|
||||||
|
period: number;
|
||||||
|
phi: number;
|
||||||
|
samplerType: 'nearest' | 'linear' | 'cubic' | 'nohalo' | 'lohalo';
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Waves extends BaseOperation<WavesParameters> {
|
||||||
|
public static default: WavesParameters = {
|
||||||
|
amplitude: 25,
|
||||||
|
aspect: 1,
|
||||||
|
clamp: false,
|
||||||
|
period: 100,
|
||||||
|
phi: 0,
|
||||||
|
samplerType: 'cubic',
|
||||||
|
x: 0.5,
|
||||||
|
y: 0.5,
|
||||||
|
};
|
||||||
|
|
||||||
|
public get default() {
|
||||||
|
return Waves.default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public appendCrop = true;
|
||||||
|
public name = 'gegl:waves';
|
||||||
|
|
||||||
|
constructor(parameters?: Partial<WavesParameters>) {
|
||||||
|
super({...Waves.default, ...parameters});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
import fsp from 'node:fs/promises';
|
||||||
|
import path from 'node:path';
|
||||||
|
import {performance} from 'node:perf_hooks';
|
||||||
|
|
||||||
|
import {execa} from 'execa';
|
||||||
|
import meow from 'meow';
|
||||||
|
|
||||||
|
import {Crop} from './gegl/exports.js';
|
||||||
|
import Project from './project.js';
|
||||||
|
|
||||||
|
import p2022 from './2022/projects.js';
|
||||||
|
|
||||||
|
async function main(): Promise<void> {
|
||||||
|
const cli = meow(
|
||||||
|
`
|
||||||
|
Options
|
||||||
|
--filter <name> Only render projects starting with <name>.
|
||||||
|
--include-defaults Include default GEGL operation parameters.
|
||||||
|
--no-render Don't render any images.
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
flags: {
|
||||||
|
filter: {
|
||||||
|
default: '',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
includeDefaults: {
|
||||||
|
default: false,
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
render: {
|
||||||
|
default: true,
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
importMeta: import.meta,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const includeDefaults = cli.flags.includeDefaults;
|
||||||
|
const noRender = !cli.flags.render;
|
||||||
|
|
||||||
|
const projects: Project[] = [...p2022].filter((project) =>
|
||||||
|
project.name.startsWith(cli.flags.filter),
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const {
|
||||||
|
createInputImage,
|
||||||
|
name,
|
||||||
|
operations,
|
||||||
|
resolution,
|
||||||
|
resetAlpha,
|
||||||
|
} of projects) {
|
||||||
|
const dataStart = performance.now();
|
||||||
|
const {width, height} = resolution;
|
||||||
|
|
||||||
|
const baseDir = path.resolve(`./output/${name}`);
|
||||||
|
await fsp.mkdir(baseDir, {recursive: true});
|
||||||
|
|
||||||
|
console.log(`# ${name}`);
|
||||||
|
console.log(`* ${width}x${height}`);
|
||||||
|
console.log(`* ${operations.length} operations`);
|
||||||
|
|
||||||
|
const graph = operations.flatMap((operation) => {
|
||||||
|
const graph = operation.graph(includeDefaults);
|
||||||
|
if (operation.appendCrop) {
|
||||||
|
graph.push(...new Crop({height, width}).graph(includeDefaults));
|
||||||
|
}
|
||||||
|
|
||||||
|
return graph;
|
||||||
|
});
|
||||||
|
|
||||||
|
const prettyGraph = graph.map((operation) =>
|
||||||
|
operation.startsWith('gegl:') ? `\n${operation}\n` : ` ${operation}\n`,
|
||||||
|
);
|
||||||
|
|
||||||
|
const graphFile = `${name}.txt`;
|
||||||
|
const outputFile = `${name}.png`;
|
||||||
|
const compressedFile = `${outputFile.slice(0, -4)}.jpeg`;
|
||||||
|
|
||||||
|
console.log(`* Writing ${graphFile}`);
|
||||||
|
await fsp.writeFile(
|
||||||
|
path.join(baseDir, graphFile),
|
||||||
|
prettyGraph.join('').trimStart(),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (noRender) {
|
||||||
|
console.log(`* Skipped ${outputFile}`);
|
||||||
|
} else {
|
||||||
|
const fullOutputFile = path.join(baseDir, outputFile);
|
||||||
|
if (createInputImage) {
|
||||||
|
await execa('convert', [
|
||||||
|
'-size',
|
||||||
|
`${width}x${height}`,
|
||||||
|
'xc:white',
|
||||||
|
fullOutputFile,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`* Writing ${outputFile}`);
|
||||||
|
await execa('gegl', [
|
||||||
|
...(createInputImage ? ['-i', fullOutputFile] : []),
|
||||||
|
'-o',
|
||||||
|
fullOutputFile,
|
||||||
|
'--',
|
||||||
|
...graph,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (resetAlpha) {
|
||||||
|
await execa('convert', [
|
||||||
|
fullOutputFile,
|
||||||
|
'-alpha',
|
||||||
|
'Off',
|
||||||
|
fullOutputFile,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`* Writing ${compressedFile}`);
|
||||||
|
await execa('convert', [
|
||||||
|
fullOutputFile,
|
||||||
|
'-quality',
|
||||||
|
'92',
|
||||||
|
path.join(baseDir, compressedFile),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const time = (performance.now() - dataStart).toFixed(2);
|
||||||
|
console.log(`* Generated in ${time}ms`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main();
|
|
@ -0,0 +1,12 @@
|
||||||
|
import {BaseOperation} from './gegl/exports.js';
|
||||||
|
|
||||||
|
export default interface Project {
|
||||||
|
createInputImage: boolean;
|
||||||
|
name: string;
|
||||||
|
operations: Array<InstanceType<typeof BaseOperation>>;
|
||||||
|
resetAlpha: boolean;
|
||||||
|
resolution: {
|
||||||
|
height: number;
|
||||||
|
width: number;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue