some progress concerning IMGUI widgets (added simple text input)
This commit is contained in:
		
							parent
							
								
									54ea3c21d4
								
							
						
					
					
						commit
						3f962163b3
					
				| @ -10,6 +10,7 @@ BEGIN_ENUM(Event) | ||||
| 	DECL_ENUM_ELEMENT(EventAccelerateStart), | ||||
| 	DECL_ENUM_ELEMENT(EventAccelerateStop), | ||||
| 	DECL_ENUM_ELEMENT(EventLevelComplete), | ||||
| 	DECL_ENUM_ELEMENT(EventChangeGameState), | ||||
| 	DECL_ENUM_ELEMENT(EventGameOver), | ||||
| 	DECL_ENUM_ELEMENT(EventShipExplode) | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "Controller.h" | ||||
| #include "AsteroidsEvents.h" | ||||
| 
 | ||||
| namespace asteroids { | ||||
| 
 | ||||
| @ -16,7 +17,16 @@ int Controller::OnInit (int argc, char *argv[]) { | ||||
| 	mBindings[SDLK_F8] = "toggleconsole"; | ||||
| 	mBindings[SDLK_F9] = "set playerspeed 5.0"; | ||||
| 
 | ||||
| 	Engine::RegisterListener (this, EventChangeGameState); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| bool Controller::OnReceiveEvent (const Engine::EventBasePtr &event) { | ||||
| 	if (event->mEventType == EventChangeGameState) { | ||||
| 		IMGUIClear(); | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -26,6 +26,7 @@ class Controller : public Engine::ControllerBase { | ||||
| 		virtual int OnInit (int argc, char* argv[]); | ||||
| 		/** \brief Registers the commands of the cnotroller */ | ||||
| 		virtual void OnRegisterCommands (); | ||||
| 		virtual bool OnReceiveEvent (const Engine::EventBasePtr &event); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -359,6 +359,15 @@ int Model::DoSaveLevel (const char* filename) { | ||||
| 	level_file.close(); | ||||
| 	return 0; | ||||
| } | ||||
| void Model::SetGameState (const unsigned int &state) { | ||||
| 	mLastGameState = mGameState; | ||||
| 
 | ||||
| 	Engine::EventBasePtr changegamestate_event (new Engine::EventBase()); | ||||
| 	changegamestate_event->mEventType = EventChangeGameState; | ||||
| 	QueueEvent (changegamestate_event); | ||||
| 
 | ||||
| 	mGameState = state; | ||||
| } | ||||
| 
 | ||||
| bool Model::OnLevelComplete() { | ||||
| 	Engine::LogMessage ("Level complete!"); | ||||
|  | ||||
| @ -17,10 +17,15 @@ class Model : public Engine::ModelBase { | ||||
| 		/** \brief Resets values from a previous game */ | ||||
| 		void OnNewGame (); | ||||
| 
 | ||||
| 		virtual void SetGameState (const unsigned int &state); | ||||
| 
 | ||||
| 		int GetPlayerLives () { return mPlayerLives; }; | ||||
| 		unsigned int GetPoints () { return mPoints; }; | ||||
| 		std::string GetPlayerName() { return mPlayerName; }; | ||||
| 		void SetPlayerName(const std::string &name) { mPlayerName = name; }; | ||||
| 		void SetPlayerName(const std::string &name) { | ||||
| 			Engine::LogDebug("new player name: %s", name.c_str()); | ||||
| 			mPlayerName = name; | ||||
| 		}; | ||||
| 
 | ||||
| 		float GetWorldWidth (); | ||||
| 		float GetWorldHeight (); | ||||
|  | ||||
| @ -33,19 +33,9 @@ void MainMenuOverlay::Init () { | ||||
| } | ||||
| 
 | ||||
| bool MainMenuOverlay::OnKeyDown (const SDL_keysym &keysym) { | ||||
| 	switch (keysym.sym) { | ||||
| 		case SDLK_ESCAPE: | ||||
| 			Engine::RunCommand ("quit"); | ||||
| 			return true; | ||||
| 		case SDLK_RETURN: | ||||
| 			GetModel()->SetGameState(GameStateEnterPlayername); | ||||
| 			return true; | ||||
| 		case SDLK_h: | ||||
| 			GetModel()->SetGameState(GameStateShowHighscore); | ||||
| 			return true; | ||||
| 		default: | ||||
| 			return true; | ||||
| 	} | ||||
| 	if (keysym.sym == SDLK_ESCAPE) | ||||
| 		Engine::RunCommand("quit"); | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| void MainMenuOverlay::Draw () { | ||||
| @ -70,16 +60,16 @@ void MainMenuOverlay::Draw () { | ||||
| 	glPushMatrix (); | ||||
| 	glLoadIdentity (); | ||||
| 
 | ||||
| //	Engine::DrawGLString ( right * 0.5 - 100, 100, "A s t e r o i d s");
 | ||||
| 
 | ||||
| 	Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180); | ||||
| 
 | ||||
| 	if (Engine::GUI::Button (1, "Start Game", right * 0.5 - 100, 200, 250, 40)) { | ||||
| 	if (Engine::GUI::Button (1, "New Game", right * 0.5 - 100, 200, 250, 40)) { | ||||
| 		GetModel()->SetGameState(GameStateEnterPlayername); | ||||
| 		GetController()->uistate.hotitem = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (Engine::GUI::Button (2, "Highscores", right * 0.5 - 100, 250, 250, 40)) { | ||||
| 		GetModel()->SetGameState(GameStateShowHighscore); | ||||
| 		GetController()->uistate.hotitem = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (Engine::GUI::Button (3, "Quit", right * 0.5 - 100, 330, 250, 40)) { | ||||
| @ -88,13 +78,6 @@ void MainMenuOverlay::Draw () { | ||||
| 
 | ||||
| 	GetView()->SelectFont("console.ttf"); | ||||
| 
 | ||||
| /*	
 | ||||
| 	// then we do the drawings
 | ||||
| 	Engine::DrawGLString ( right * 0.5 - 100, bottom * 0.5 - 8 - 32, "Main Menu"); | ||||
| 	Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8 - 16, "[Return] - Start Game"); | ||||
| 	Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, "[h]      - Show Highscore"); | ||||
| 	Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 + 8, "[Escape] - Quit"); | ||||
| */ | ||||
| 	glPopMatrix (); | ||||
| 
 | ||||
| 	glMatrixMode (GL_PROJECTION); | ||||
| @ -553,39 +536,13 @@ void EnterPlayernameOverlay::Init () { | ||||
| } | ||||
| 
 | ||||
| bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) { | ||||
| 	GetController()->EnableTextinput(true); | ||||
| 
 | ||||
| 	switch (keysym.sym) { | ||||
| 		case SDLK_ESCAPE: | ||||
| 			GetModel()->SetGameState(GameStateMainMenu); | ||||
| 			return true; | ||||
| 		case SDLK_BACKSPACE: | ||||
| 			if (mPlayerNameInput.size() > 0) | ||||
| 				mPlayerNameInput = mPlayerNameInput.substr (0, mPlayerNameInput.size() - 1 ); | ||||
| 			return true; | ||||
| 			break; | ||||
| 		case SDLK_RETURN: | ||||
| 			// If we just entered a new entry we simply show the highscore table,
 | ||||
| 			// otherwise we switch back to the main menu
 | ||||
| 			GetModel()->SetPlayerName(mPlayerNameInput); | ||||
| 			GetController()->EnableTextinput(false); | ||||
| 			GetModel()->SetGameState(GameStateRunning); | ||||
| 			return true; | ||||
| 		default: | ||||
| 			break; | ||||
| 	if (keysym.sym == SDLK_ESCAPE) { | ||||
| 		GetModel()->SetGameState(GameStateMainMenu); | ||||
| 		GetController()->uistate.hotitem = 0; | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	if (keysym.unicode) {	 | ||||
| 		if ((keysym.unicode & 0xFF80) == 0) { | ||||
| 			mPlayerNameInput += keysym.unicode & 0x7F; | ||||
| 			return true; | ||||
| 		} else { | ||||
| 			Engine::LogWarning ("Input key not supported!"); | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| void EnterPlayernameOverlay::Draw () { | ||||
| @ -611,21 +568,28 @@ void EnterPlayernameOverlay::Draw () { | ||||
| 	glLoadIdentity (); | ||||
| 
 | ||||
| 	GetView()->SelectFont("console.ttf"); | ||||
| 	float x = right * 0.5 - 100; | ||||
| 	float y = bottom * 0.5 - 8 - 128; | ||||
| 
 | ||||
| 	// then we do the drawings
 | ||||
| 	Engine::DrawGLString ( x, y, "A s t e r o i d s"); | ||||
| 	y += 30; | ||||
| 	Engine::DrawGLString ( x, y, "Enter your name: "); | ||||
| 	Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180); | ||||
| 
 | ||||
| 	std::string name_output (mPlayerNameInput); | ||||
| 	if (SDL_GetTicks() >> 9 & 1) | ||||
| 		name_output += "_"; | ||||
| 	Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250); | ||||
| 
 | ||||
| 	// Make sure we have UNICODE processing enabled!
 | ||||
| 	GetController()->EnableTextinput(true); | ||||
| 
 | ||||
| 	std::string player_name = GetModel()->GetPlayerName(); | ||||
| 	if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) { | ||||
| 		GetModel()->SetPlayerName(player_name); | ||||
| 	} | ||||
| 
 | ||||
| 	if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) { | ||||
| 		GetModel()->SetGameState(GameStateRunning); | ||||
| 	} | ||||
| 
 | ||||
| 	if (Engine::GUI::Button (5, "Back", 20, 500, 150, 40)) { | ||||
| 		GetModel()->SetGameState(GameStateMainMenu); | ||||
| 		GetController()->uistate.hotitem = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	Engine::DrawGLString ( x + 15*8, y, name_output.c_str());  | ||||
| 	Engine::DrawGLString ( x + 16, y + 16, "Press [Return] to continue."); | ||||
| 	 | ||||
| 	glPopMatrix (); | ||||
| 
 | ||||
| 	glMatrixMode (GL_PROJECTION); | ||||
|  | ||||
| @ -57,6 +57,12 @@ int ControllerBase::OnInit (int argc, char* argv[]) { | ||||
| 	uistate.activeitem = 0; | ||||
| 	uistate.hotitem = 0; | ||||
| 
 | ||||
| 	uistate.kbditem = 0; | ||||
| 	uistate.last_keysym = SDLK_CLEAR; | ||||
| 	uistate.last_unicode = 0; | ||||
| 
 | ||||
| 	uistate.lastwidget = 0; | ||||
| 
 | ||||
| 	ControllerInstance = this; | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -158,6 +164,12 @@ void ControllerBase::IMGUIFinish () { | ||||
| /** \brief Keyboard processing */ | ||||
| bool ControllerBase::OnKeyDown (const SDL_keysym &keysym) { | ||||
| 	mButtonStates.set(keysym.sym, true); | ||||
| 	uistate.last_keysym = keysym.sym; | ||||
| 
 | ||||
| 	// Only when Unicode processing is activated store the unicode value
 | ||||
| 	if (SDL_EnableUNICODE(-1)) { | ||||
| 		uistate.last_unicode = keysym.unicode; | ||||
| 	} | ||||
| 
 | ||||
| 	if (mView->mOverlayManager.SendKeyDown (keysym)) | ||||
| 		return true; | ||||
|  | ||||
| @ -16,6 +16,12 @@ class Module; | ||||
| struct UIState { | ||||
| 	int hotitem; | ||||
| 	int activeitem; | ||||
| 
 | ||||
| 	int kbditem; | ||||
| 	SDLKey last_keysym; | ||||
| 	Uint16 last_unicode; | ||||
| 
 | ||||
| 	int lastwidget; | ||||
| }; | ||||
| 
 | ||||
| /** \brief Defines the number of keys (keyboard + mous) that we can bind to.
 | ||||
| @ -67,6 +73,11 @@ class ControllerBase : public Module { | ||||
| 		void IMGUIPrepare () { | ||||
| 			uistate.hotitem = 0; | ||||
| 		} | ||||
| 		void IMGUIClear () { | ||||
| 			LogMessage ("Called IMGUIClear()"); | ||||
| 			uistate.hotitem = 0; | ||||
| 			uistate.kbditem = 0; | ||||
| 		} | ||||
| 		void IMGUIFinish (); | ||||
| 
 | ||||
| 		UIState uistate; | ||||
|  | ||||
| @ -30,6 +30,15 @@ bool regionhit (int x, int y, int w, int h) { | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| /** \brief Draws a label with a given caption at the position (vertically centered)
 | ||||
|  * | ||||
|  * This function draws the label at the horizontal x position and centers the | ||||
|  * label with regard to the height of the rendered caption. | ||||
|  * | ||||
|  * \TODO [med] The vertical alignment around the center of the vertical height | ||||
|  * of the string is rather unfortunate as different contents will be rendered | ||||
|  * at different vertical positions (e.g. "aaa" and "ggg")  | ||||
|  */ | ||||
| void Label (int id, const char* caption, int x, int y) { | ||||
| 	if (caption != NULL) { | ||||
| 		float width, height; | ||||
| @ -43,6 +52,9 @@ void Label (int id, const char* caption, int x, int y) { | ||||
| } | ||||
| 
 | ||||
| /** \brief Draws a button at the given position
 | ||||
|  * | ||||
|  * The area defined by the parameters defines the clickable area. However | ||||
|  * decorations might be drawn on a smaller or bigger area. | ||||
|  * | ||||
|  * \returns true if it was clicked | ||||
|  * | ||||
| @ -51,6 +63,8 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) { | ||||
| 	controller = EngineGetController(); | ||||
| 	assert (controller); | ||||
| 
 | ||||
| //	LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem);
 | ||||
| 
 | ||||
| 	// Check for hotness
 | ||||
| 	if (regionhit (x, y, w, h)) { | ||||
| 		controller->uistate.hotitem = id; | ||||
| @ -59,11 +73,22 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) { | ||||
| 			controller->uistate.activeitem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	// If nothing is selected
 | ||||
| 	if (controller->uistate.hotitem != 0) { | ||||
| 		controller->uistate.kbditem = controller->uistate.hotitem; | ||||
| 	} | ||||
| 
 | ||||
| 	if (controller->uistate.kbditem == 0) { | ||||
| 		controller->uistate.hotitem = id; | ||||
| 		controller->uistate.kbditem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	// Render
 | ||||
| 	glColor3f (0.2, 0.2, 0.2); | ||||
| 	DrawRect2D (x + 4, y + 4, w, h); | ||||
| 
 | ||||
| 	if (controller->uistate.hotitem == id) { | ||||
| 	if (controller->uistate.hotitem == id  | ||||
| 			|| controller->uistate.kbditem == id) { | ||||
| 		if (controller->uistate.activeitem == id) { | ||||
| 			glColor3f (0.8, 0.8, 0.8); | ||||
| 			DrawRect2D (x, y, w, h); | ||||
| @ -87,11 +112,179 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) { | ||||
| 		view->DrawGLString(x + w * 0.5 - width * 0.5, y + h * 0.5 - height * 0.5, caption); | ||||
| 	} | ||||
| 
 | ||||
| 	// Logic
 | ||||
| 	// Mouse Logic
 | ||||
| 	if (controller->GetButtonState(MouseButtonLeft) == false | ||||
| 			&& controller->uistate.hotitem == id | ||||
| 			&& controller->uistate.activeitem == id) | ||||
| 			&& controller->uistate.activeitem == id) { | ||||
| 		controller->uistate.lastwidget = id; | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
| 
 | ||||
| 	// Keyboard Logic
 | ||||
| 	if (controller->uistate.kbditem == id) { | ||||
| 		// We have to make sure, that we always clear the uistate.last_keysym
 | ||||
| 		// value, otherwise the same action might be repeated over and over.
 | ||||
| 		switch (controller->uistate.last_keysym) { | ||||
| 			case SDLK_DOWN: | ||||
| 				controller->uistate.kbditem = 0; | ||||
| 				controller->uistate.hotitem = 0; | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				break; | ||||
| 			case SDLK_UP: | ||||
| 				controller->uistate.kbditem = controller->uistate.lastwidget; | ||||
| 				controller->uistate.hotitem = controller->uistate.lastwidget; | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				break; | ||||
| 			case SDLK_RETURN: | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				// As we (probably) exit the current set of widgets, we have to clear
 | ||||
| 				// the uistate.kbditem value.
 | ||||
| 				controller->uistate.kbditem = 0; | ||||
| 				return true; | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	controller->uistate.lastwidget = id; | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /** \brief An Edit widget that allows editing of a string consisting of one line 
 | ||||
|  * | ||||
|  * \TODO [med] vertical alignment (especially of text) is a bit whacky | ||||
|  * | ||||
|  * \returns true if it was clicked | ||||
|  * | ||||
|  */ | ||||
| bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength) { | ||||
| 	controller = EngineGetController(); | ||||
| 	assert (controller); | ||||
| 
 | ||||
| 	int w = maxlength * 16; | ||||
| 	int h = 16; | ||||
| 
 | ||||
| 	// LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem); 
 | ||||
| 
 | ||||
| 	// Check for hotness
 | ||||
| 	if (regionhit (x, y, w, h)) { | ||||
| 		controller->uistate.hotitem = id; | ||||
| 		if (controller->uistate.activeitem == 0  | ||||
| 				&& controller->GetButtonState(MouseButtonLeft)) | ||||
| 			controller->uistate.activeitem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	// If nothing is selected
 | ||||
| 	if (controller->uistate.hotitem != 0) { | ||||
| 		controller->uistate.kbditem = controller->uistate.hotitem; | ||||
| 	} | ||||
| 
 | ||||
| 	if (controller->uistate.kbditem == 0) { | ||||
| 		controller->uistate.hotitem = id; | ||||
| 		controller->uistate.kbditem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	// Render
 | ||||
| 	glColor3f (0.2, 0.2, 0.2); | ||||
| 	DrawRect2D (x + 4, y + 4, w, h); | ||||
| 
 | ||||
| 	if (controller->uistate.hotitem == id  | ||||
| 			|| controller->uistate.kbditem == id) { | ||||
| 		if (controller->uistate.activeitem == id) { | ||||
| 			glColor3f (0.8, 0.8, 0.8); | ||||
| 			DrawRect2D (x, y, w, h); | ||||
| 		} else { | ||||
| 			glColor3f (0.7, 0.7, 0.7); | ||||
| 			DrawRect2D (x, y, w, h); | ||||
| 		} | ||||
| 	} else { | ||||
| 		glColor3f (0.4, 0.4, 0.4); | ||||
| 		DrawRect2D (x, y, w, h); | ||||
| 	} | ||||
| 
 | ||||
| 	// Rendering of the current value 
 | ||||
| 	float width, height; | ||||
| 	view = EngineGetView (); | ||||
| 	assert (view); | ||||
| 
 | ||||
| 	glColor3f (1., 1., 1.); | ||||
| 
 | ||||
| 	std::string text_output = text_value; | ||||
| 
 | ||||
| 	if (controller->uistate.kbditem == id && SDL_GetTicks() >> 9 & 1) | ||||
| 		text_output += "_"; | ||||
| 
 | ||||
| 	view->DrawGLStringMeasure(text_value.c_str(), &width, &height); | ||||
| 	view->DrawGLString(x + 16, y + 12, text_output.c_str()); | ||||
| 
 | ||||
| 	// Keyboard Logic
 | ||||
| 	if (controller->uistate.kbditem == id) { | ||||
| 		switch (controller->uistate.last_keysym) { | ||||
| 			case SDLK_DOWN: | ||||
| 				controller->uistate.kbditem = 0; | ||||
| 				controller->uistate.hotitem = 0; | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				break; | ||||
| 			case SDLK_UP: | ||||
| 				controller->uistate.kbditem = controller->uistate.lastwidget; | ||||
| 				controller->uistate.hotitem = controller->uistate.lastwidget; | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 			break; | ||||
| 			case SDLK_CLEAR: | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				controller->uistate.last_unicode = 0; | ||||
| 				return false; | ||||
| 				break; | ||||
| 			case SDLK_ESCAPE: | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				controller->uistate.last_unicode = 0; | ||||
| 				controller->uistate.hotitem = 0; | ||||
| 				controller->uistate.kbditem = 0; | ||||
| 				return false; | ||||
| 				break; | ||||
| 			case SDLK_RETURN: | ||||
| 				controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 				controller->uistate.last_unicode = 0; | ||||
| 				controller->uistate.hotitem = 0; | ||||
| 				controller->uistate.kbditem = 0; | ||||
| 				return true; | ||||
| 				break; | ||||
| 			case SDLK_BACKSPACE: | ||||
| 				if (text_value.size() > 0) { | ||||
| 					text_value = text_value.substr(0, text_value.size() - 1); | ||||
| 					controller->uistate.last_keysym = SDLK_CLEAR; | ||||
| 					controller->uistate.last_unicode = 0; | ||||
| 					return true; | ||||
| 				} | ||||
| 				break; | ||||
| 			default: | ||||
| 				// The raw input processing
 | ||||
| 				if (maxlength > 0 && text_value.size() < maxlength) { | ||||
| 					if (controller->uistate.last_unicode) {	 | ||||
| 						if ((controller->uistate.last_unicode & 0xFF80) == 0) { | ||||
| 							text_value += controller->uistate.last_unicode & 0x7F; | ||||
| 							controller->uistate.last_unicode = 0; | ||||
| 							return true; | ||||
| 						} else { | ||||
| 							LogWarning ("Input key not supported!"); | ||||
| 							return false; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	controller->uistate.lastwidget = id; | ||||
| 
 | ||||
| 	// Mouse Logic
 | ||||
| 	if (controller->GetButtonState(MouseButtonLeft) == false | ||||
| 			&& controller->uistate.hotitem == id | ||||
| 			&& controller->uistate.activeitem == id) { | ||||
| 		controller->uistate.kbditem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| #ifndef _IMGUICONTROLS_H | ||||
| #define _IMGUICONTROLS_H | ||||
| 
 | ||||
| #include <string> | ||||
| 
 | ||||
| namespace Engine { | ||||
| 
 | ||||
| namespace GUI { | ||||
| @ -20,6 +22,8 @@ void Label (int id, const char* caption, int x, int y); | ||||
|  */ | ||||
| bool Button (int id, const char* caption, int x, int y, int w, int h); | ||||
| 
 | ||||
| bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength); | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| }; | ||||
|  | ||||
| @ -73,7 +73,7 @@ class ModelBase : public Module { | ||||
| 		void SendEntityCollisionEvent (const unsigned int reference_entity_id, | ||||
| 				const unsigned int incidence_entity_id, float collision_time, vector3d normal); | ||||
| 
 | ||||
| 		void SetGameState (const unsigned int &state) { | ||||
| 		virtual void SetGameState (const unsigned int &state) { | ||||
| 			mLastGameState = mGameState; | ||||
| 			mGameState = state; | ||||
| 		}; | ||||
|  | ||||
| @ -146,7 +146,7 @@ void ViewBase::UpdateCamera () { | ||||
| 	mCamera->Update (); | ||||
| } | ||||
| 
 | ||||
| void ViewBase::Draw () { | ||||
| void ViewBase::PreDraw() { | ||||
| 	// Clear the screen
 | ||||
| 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
| 
 | ||||
| @ -166,7 +166,13 @@ void ViewBase::Draw () { | ||||
| 		last_fps_update = 0; | ||||
| 		frame_counter = 0; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
| 
 | ||||
| void ViewBase::Draw () { | ||||
| 	// Perform pre-Draw actions
 | ||||
| 	PreDraw (); | ||||
| 
 | ||||
| 	// Actual Drawing
 | ||||
| 	UpdateCamera (); | ||||
| 
 | ||||
| 	if (mDrawGrid) | ||||
| @ -179,7 +185,11 @@ void ViewBase::Draw () { | ||||
| 
 | ||||
| 	mOverlayManager.Draw(); | ||||
| 
 | ||||
| 	// and update the screen
 | ||||
| 	// Perform post-Draw actions
 | ||||
| 	PostDraw(); | ||||
| } | ||||
| 
 | ||||
| void ViewBase::PostDraw() { | ||||
| 	SDL_GL_SwapBuffers (); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -27,6 +27,11 @@ class ViewBase : public Module{ | ||||
| 		/** \brief Resizes the View */ | ||||
| 		void Resize (int width, int height); | ||||
| 
 | ||||
| 		/** \brief Performs actions before drawing (e.g. timer stuff) */ | ||||
| 		void PreDraw(); | ||||
| 		/** \brief Performs actions after drawing (e.g. swapping of buffers, etc.) */ | ||||
| 		void PostDraw(); | ||||
| 
 | ||||
| 		/** \brief Performs all drawing */ | ||||
| 		virtual void Draw (); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user