diff options
| -rw-r--r-- | src/common.hpp | 22 | ||||
| -rw-r--r-- | src/game.cpp | 11 | ||||
| -rw-r--r-- | src/interface.cpp | 79 | ||||
| -rw-r--r-- | src/main.cpp | 4 | ||||
| -rw-r--r-- | src/render.cpp | 33 | ||||
| -rw-r--r-- | src/world.cpp | 21 | 
6 files changed, 101 insertions, 69 deletions
diff --git a/src/common.hpp b/src/common.hpp index a301881..ecdb549 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -9,6 +9,10 @@  #include <SFML/Graphics.hpp>  #include "math.hpp" +extern bool debug_draw_cmodels; +extern bool debug_draw_paths; +extern bool debug_draw_tile_coords; +  namespace procgen {  	class prng_t {  		uint32_t state = 0; @@ -95,11 +99,6 @@ namespace world {  	protected:  		friend render::state_t; -		typedef struct { -			v2f_t x; -			std::string text; -		} debug_t; -		std::list<debug_t> debug;  	public:  		world_t(void); @@ -177,7 +176,9 @@ namespace game {  		void start(void);  		void tick(double now); -		void debug_click(v2f_t x); +		// These are called by the interface. +		void select(rectf_t rect); +		void command(v2f_t x);  	};  } @@ -190,10 +191,15 @@ namespace interface {  			sf::Vector2f center;  			int target_zoom = 3;  			float zoom = 3.0f; -			bool dragging = false; -			sf::Vector2f drag_ref; +			bool panning = false; +			sf::Vector2f pan_ref;  		} camera; +		struct { +			bool selecting = false; +			rectf_t rect; +		} select; +  	public:  		state_t(sf::RenderWindow *window_, game::state_t *game);  		void tick(void); diff --git a/src/game.cpp b/src/game.cpp index e8c179a..f5341d1 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -125,7 +125,7 @@ public:  		render->render(&assets::human.body_idle, render_bounds, move.angle);  		render->render(&assets::human.head_idle, render_bounds, move.angle); -		if (move.moving) +		if (move.moving && debug_draw_paths)  			render->debug_path(&move.path);  	}  }; @@ -148,9 +148,14 @@ void state_t::start(void)  } -void state_t::debug_click(v2f_t x) +void state_t::select(rectf_t x)  { -	human.start_moving(x); +	 +} + +void state_t::command(v2f_t x) +{ +	  }  void state_t::tick(double now) diff --git a/src/interface.cpp b/src/interface.cpp index 0650889..d6137fd 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -8,11 +8,11 @@ state_t::state_t(sf::RenderWindow *window_, game::state_t *game_)  	game = game_;  } -static sf::Vector2f compute_drag(sf::RenderWindow *window, sf::Vector2f drag_ref) +static sf::Vector2f compute_pan(sf::RenderWindow *window, sf::Vector2f pan_ref)  {  	sf::Vector2i mouse = sf::Mouse::getPosition(*window);  	sf::Vector2f vmouse = window->mapPixelToCoords(mouse); -	return -(vmouse - drag_ref); +	return -(vmouse - pan_ref);  }  void state_t::tick(void) @@ -20,6 +20,7 @@ void state_t::tick(void)  	sf::Vector2u size;  	sf::Event event;  	sf::Vector2f view_size; +	v2f_t wmouse; // Mouse position in world space;  	size = window->getSize(); @@ -42,30 +43,46 @@ void state_t::tick(void)  	while (window->pollEvent(event)) { +		// FIXME: refactor this nested switch clusterfuck  		switch (event.type)  {  		case sf::Event::Closed:  			window->close();  			return;  		case sf::Event::MouseButtonPressed: -			if (event.mouseButton.button == 0) { -				v2f_t point = window->mapPixelToCoords( -				              sf::Vector2i(event.mouseButton.x, -				              event.mouseButton.y)); -				game->debug_click(point); -			} else if (event.mouseButton.button == 1) { -				camera.dragging = true; -				camera.drag_ref = window->mapPixelToCoords( -				                  sf::Vector2i(event.mouseButton.x, -				                  event.mouseButton.y)); +			wmouse = window->mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)); +  +			switch (event.mouseButton.button) { +			case sf::Mouse::Button::Left: +				select.selecting = true; +				select.rect[0] = wmouse; +				select.rect[1] = wmouse; +				break; + +			case sf::Mouse::Button::Middle: +				camera.panning = true; +				camera.pan_ref = wmouse; +				break; + +			default:;  			}  			break;  		case sf::Event::MouseButtonReleased: -			if (event.mouseButton.button == 1) { -				if (camera.dragging) -					camera.center += compute_drag(window, camera.drag_ref); -				camera.dragging = false; +			switch (event.mouseButton.button) { +			case sf::Mouse::Button::Left: +				if (select.selecting) +					game->select(select.rect); +				select.selecting = false; +				break; + +			case sf::Mouse::Button::Middle: +				if (camera.panning) +					camera.center += compute_pan(window, camera.pan_ref); +				camera.panning = false; +				break; + +			default:;  			}  			break; @@ -78,22 +95,36 @@ void state_t::tick(void)  			break;  		case sf::Event::KeyPressed: -			if (event.key.code == sf::Keyboard::Key::I) { -				sf::Vector2i mouse = sf::Mouse::getPosition(*window); -				sf::Vector2f vmouse = window->mapPixelToCoords(mouse); -				game->world.debug_point(vmouse); -			} -			break; +			switch (event.key.code) { +			case sf::Keyboard::Key::F1: +				debug_draw_cmodels ^= 1; +				break; + +			case sf::Keyboard::Key::F2: +				debug_draw_paths ^= 1; +				break; + +			case sf::Keyboard::Key::F3: +				debug_draw_tile_coords ^= 1; +				break; +			default:; +			}  		default:;  		}  	} -	if (camera.dragging) { -		sf::Vector2f delta = compute_drag(window, camera.drag_ref); +	if (camera.panning) { +		sf::Vector2f delta = compute_pan(window, camera.pan_ref);  		window->setView(sf::View(camera.center + delta, view_size));  	} else  		window->setView(sf::View(camera.center, view_size)); + +	// Compute this _after_ the setView above. +	wmouse = window->mapPixelToCoords(sf::Mouse::getPosition(*window)); + +	if (select.selecting) +		select.rect[1] = wmouse;  }  } // namespace interface diff --git a/src/main.cpp b/src/main.cpp index 352981c..01c1df4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,10 @@  #include "common.hpp"  #include <ctime> +bool debug_draw_cmodels = false; +bool debug_draw_paths = false; +bool debug_draw_tile_coords = false; +  uint64_t nano_clock(void)  {  	struct timespec ts; diff --git a/src/render.cpp b/src/render.cpp index 313bc4d..41bcd4b 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -29,13 +29,16 @@ static void draw_tile(sf::RenderWindow *window, v2f_t x, world::tile_t *tile,  	wot_rect.setFillColor(sf::Color::White);  	wot_rect.setOutlineColor(sf::Color::Transparent);  	window->draw(wot_rect); +	wot_rect.setTexture(NULL); -	std::stringstream ss; -	ss << "L=" << local;  -	sf::Text text(ss.str(), font, 20); -	text.setPosition(x); -	text.setScale(0.005, 0.005); -	window->draw(text); +	if (debug_draw_tile_coords) { +		std::stringstream ss; +		ss << "L=" << local;  +		sf::Text text(ss.str(), font, 20); +		text.setPosition(x); +		text.setScale(0.005, 0.005); +		window->draw(text); +	}  }  static void draw_sector(sf::RenderWindow *window, world::sector_t *sector) @@ -49,6 +52,14 @@ static void draw_sector(sf::RenderWindow *window, world::sector_t *sector)  void interface::state_t::render()  { +	if (select.selecting) { +		wot_rect.setSize(select.rect.dims()); +		wot_rect.setPosition(select.rect[0]); +		wot_rect.setFillColor(sf::Color(200, 100, 50, 100)); +		wot_rect.setOutlineThickness(0.02f); +		wot_rect.setOutlineColor(sf::Color(200, 100, 50, 255)); +		window->draw(wot_rect); +	}  }  namespace render { @@ -147,15 +158,9 @@ void state_t::render(game::state_t *game)  	for (world::entity_t *ent : ents) {  		ent->render_to(this); -		drender_entity(ent); -	} -	for (world::world_t::debug_t &debug : game->world.debug) { -		sf::Text text(debug.text, font, 20); -		text.setPosition(debug.x); -		text.setScale(0.006, 0.006); -		text.setFillColor(sf::Color::Red); -		window->draw(text); +		if (debug_draw_cmodels) +			drender_entity(ent);  	}  } diff --git a/src/world.cpp b/src/world.cpp index 2339dbf..004f03f 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -86,7 +86,6 @@ bool world_t::find_path(v2f_t src, v2f_t dst, cmodel_t *cmodel, entity_t *ignore  	path_finder_t finder;  	rectf_t bounds;  	v2f_t cmodel_dims; -	bool found;  	finder.setup_nodes(src, dst, cmodel->cflags); @@ -114,25 +113,7 @@ bool world_t::find_path(v2f_t src, v2f_t dst, cmodel_t *cmodel, entity_t *ignore  		if (ent != ignore)  			finder.eliminate_nodes(ent->cmodel.bounds); -	found = finder.find(); - -	debug.clear(); - -	for (size_t y = 0; y < finder.height; y++) -	for (size_t x = 0; x < finder.width; x++) { -		path_node_t *node = finder.nodes + y * finder.width + x; -		std::stringstream ss; - -		ss << finder.base + tile_index_t(x, y) << "\n"; -		if (node->accessible) -			ss << node->dist; -		else -			ss << "inaccessible"; - -		debug.push_back((debug_t){finder.base + tile_index_t(x, y), ss.str()}); -	} - -	if (!found) +	if (finder.find())  		return false;  	finder.export_path(path);  | 
