From 39832c7f74dfaf85adf8d549f9e9dac220af6503 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Tue, 3 May 2022 19:05:53 -0700 Subject: [PATCH] A little script to visualize how BSP works; emits a DOT graph --- bsp_visualizer.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 bsp_visualizer.py diff --git a/bsp_visualizer.py b/bsp_visualizer.py new file mode 100644 index 0000000..334ea0e --- /dev/null +++ b/bsp_visualizer.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# Eryn Wells + +import argparse +import tcod + +def parse_args(argv, *a, **kw): + parser = argparse.ArgumentParser(*a, **kw) + parser.add_argument('width', type=int) + parser.add_argument('height', type=int) + args = parser.parse_args(argv) + return args + +def main(argv): + args = parse_args(argv[1:], prog=argv[0]) + + bsp = tcod.bsp.BSP(0, 0, args.width, args.height) + bsp.split_recursive( + depth=3, + min_width=5, min_height=5, + max_vertical_ratio=1.5, max_horizontal_ratio=1.5 + ) + + node_names = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + current_node_name_index = 0 + + print('digraph {') + + for node in bsp.post_order(): + try: + node_name = getattr(node, 'viz_name') + except AttributeError: + node_name = node_names[current_node_name_index] + setattr(node, 'viz_name', node_name) + + bounds = (node.x, node.y, node.width, node.height) + print(f' {node_name} [label=\"{current_node_name_index}: {bounds}\"]') + + current_node_name_index += 1 + + if node.children: + node_name = getattr(node, 'viz_name') + left_child_name = getattr(node.children[0], 'viz_name') + right_child_name = getattr(node.children[1], 'viz_name') + print(f' {node_name} -> {left_child_name}') + print(f' {node_name} -> {right_child_name}') + + print('}') + +if __name__ == '__main__': + import sys + result = main(sys.argv) + sys.exit(0 if not result else result)