tiny_game_framework/graphics/
macro.rs

1#![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}