tiny_game_framework/graphics/
macro.rs1#![allow(deref_nullptr)]
2
3#[macro_export]
4macro_rules! gen_attrib_pointers {
5 ($struct_name:ident, $($index:expr => $field_name:ident: $dimension:expr),*) => {
6 $(
7 let offset = &((*std::ptr::null::<$struct_name>()).$field_name) as *const _ as *const std::ffi::c_void;
8 EnableVertexAttribArray($index);
9 VertexAttribPointer($index, $dimension, FLOAT, FALSE, std::mem::size_of::<$struct_name>() as GLsizei, offset);
10 )*
11 };
12}
13
14#[macro_export]
15macro_rules! bind_buffer {
16 ($buffer_type:expr, $buffer:expr, $data:expr) => {{
17 BindBuffer($buffer_type, $buffer);
18 let size = ($data.len() * std::mem::size_of_val(&$data[0])) as isize;
19 let data_ptr = &$data[0] as *const _ as *const std::ffi::c_void;
20 BufferData($buffer_type, size, data_ptr, STATIC_DRAW);
21 }};
22}
23
24#[macro_export]
25macro_rules! im_debug {
26 ($name:expr, $data:expr, $frame:expr) => {{
27 let name = $name;
28 let increase_indent = ['(', '{', '[', ':', ','];
29 let decrease_indent = [')', '}', ']'];
30
31 let mut result = String::new();
32 let mut indent_level = 0;
33
34 let data_str = format!("{:?}", $data);
35
36 for part in data_str.split(|c| increase_indent.contains(&c) || decrease_indent.contains(&c)) {
37 let trimmed_part = part.trim();
38 if trimmed_part.is_empty() {
39 continue;
40 }
41
42 if let Some(first_char) = trimmed_part.chars().next() {
43 if decrease_indent.contains(&first_char) && indent_level > 0 {
44 indent_level -= 1;
45 }
46 }
47
48 let indentation = " ".repeat(indent_level);
49 result.push_str(&indentation);
50 result.push_str(trimmed_part);
51 result.push_str("\n");
52
53 if let Some(last_char) = trimmed_part.chars().last() {
54 if increase_indent.contains(&last_char) {
55 indent_level += 1;
56 }
57 }
58 }
59
60 $frame.text(format!("{}:\n{}", name, result));
61 }};
62}