1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
use std::time::Duration;
use minifb::{Key, Window, WindowOptions};
mod actor;
mod basic_actors;
mod number;
mod world;
const WIDTH: usize = 1600;
const HEIGHT: usize = 900;
fn main() {
let mut buffer: Vec<u32> = vec![0; WIDTH * HEIGHT];
let mut window = Window::new(
"the Hope system",
WIDTH,
HEIGHT,
WindowOptions::default()
).unwrap();
window.limit_update_rate(Some(Duration::from_millis(16)));
// hard code this for now
let mut world = world::World::default();
let nonnegative_int = actor::Type::NumberInRange {
min: Some(number::Number::from(0)),
max: None,
};
let screen_position_type = actor::Type::Record {
name: "Screen Position".to_string(),
fields: vec![
actor::Slot { name: "X".to_string(), r#type: nonnegative_int.clone() },
actor::Slot { name: "Y".to_string(), r#type: nonnegative_int.clone() },
],
};
let system_inputs = vec![actor::Slot { name: "mouse_position".to_string(), r#type: screen_position_type.clone() }];
let u24 = actor::Type::NumberInRange {
min: Some(number::Number::from(0)),
max: Some(number::Number::from(1 << 24 - 1)),
};
let system_outputs = vec![actor::Slot { name: "screen_buffer".to_string(), r#type: actor::Type::List { contents: Box::new(u24.clone()) }}];
let mut system = actor::ProgrammableActor {
inputs: system_inputs,
outputs: system_outputs,
..Default::default()
};
let deconstruct_record = basic_actors::DeconstructRecord {
record_type: screen_position_type,
};
world.upsert_actor_type("Deconstruct Screen Position".to_string(), Box::new(deconstruct_record));
let deconstruct_record = system.add_child("Deconstruct Screen Position".to_string());
system.add_cable(
actor::ProducerSlotID::Input("mouse_position".to_string()),
actor::ConsumerSlotID::ChildInput(deconstruct_record, "Record".to_string())
);
world.upsert_actor_type("Add".to_string(), Box::new(basic_actors::Add));
let add = system.add_child("Add".to_string());
system.add_cable(
actor::ProducerSlotID::ChildOutput(deconstruct_record, "X".to_string()),
actor::ConsumerSlotID::ChildInput(add, "N1".to_string())
);
system.add_cable(
actor::ProducerSlotID::ChildOutput(deconstruct_record, "Y".to_string()),
actor::ConsumerSlotID::ChildInput(add, "N2".to_string())
);
let buffer_size_constant = basic_actors::Constant {
r#type: nonnegative_int.clone(),
value: actor::Value::Number(number::Number::from(WIDTH * HEIGHT)),
};
world.upsert_actor_type("Buffer Size Constant".to_string(), Box::new(buffer_size_constant));
let buffer_size_constant = system.add_child("Buffer Size Constant".to_string());
let repeat_u24 = basic_actors::RepeatValue {
r#type: u24,
};
world.upsert_actor_type("Repeat u24".to_string(), Box::new(repeat_u24));
let repeat_u24 = system.add_child("Repeat u24".to_string());
system.add_cable(
actor::ProducerSlotID::ChildOutput(add, "Result".to_string()),
actor::ConsumerSlotID::ChildInput(repeat_u24, "Value".to_string())
);
system.add_cable(
actor::ProducerSlotID::ChildOutput(buffer_size_constant, "Value".to_string()),
actor::ConsumerSlotID::ChildInput(repeat_u24, "Count".to_string())
);
system.add_cable(
actor::ProducerSlotID::ChildOutput(repeat_u24, "List".to_string()),
actor::ConsumerSlotID::Output("screen_buffer".to_string())
);
world.upsert_actor_type("System".to_string(), Box::new(system));
while window.is_open() && !window.is_key_down(Key::Escape) {
window
.update_with_buffer(&buffer, WIDTH, HEIGHT)
.unwrap();
}
}
|