From efe4f0baddf10124581e4fcb88d55a52838b06a1 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Sun, 9 Sep 2012 17:51:10 +0200 Subject: Refactoring in src/common - refactored CInstanceManager and some headers - removed old headers --- src/CMakeLists.txt | 14 +++-- src/app/app.cpp | 80 +++++++++++++---------- src/app/app.h | 12 +++- src/common/error_ids.h | 3 + src/common/event.cpp | 10 +++ src/common/event.h | 52 +++------------ src/common/event_ids.h | 3 + src/common/global.h | 123 ++++++++++++++++++++++++++---------- src/common/image.h | 5 +- src/common/iman.cpp | 136 +++++++++++++--------------------------- src/common/iman.h | 108 +++++++++++++++++++++++++++---- src/common/ioutils.h | 5 +- src/common/language.h | 54 ---------------- src/common/logger.h | 14 ++--- src/common/metafile.cpp | 24 ++++--- src/common/misc.cpp | 55 ++-------------- src/common/misc.h | 59 +---------------- src/common/profile.cpp | 5 +- src/common/profile.h | 19 +++--- src/common/restext.cpp | 22 ++----- src/common/restext.h | 28 +++++---- src/common/restext_ids.h | 3 + src/common/singleton.h | 5 +- src/common/stringutils.h | 5 +- src/common/struct.h | 54 ---------------- src/graphics/engine/lightning.h | 2 +- src/graphics/engine/pyro.h | 3 +- src/physics/physics.h | 2 +- 28 files changed, 399 insertions(+), 506 deletions(-) delete mode 100644 src/common/language.h delete mode 100644 src/common/struct.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dc003b9..c41ebb0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -64,12 +64,11 @@ app/main.cpp app/system.cpp common/event.cpp common/image.cpp -common/logger.cpp common/iman.cpp -# common/metafile.cpp -# common/misc.cpp -# common/modfile.cpp -# common/profile.cpp +common/logger.cpp +common/metafile.cpp +common/misc.cpp +common/profile.cpp common/restext.cpp common/restext_strings.c common/stringutils.cpp @@ -191,7 +190,10 @@ ${PLATFORM_LIBS} CBot ) -include_directories(. ${CMAKE_CURRENT_BINARY_DIR} +include_directories( +. +.. +${CMAKE_CURRENT_BINARY_DIR} ${SDL_INCLUDE_DIR} ${SDL_IMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR} diff --git a/src/app/app.cpp b/src/app/app.cpp index 00cd13d..981146d 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -32,7 +32,7 @@ #include -template<> CApplication* CSingleton::mInstance = NULL; +template<> CApplication* CSingleton::mInstance = nullptr; //! Interval of timer called to update joystick state @@ -62,8 +62,8 @@ struct ApplicationPrivate ApplicationPrivate() { memset(¤tEvent, 0, sizeof(SDL_Event)); - surface = NULL; - joystick = NULL; + surface = nullptr; + joystick = nullptr; joystickTimer = 0; } }; @@ -76,10 +76,10 @@ CApplication::CApplication() m_iMan = new CInstanceManager(); m_eventQueue = new CEventQueue(m_iMan); - m_engine = NULL; - m_device = NULL; - m_robotMain = NULL; - m_sound = NULL; + m_engine = nullptr; + m_device = nullptr; + m_robotMain = nullptr; + m_sound = nullptr; m_keyState = 0; m_axeKey = Math::Vector(0.0f, 0.0f, 0.0f); @@ -95,19 +95,21 @@ CApplication::CApplication() m_dataPath = "./data"; + m_language = LANG_ENGLISH; + ResetKey(); } CApplication::~CApplication() { delete m_private; - m_private = NULL; + m_private = nullptr; delete m_eventQueue; - m_eventQueue = NULL; + m_eventQueue = nullptr; delete m_iMan; - m_iMan = NULL; + m_iMan = nullptr; } bool CApplication::ParseArguments(int argc, char *argv[]) @@ -218,7 +220,7 @@ bool CApplication::Create() if (! CreateVideoSurface()) return false; // dialog is in function - if (m_private->surface == NULL) + if (m_private->surface == nullptr) { m_errorMessage = std::string("SDL error while setting video mode:\n") + std::string(SDL_GetError()); @@ -269,7 +271,7 @@ bool CApplication::Create() bool CApplication::CreateVideoSurface() { const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo(); - if (videoInfo == NULL) + if (videoInfo == nullptr) { m_errorMessage = std::string("SDL error while getting video info:\n ") + std::string(SDL_GetError()); @@ -321,44 +323,44 @@ bool CApplication::CreateVideoSurface() void CApplication::Destroy() { - /*if (m_robotMain != NULL) + /*if (m_robotMain != nullptr) { delete m_robotMain; - m_robotMain = NULL; + m_robotMain = nullptr; } - if (m_sound != NULL) + if (m_sound != nullptr) { delete m_sound; - m_sound = NULL; + m_sound = nullptr; }*/ - if (m_engine != NULL) + if (m_engine != nullptr) { m_engine->Destroy(); delete m_engine; - m_engine = NULL; + m_engine = nullptr; } - if (m_device != NULL) + if (m_device != nullptr) { m_device->Destroy(); delete m_device; - m_device = NULL; + m_device = nullptr; } - if (m_private->joystick != NULL) + if (m_private->joystick != nullptr) { SDL_JoystickClose(m_private->joystick); - m_private->joystick = NULL; + m_private->joystick = nullptr; } - if (m_private->surface != NULL) + if (m_private->surface != nullptr) { SDL_FreeSurface(m_private->surface); - m_private->surface = NULL; + m_private->surface = nullptr; } IMG_Quit(); @@ -383,7 +385,7 @@ bool CApplication::ChangeVideoConfig(const Gfx::GLDeviceConfig &newConfig) return false; } - if (m_private->surface == NULL) + if (m_private->surface == nullptr) { if (! restore) { @@ -426,7 +428,7 @@ bool CApplication::OpenJoystick() return false; m_private->joystick = SDL_JoystickOpen(m_joystick.index); - if (m_private->joystick == NULL) + if (m_private->joystick == nullptr) return false; m_joystick.axisCount = SDL_JoystickNumAxes(m_private->joystick); @@ -437,7 +439,7 @@ bool CApplication::OpenJoystick() m_joyButtonState = std::vector(m_joystick.buttonCount, false); // Create a timer for polling joystick state - m_private->joystickTimer = SDL_AddTimer(JOYSTICK_TIMER_INTERVAL, JoystickTimerCallback, NULL); + m_private->joystickTimer = SDL_AddTimer(JOYSTICK_TIMER_INTERVAL, JoystickTimerCallback, nullptr); return true; } @@ -447,7 +449,7 @@ void CApplication::CloseJoystick() // Timer will remove itself automatically SDL_JoystickClose(m_private->joystick); - m_private->joystick = NULL; + m_private->joystick = nullptr; } bool CApplication::ChangeJoystick(const JoystickDevice &newJoystick) @@ -455,7 +457,7 @@ bool CApplication::ChangeJoystick(const JoystickDevice &newJoystick) if ( (newJoystick.index < 0) || (newJoystick.index >= SDL_NumJoysticks()) ) return false; - if (m_private->joystick != NULL) + if (m_private->joystick != nullptr) CloseJoystick(); return OpenJoystick(); @@ -464,7 +466,7 @@ bool CApplication::ChangeJoystick(const JoystickDevice &newJoystick) Uint32 JoystickTimerCallback(Uint32 interval, void *) { CApplication *app = CApplication::GetInstancePointer(); - if ((app == NULL) || (! app->GetJoystickEnabled())) + if ((app == nullptr) || (! app->GetJoystickEnabled())) return 0; // don't run the timer again app->UpdateJoystick(); @@ -577,7 +579,7 @@ int CApplication::Run() { bool passOn = ProcessEvent(event); - if (m_engine != NULL && passOn) + if (m_engine != nullptr && passOn) passOn = m_engine->ProcessEvent(event); if (passOn) @@ -602,11 +604,11 @@ int CApplication::Run() { passOn = ProcessEvent(event); - if (passOn && m_engine != NULL) + if (passOn && m_engine != nullptr) passOn = m_engine->ProcessEvent(event); } - /*if (passOn && m_robotMain != NULL) + /*if (passOn && m_robotMain != nullptr) m_robotMain->ProcessEvent(event); */ } @@ -814,7 +816,7 @@ VideoQueryResult CApplication::GetVideoResolutionList(std::vector -#include -#include - -#include - +#include "common/key.h" +#include "common/event_ids.h" +#include "math/point.h" class CInstanceManager; @@ -193,40 +193,8 @@ struct Event }; -/** - \enum KeyRank - \brief Slots for key assignment of user controls - */ - -// TODO: move to global.h ? - -enum KeyRank -{ - KEYRANK_LEFT = 0, - KEYRANK_RIGHT = 1, - KEYRANK_UP = 2, - KEYRANK_DOWN = 3, - KEYRANK_GUP = 4, - KEYRANK_GDOWN = 5, - KEYRANK_CAMERA = 6, - KEYRANK_DESEL = 7, - KEYRANK_ACTION = 8, - KEYRANK_NEAR = 9, - KEYRANK_AWAY = 10, - KEYRANK_NEXT = 11, - KEYRANK_HUMAN = 12, - KEYRANK_QUIT = 13, - KEYRANK_HELP = 14, - KEYRANK_PROG = 15, - KEYRANK_VISIT = 16, - KEYRANK_SPEED10 = 17, - KEYRANK_SPEED15 = 18, - KEYRANK_SPEED20 = 19, - KEYRANK_SPEED30 = 20, - KEYRANK_AIMUP = 21, - KEYRANK_AIMDOWN = 22, - KEYRANK_CBOT = 23, -}; +//! Returns an unique event type (above the standard IDs) +EventType GetUniqueEventType(); /** @@ -261,5 +229,3 @@ protected: int m_tail; int m_total; }; - - diff --git a/src/common/event_ids.h b/src/common/event_ids.h index ab235d5..1bbc9be 100644 --- a/src/common/event_ids.h +++ b/src/common/event_ids.h @@ -14,6 +14,9 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. + +// TODO: move to event.h after restext rewrite + #pragma once /** diff --git a/src/common/global.h b/src/common/global.h index 670c578..acc5b8f 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -14,53 +14,110 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// global.h +/** + * \file common/global.h + * \brief Some common, global definitions + */ #pragma once +#include "error_ids.h" -enum BuildType +/** + * \enum Language + * \brief Application language + */ +enum Language { - BUILD_FACTORY = (1<<0), // factory - BUILD_DERRICK = (1<<1), // derrick - BUILD_CONVERT = (1<<2), // converter - BUILD_RADAR = (1<<3), // radar - BUILD_ENERGY = (1<<4), // factory of cells - BUILD_NUCLEAR = (1<<5), // nuclear power plant - BUILD_STATION = (1<<6), // base station - BUILD_REPAIR = (1<<7), // repair center - BUILD_TOWER = (1<<8), // defense tower - BUILD_RESEARCH = (1<<9), // research center - BUILD_LABO = (1<<10), // laboratory - BUILD_PARA = (1<<11), // lightning protection - BUILD_INFO = (1<<12), // information terminal - BUILD_GFLAT = (1<<16), // flat floor - BUILD_FLAG = (1<<17) // puts / removes colored flag + LANG_ENGLISH = 0, + LANG_FRENCH = 1, + LANG_GERMAN = 2, + LANG_POLISH = 3 }; +/** + * \enum BuildType + * \brief Construction actions (buildings, etc.) available to user + * + * TODO: refactor + */ +enum BuildType +{ + BUILD_FACTORY = (1<<0), //! < factory + BUILD_DERRICK = (1<<1), //! < derrick + BUILD_CONVERT = (1<<2), //! < converter + BUILD_RADAR = (1<<3), //! < radar + BUILD_ENERGY = (1<<4), //! < factory of cells + BUILD_NUCLEAR = (1<<5), //! < nuclear power plant + BUILD_STATION = (1<<6), //! < base station + BUILD_REPAIR = (1<<7), //! < repair center + BUILD_TOWER = (1<<8), //! < defense tower + BUILD_RESEARCH = (1<<9), //! < research center + BUILD_LABO = (1<<10), //! < laboratory + BUILD_PARA = (1<<11), //! < lightning protection + BUILD_INFO = (1<<12), //! < information terminal + BUILD_GFLAT = (1<<16), //! < flat floor + BUILD_FLAG = (1<<17) //! < puts / removes colored flag +}; -// Do not change values ​​was because of backups (bits = ...). +/** + * \enum ResearchType + * \brief Research actions available to user + */ enum ResearchType { - RESEARCH_TANK = (1<<0), // caterpillars - RESEARCH_FLY = (1<<1), // wings - RESEARCH_CANON = (1<<2), // cannon - RESEARCH_TOWER = (1<<3), // defense tower - RESEARCH_ATOMIC = (1<<4), // nuclear - RESEARCH_THUMP = (1<<5), // thumper - RESEARCH_SHIELD = (1<<6), // shield - RESEARCH_PHAZER = (1<<7), // phazer gun - RESEARCH_iPAW = (1<<8), // legs of insects - RESEARCH_iGUN = (1<<9), // cannon of insects - RESEARCH_RECYCLER = (1<<10), // recycler - RESEARCH_SUBM = (1<<11), // submarine - RESEARCH_SNIFFER = (1<<12) // sniffer + RESEARCH_TANK = (1<<0), //! < caterpillars + RESEARCH_FLY = (1<<1), //! < wings + RESEARCH_CANON = (1<<2), //! < cannon + RESEARCH_TOWER = (1<<3), //! < defense tower + RESEARCH_ATOMIC = (1<<4), //! < nuclear + RESEARCH_THUMP = (1<<5), //! < thumper + RESEARCH_SHIELD = (1<<6), //! < shield + RESEARCH_PHAZER = (1<<7), //! < phazer gun + RESEARCH_iPAW = (1<<8), //! < legs of insects + RESEARCH_iGUN = (1<<9), //! < cannon of insects + RESEARCH_RECYCLER = (1<<10), //! < recycler + RESEARCH_SUBM = (1<<11), //! < submarine + RESEARCH_SNIFFER = (1<<12) //! < sniffer }; +/** + * \enum KeyRank + * \brief Slots for key assignment of user controls + * + * TODO: refactor + */ +enum KeyRank +{ + KEYRANK_LEFT = 0, + KEYRANK_RIGHT = 1, + KEYRANK_UP = 2, + KEYRANK_DOWN = 3, + KEYRANK_GUP = 4, + KEYRANK_GDOWN = 5, + KEYRANK_CAMERA = 6, + KEYRANK_DESEL = 7, + KEYRANK_ACTION = 8, + KEYRANK_NEAR = 9, + KEYRANK_AWAY = 10, + KEYRANK_NEXT = 11, + KEYRANK_HUMAN = 12, + KEYRANK_QUIT = 13, + KEYRANK_HELP = 14, + KEYRANK_PROG = 15, + KEYRANK_VISIT = 16, + KEYRANK_SPEED10 = 17, + KEYRANK_SPEED15 = 18, + KEYRANK_SPEED20 = 19, + KEYRANK_SPEED30 = 20, + KEYRANK_AIMUP = 21, + KEYRANK_AIMDOWN = 22, + KEYRANK_CBOT = 23, +}; + +// TODO: move to CRobotMain extern long g_id; // unique identifier extern long g_build; // constructible buildings extern long g_researchDone; // research done extern long g_researchEnable; // research available extern float g_unit; // conversion factor - - diff --git a/src/common/image.h b/src/common/image.h index 4d86d31..7588ea9 100644 --- a/src/common/image.h +++ b/src/common/image.h @@ -14,7 +14,10 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// image.h +/** + * \file common/image.h + * \brief Class for loading and saving images + */ #pragma once diff --git a/src/common/iman.cpp b/src/common/iman.cpp index 4b89ecf..e59afb1 100644 --- a/src/common/iman.cpp +++ b/src/common/iman.cpp @@ -16,12 +16,10 @@ // iman.cpp - -#include - -#include "common/struct.h" #include "common/iman.h" +#include + template<> CInstanceManager* CSingleton::mInstance = nullptr; @@ -39,139 +37,91 @@ CInstanceManager* CInstanceManager::GetInstancePointer() return mInstance; } - -// Object's constructor. - CInstanceManager::CInstanceManager() { - int i; - - for ( i=0 ; i= CLASS_MAX ) return; - if ( m_table[classType].classPointer == 0 ) return; + if (classType < 0 || classType >= CLASS_MAX) return; + if (m_table[classType].instances == nullptr) return; - free(m_table[classType].classPointer); - m_table[classType].classPointer = 0; + delete[] m_table[classType].instances; + m_table[classType].instances = nullptr; } - -// Adds a new instance of a class. - -bool CInstanceManager::AddInstance(ClassType classType, void* pointer, int max) +bool CInstanceManager::AddInstance(ManagedClassType classType, void* instance, int max) { - int i; + if (classType < 0 || classType >= CLASS_MAX) return false; - if ( classType < 0 || classType >= CLASS_MAX ) return false; - - if ( m_table[classType].classPointer == 0 ) + if (m_table[classType].instances == nullptr) { - m_table[classType].classPointer = static_cast( malloc(max*sizeof(void*)) ); - m_table[classType].totalPossible = max; - m_table[classType].totalUsed = 0; + m_table[classType].instances = new void*[max]; + m_table[classType].maxCount = max; + m_table[classType].usedCount = 0; } - if ( m_table[classType].totalUsed >= m_table[classType].totalPossible ) return false; + if (m_table[classType].usedCount >= m_table[classType].maxCount) return false; - i = m_table[classType].totalUsed++; - m_table[classType].classPointer[i] = pointer; + int i = m_table[classType].usedCount++; + m_table[classType].instances[i] = instance; return true; } -// Deletes an instance of a class. - -bool CInstanceManager::DeleteInstance(ClassType classType, void* pointer) +bool CInstanceManager::DeleteInstance(ManagedClassType classType, void* instance) { - int i; - - if ( classType < 0 || classType >= CLASS_MAX ) return false; + if (classType < 0 || classType >= CLASS_MAX) return false; - for ( i=0 ; i= CLASS_MAX ) return 0; - if ( m_table[classType].classPointer == 0 ) return 0; -#endif - if ( rank >= m_table[classType].totalUsed ) return 0; + if (classType < 0 || classType >= CLASS_MAX) return nullptr; + if (m_table[classType].instances == nullptr) return nullptr; + if (rank >= m_table[classType].usedCount) return nullptr; - return m_table[classType].classPointer[rank]; + return m_table[classType].instances[rank]; } - -// Fills holes in a table. - -void CInstanceManager::Compress(ClassType classType) +void CInstanceManager::Compress(ManagedClassType classType) { - int i, j; + if (classType < 0 || classType >= CLASS_MAX) return; - if ( classType < 0 || classType >= CLASS_MAX ) return; - - j = 0; - for ( i=0 ; i +/** + * \enum ManagedClassType + * \brief Type of class managed by CInstanceManager + */ -struct BaseClass +// TODO: remove unnecessary, refactor to singletons, move to CRobotMain, keep others? + +enum ManagedClassType { - int totalPossible; - int totalUsed; - void** classPointer; + //! CEventQueue + CLASS_EVENT = 1, + //! Ui::CInterface + CLASS_INTERFACE = 2, + //! CRobotMain + CLASS_MAIN = 3, + //! Gfx::CEngine + CLASS_ENGINE = 4, + //! Gfx::CTerrain + CLASS_TERRAIN = 5, + //! CObject + CLASS_OBJECT = 6, + //! CPhysics + CLASS_PHYSICS = 7, + //! CBrain + CLASS_BRAIN = 8, + //! Gfx::CCamera + CLASS_CAMERA = 9, + //! Gfx::CLightManager + CLASS_LIGHT = 10, + //! Gfx::CParticle + CLASS_PARTICULE = 11, + //! CAuto; TODO: remove (unused) + CLASS_AUTO = 12, + //! Ui::CDisplayText + CLASS_DISPLAYTEXT = 13, + //! Gfx::CPyro + CLASS_PYRO = 14, + //! Ui::CScript; TODO: remove (unused) + CLASS_SCRIPT = 15, + //! Gfx::CText + CLASS_TEXT = 16, + //! Ui::CStudio, Ui::CDisplayText; TODO: remove (unused) + CLASS_STUDIO = 17, + //! Gfx::CWater + CLASS_WATER = 18, + //! Gfx::CCloud; TODO: remove (unused) + CLASS_CLOUD = 19, + //! CMotion; TODO: remove (unused) + CLASS_MOTION = 20, + //! CSoundInterface + CLASS_SOUND = 21, + //! Gfx::CPlanet + CLASS_PLANET = 22, + //! CTaskManager; TODO: remove (unused) + CLASS_TASKMANAGER = 23, + //! Ui::CMainDialog; TODO: remove (unused) + CLASS_DIALOG = 24, + //! Ui::CMainMap; TODO: remove (unused) + CLASS_MAP = 25, + //! Ui::CMainShort, CMainMovie; TODO: remove (unused) + CLASS_SHORT = 26, + //! Gfx::CLightning; TODO: remove (unused) + CLASS_BLITZ = 27, + + //! Maximum (number of managed classes) + CLASS_MAX = 30 }; +/** + * \enum ManagedClassInstances + * \brief Instances of class managed by CInstanceManager + */ +struct ManagedClassInstances +{ + int maxCount; + int usedCount; + void** instances; +}; +/** + * \class CInstanceManager + * \brief Manager for instances of certain classes + * + * Instance manager (often shortened to iMan) allows to register instances of + * classes and search them. + */ class CInstanceManager : public CSingleton { public: CInstanceManager(); ~CInstanceManager(); + //! Remove all managed instances void Flush(); - void Flush(ClassType classType); - bool AddInstance(ClassType classType, void* pointer, int max=1); - bool DeleteInstance(ClassType classType, void* pointer); - void* SearchInstance(ClassType classType, int rank=0); + //! Removes instances of one type of class + void Flush(ManagedClassType classType); + //! Registers new instance of class type + bool AddInstance(ManagedClassType classType, void* instance, int max=1); + //! Deletes the registered instance of class type + bool DeleteInstance(ManagedClassType classType, void* instance); + //! Seeks a class instance of given type + void* SearchInstance(ManagedClassType classType, int rank=0); static CInstanceManager& GetInstance(); static CInstanceManager* GetInstancePointer(); protected: - void Compress(ClassType classType); + //! Fills holes in instance table + void Compress(ManagedClassType classType); protected: - BaseClass m_table[CLASS_MAX]; + ManagedClassInstances m_table[CLASS_MAX]; }; diff --git a/src/common/ioutils.h b/src/common/ioutils.h index 2a542c6..e7668eb 100644 --- a/src/common/ioutils.h +++ b/src/common/ioutils.h @@ -14,7 +14,10 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// ioutils.h +/** + * \file ioutils.h + * \brief Functions for binary I/O + */ #pragma once diff --git a/src/common/language.h b/src/common/language.h deleted file mode 100644 index 82a7235..0000000 --- a/src/common/language.h +++ /dev/null @@ -1,54 +0,0 @@ -// * This file is part of the COLOBOT source code -// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch -// * -// * This program is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with this program. If not, see http://www.gnu.org/licenses/. - -// language.h - -#pragma once - - -#define _FULL true // CoLoBoT -#define _SCHOOL false // CeeBot-A or Teen - #define _TEEN false // false for CeeBot-A, true for CeeBot-Teen - #define _EDU false - #define _PERSO false - #define _CEEBOTDEMO false -#define _NET false -#define _DEMO false // DEMO only CoLoBoT (with _Full = false)! - -#define _FRENCH false -#define _ENGLISH true -#define _GERMAN false -#define _WG false -#define _POLISH false - -#define _NEWLOOK false // false for CoLoBoT, true for all CeeBot -#define _SOUNDTRACKS false // always false since InitAudioTrackVolume crop in Vista - - -// Verifications - -#if !_FULL & !_SCHOOL & !_NET & !_DEMO --> no version chosen! -#endif - -#if _SCHOOL -#if !_EDU & !_PERSO & !_CEEBOTDEMO --> EDU or PERSO or CEEBOTDEMO? -#endif -#if _EDU & _PERSO & _CEEBOTDEMO --> EDU and PERSO and CEEBOTDEMO not at the same time!!! -#endif -#endif diff --git a/src/common/logger.h b/src/common/logger.h index fc43735..dfeeb98 100644 --- a/src/common/logger.h +++ b/src/common/logger.h @@ -14,22 +14,20 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// logger.h +/** + * \file common/logger.h + * \brief Class for logging information to file or console + */ #pragma once +#include "common/singleton.h" + #include #include #include -#include - -/** - * @file common/logger.h - * @brief Class for loggin information to file or console - */ - /** * \public diff --git a/src/common/metafile.cpp b/src/common/metafile.cpp index 9d54f78..d1692ce 100644 --- a/src/common/metafile.cpp +++ b/src/common/metafile.cpp @@ -16,17 +16,15 @@ // metafile.cpp - -#include -#include - -#include "common/language.h" #include "common/metafile.h" +#include +#include +#include -#if _FULL | _NET +//#if _FULL | _NET static unsigned char table_codec[23] = { 0x85, 0x91, 0x73, 0xcf, 0xa2, 0xbb, 0xf4, 0x77, @@ -44,9 +42,9 @@ void Codec(void* buffer, int len, int start) b[i] ^= table_codec[(start++)%23]; } } -#endif +//#endif -#if _SCHOOL +/*#if _SCHOOL #if _CEEBOTDEMO static unsigned char table_codec[136] = { @@ -99,9 +97,9 @@ void Codec(void* buffer, int len, int start) } } #endif -#endif +#endif*/ -#if _DEMO +/*#if _DEMO static unsigned char table_codec[27] = { 0x85, 0x91, 0x77, 0xcf, 0xa3, 0xbb, 0xf4, 0x77, @@ -120,7 +118,7 @@ void Codec(void* buffer, int len, int start) b[i] ^= table_codec[(start++)%27]; } } -#endif +#endif*/ @@ -286,7 +284,7 @@ int CMetaFile::Read(void *buffer, int size) int CMetaFile::GetByte() { - BYTE b; + int b; if ( !m_bOpen ) return 1; @@ -303,7 +301,7 @@ int CMetaFile::GetByte() int CMetaFile::GetWord() { - WORD w; + int w; if ( !m_bOpen ) return 1; diff --git a/src/common/misc.cpp b/src/common/misc.cpp index 2427356..3da8f24 100644 --- a/src/common/misc.cpp +++ b/src/common/misc.cpp @@ -17,45 +17,20 @@ // misc.cpp +#include "common/misc.h" + #include #include #include +#include #include -#include #include -#include - -#include "common/struct.h" -#include "old/d3dengine.h" -#include "old/d3dmath.h" -#include "old/d3dutil.h" -#include "common/language.h" -#include "common/event.h" -#include "common/misc.h" - -CMetaFile g_metafile; - -static EventMsg g_uniqueEventMsg = EVENT_USER; static bool g_bUserDir = false; static char g_userDir[100] = ""; - -// Gives a single user event. - -EventMsg GetUniqueEventMsg() -{ - int i; - - i = (int)g_uniqueEventMsg+1; - g_uniqueEventMsg = (EventMsg)i; - return g_uniqueEventMsg; -} - - - // Returns a non-accented letter. char RetNoAccent(char letter) @@ -311,7 +286,8 @@ bool CopyFileToTemp(char* filename) UserDir(dst, filename, "textures"); strcpy(g_userDir, save); - _mkdir("temp"); + //_mkdir("temp"); + system("mkdir temp"); if ( !Xfer(src, dst) ) return false; strcpy(filename, dst); @@ -418,24 +394,3 @@ void UserDir(char* buffer, char* dir, char* def) } *buffer = 0; } - - -// Returns the letter corresponding to the language. - -char RetLanguageLetter() -{ -#if _FRENCH - return 'F'; -#endif -#if _ENGLISH - return 'E'; -#endif -#if _GERMAN | _WG - return 'D'; -#endif -#if _POLISH - return 'P'; -#endif - return 'X'; -} - diff --git a/src/common/misc.h b/src/common/misc.h index dca801f..66da478 100644 --- a/src/common/misc.h +++ b/src/common/misc.h @@ -22,55 +22,7 @@ #include -#include "common/metafile.h" -#include "common/event.h" -#include "common/error_ids.h" - - -extern CMetaFile g_metafile; - - - -// Existing classes. - -enum ClassType -{ - CLASS_EVENT = 1, - CLASS_INTERFACE = 2, - CLASS_MAIN = 3, - CLASS_ENGINE = 4, - CLASS_TERRAIN = 5, - CLASS_OBJECT = 6, - CLASS_PHYSICS = 7, - CLASS_BRAIN = 8, - CLASS_CAMERA = 9, - CLASS_LIGHT = 10, - CLASS_PARTICULE = 11, - CLASS_AUTO = 12, - CLASS_DISPLAYTEXT = 13, - CLASS_PYRO = 14, - CLASS_SCRIPT = 15, - CLASS_TEXT = 16, - CLASS_STUDIO = 17, - CLASS_WATER = 18, - CLASS_CLOUD = 19, - CLASS_MOTION = 20, - CLASS_SOUND = 21, - CLASS_PLANET = 22, - CLASS_TASKMANAGER = 23, - CLASS_DIALOG = 24, - CLASS_MAP = 25, - CLASS_SHORT = 26, - CLASS_BLITZ = 27, -}; - -const int CLASS_MAX = 30; - - - - -// Keyboard state. - +// TODO: to be removed const int KS_PAGEUP = (1<<4); const int KS_PAGEDOWN = (1<<5); const int KS_SHIFT = (1<<6); @@ -84,10 +36,7 @@ const int KS_NUMRIGHT = (1<<13); const int KS_NUMPLUS = (1<<14); const int KS_NUMMINUS = (1<<15); - -// Procedures. - -extern EventType GetUniqueEventType(); +// TODO: rewrite/refactor or remove extern char RetNoAccent(char letter); extern char RetToUpper(char letter); @@ -100,7 +49,3 @@ extern bool CopyFileListToTemp(char* filename, int* list, int total); extern void AddExt(char* filename, char* ext); extern void UserDir(bool bUser, char* dir); extern void UserDir(char* buffer, char* dir, char* def); - -extern char RetLanguageLetter(); - - diff --git a/src/common/profile.cpp b/src/common/profile.cpp index 29a68e1..efcfa66 100644 --- a/src/common/profile.cpp +++ b/src/common/profile.cpp @@ -17,7 +17,10 @@ // profile.cpp -#include +#include "common/profile.h" + +#include +#include template<> CProfile* CSingleton::mInstance = nullptr; diff --git a/src/common/profile.h b/src/common/profile.h index 0886522..7a23d94 100644 --- a/src/common/profile.h +++ b/src/common/profile.h @@ -14,22 +14,19 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// profile.h +/** + * \file common/profile.h + * \brief Class for loading profile (currently for loading ini config file) + */ #pragma once -#include -#include -#include - -#include +#include "lib/simpleini/SimpleIni.h" -#include +#include "common/singleton.h" -/** - * @file common/profile.h - * @brief Class for loading profile (currently for loading ini config file) - */ +#include +#include /** diff --git a/src/common/restext.cpp b/src/common/restext.cpp index 487d1a6..e66c70e 100644 --- a/src/common/restext.cpp +++ b/src/common/restext.cpp @@ -14,29 +14,19 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/.// restext.cpp -#include -#include -#include "common/struct.h" -#include "common/language.h" -#include "common/misc.h" +#include "common/restext.h" + +#include "common/global.h" #include "common/event.h" -#include "object/object.h" #include "CBot/resource.h" -#include "common/restext.h" +#include "object/object.h" +#include +#include -// Gives the pointer to the engine. -static CD3DEngine* g_engine; static char g_gamerName[100]; -void SetEngine(CD3DEngine *engine) -{ - g_engine = engine; -} - -// Give the player's name. - void SetGlobalGamerName(char *name) { strcpy(g_gamerName, name); diff --git a/src/common/restext.h b/src/common/restext.h index 624803b..0dba89a 100644 --- a/src/common/restext.h +++ b/src/common/restext.h @@ -14,30 +14,32 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// restext.h +/** + * \file common/restext.h + * \brief Translation and string resource utilities + */ #pragma once +#include "common/global.h" #include "common/restext_ids.h" - -class CD3DEngine; - -// Possible types of the text resources. - +/** + * \enum ResType + * \brief Types of text resources + */ enum ResType { - RES_TEXT = 0, // RT_* - RES_EVENT = 1, // EVENT_* (EventMsg) - RES_OBJECT = 2, // OBJECT_* (ObjectType) - RES_ERR = 3, // ERR_* (Error) - RES_KEY = 4, // VK_* (keys) - RES_CBOT = 5, // TX_* (cbot.dll) + RES_TEXT = 0, //! < RT_* + RES_EVENT = 1, //! < EVENT_* (EventMsg) + RES_OBJECT = 2, //! < OBJECT_* (ObjectType) + RES_ERR = 3, //! < ERR_* (Error) + RES_KEY = 4, //! < KEY() (keys) + RES_CBOT = 5, //! < TX_* (CBot) }; -extern void SetEngine(CD3DEngine *engine); extern void SetGlobalGamerName(char *name); extern bool SearchKey(char *cmd, KeyRank &key); extern bool GetResource(ResType type, int num, char* text); diff --git a/src/common/restext_ids.h b/src/common/restext_ids.h index bee8620..4223a1c 100644 --- a/src/common/restext_ids.h +++ b/src/common/restext_ids.h @@ -14,6 +14,9 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. + +// TODO: move to restext.h after restext rewrite + #pragma once enum ResTextType diff --git a/src/common/singleton.h b/src/common/singleton.h index f631ed4..7407504 100644 --- a/src/common/singleton.h +++ b/src/common/singleton.h @@ -14,7 +14,10 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// singleton.h +/** + * \file common/singleton.h + * \brief CSingleton base class for singletons + */ #pragma once diff --git a/src/common/stringutils.h b/src/common/stringutils.h index a0cae70..064351d 100644 --- a/src/common/stringutils.h +++ b/src/common/stringutils.h @@ -14,7 +14,10 @@ // * You should have received a copy of the GNU General Public License // * along with this program. If not, see http://www.gnu.org/licenses/. -// stringutils.h +/** + * \file common/stringutils.h + * \brief Some useful string operations + */ #pragma once diff --git a/src/common/struct.h b/src/common/struct.h deleted file mode 100644 index 45ac314..0000000 --- a/src/common/struct.h +++ /dev/null @@ -1,54 +0,0 @@ -// * This file is part of the COLOBOT source code -// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch -// * -// * This program is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * This program is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with this program. If not, see http://www.gnu.org/licenses/. - -// struct.h - -#pragma once - - -#include - - -#define D3DFVF_VERTEX2 (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX2) - -struct D3DVERTEX2 -{ - float x,y,z; - float nx,ny,nz; - float tu, tv; - float tu2, tv2; - - D3DVERTEX2() { } - D3DVERTEX2(const Math::Vector& _v, const Math::Vector& _n, float _tu=0.0f, float _tv=0.0f, float _tu2=0.0f, float _tv2=0.0f) - { - x = _v.x; - y = _v.y; - z = _v.z; - nx = _n.x; - ny = _n.y; - nz = _n.z; - tu = _tu; - tv = _tv; - tu2 = _tu2; - tv2 = _tv2; - } -}; - - -struct ColorHSV -{ - float h,s,v; -}; \ No newline at end of file diff --git a/src/graphics/engine/lightning.h b/src/graphics/engine/lightning.h index e34eb3b..af389f2 100644 --- a/src/graphics/engine/lightning.h +++ b/src/graphics/engine/lightning.h @@ -22,7 +22,7 @@ #pragma once -#include "common/misc.h" +#include "common/event.h" #include "math/vector.h" diff --git a/src/graphics/engine/pyro.h b/src/graphics/engine/pyro.h index 5d2ca63..c0c0144 100644 --- a/src/graphics/engine/pyro.h +++ b/src/graphics/engine/pyro.h @@ -22,7 +22,8 @@ #pragma once -#include "common/misc.h" +#include "common/event.h" +#include "common/global.h" #include "graphics/engine/engine.h" #include "object/object.h" diff --git a/src/physics/physics.h b/src/physics/physics.h index 2e1f5eb..17cfd44 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -19,7 +19,7 @@ #pragma once -#include "common/misc.h" +#include "common/global.h" #include "object/object.h" #include "math/vector.h" -- cgit v1.2.3-1-g7c22 From 6c21dceb35f7aaf90e54d3c030130e9465f343f3 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Tue, 11 Sep 2012 21:14:32 +0200 Subject: Tests rewrite and Doxygen in src/math - rewritten tests to use new framework - updated/reformatted Doxygen - removed legacy conversions --- src/CMakeLists.txt | 1 + src/math/all.h | 2 - src/math/const.h | 1 - src/math/conv.h | 39 --------- src/math/geometry.h | 176 ++++++++++++++++++++++++++-------------- src/math/matrix.h | 73 +++++++++++------ src/math/point.h | 16 ++-- src/math/test/CMakeLists.txt | 40 ++++----- src/math/test/geometry_test.cpp | 84 +++++-------------- src/math/test/matrix_test.cpp | 124 +++++----------------------- src/math/test/vector_test.cpp | 76 ++++------------- src/math/vector.h | 35 ++++---- 12 files changed, 264 insertions(+), 403 deletions(-) delete mode 100644 src/math/conv.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c41ebb0..90489fe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ add_subdirectory(tools) # Tests add_subdirectory(graphics/engine/test) +add_subdirectory(math/test) # Configure options diff --git a/src/math/all.h b/src/math/all.h index 4ac9d55..0d067d3 100644 --- a/src/math/all.h +++ b/src/math/all.h @@ -27,5 +27,3 @@ #include "vector.h" #include "matrix.h" #include "geometry.h" - -#include "conv.h" diff --git a/src/math/const.h b/src/math/const.h index 0b6f971..3f85fee 100644 --- a/src/math/const.h +++ b/src/math/const.h @@ -51,4 +51,3 @@ const float RAD_TO_DEG = 57.29577951308232286465f; const float LOG_2 = log(2.0f); }; // namespace Math - diff --git a/src/math/conv.h b/src/math/conv.h deleted file mode 100644 index 43e6fbd..0000000 --- a/src/math/conv.h +++ /dev/null @@ -1,39 +0,0 @@ -/* math/conv.h - - Temporary conversion functions for D3DVECTOR and D3DMATRIX */ - -#pragma once - -#include - -#include "vector.h" -#include "matrix.h" - -inline D3DVECTOR VEC_TO_D3DVEC(Math::Vector vec) -{ - return D3DVECTOR(vec.x, vec.y, vec.z); -} - -inline Math::Vector D3DVEC_TO_VEC(D3DVECTOR vec) -{ - return Math::Vector(vec.x, vec.y, vec.z); -} - -inline D3DMATRIX MAT_TO_D3DMAT(Math::Matrix mat) -{ - D3DMATRIX result; - mat.Transpose(); - for (int r = 0; r < 4; ++r) - { - for (int c = 0; c < 16; ++c) - result.m[r][c] = mat.m[4*c+r]; - } - return result; -} - -inline Math::Matrix D3DMAT_TO_MAT(D3DMATRIX mat) -{ - Math::Matrix result(mat.m); - result.Transpose(); - return result; -} diff --git a/src/math/geometry.h b/src/math/geometry.h index 1c5f60f..55bc745 100644 --- a/src/math/geometry.h +++ b/src/math/geometry.h @@ -76,9 +76,11 @@ inline bool IsInsideTriangle(Math::Point a, Math::Point b, Math::Point c, Math:: } //! Rotates a point around a center -/** \a center center of rotation - \a angle angle is in radians (positive is counterclockwise (CCW) ) - \a p the point */ +/** + * \param center center of rotation + * \param angle angle [radians] (positive is CCW) + * \param p the point to be rotated + */ inline Math::Point RotatePoint(const Math::Point ¢er, float angle, const Math::Point &p) { Math::Point a; @@ -96,8 +98,10 @@ inline Math::Point RotatePoint(const Math::Point ¢er, float angle, const Mat } //! Rotates a point around the origin (0,0) -/** \a angle angle in radians (positive is counterclockwise (CCW) ) - \a p the point */ +/** + * \param angle angle [radians] (positive is CCW) + * \param p the point to be rotated + */ inline Math::Point RotatePoint(float angle, const Math::Point &p) { float x = p.x*cosf(angle) - p.y*sinf(angle); @@ -106,9 +110,11 @@ inline Math::Point RotatePoint(float angle, const Math::Point &p) return Math::Point(x, y); } -//! Rotates a vector (dist, 0). -/** \a angle angle is in radians (positive is counterclockwise (CCW) ) - \a dist distance to origin */ +//! Rotates a vector (dist, 0) +/** + * \param angle angle [radians] (positive is CCW) + * \param dist distance to origin + */ inline Math::Point RotatePoint(float angle, float dist) { float x = dist*cosf(angle); @@ -117,7 +123,12 @@ inline Math::Point RotatePoint(float angle, float dist) return Math::Point(x, y); } -//! TODO documentation +//! Rotates a point around a center on 2D plane +/** + * \param cx,cy center of rotation + * \param angle angle of rotation [radians] (positive is CCW) + * \param px,py point coordinates to rotate + */ inline void RotatePoint(float cx, float cy, float angle, float &px, float &py) { float ax, ay; @@ -132,11 +143,14 @@ inline void RotatePoint(float cx, float cy, float angle, float &px, float &py) py = cy+ay; } -//! Rotates a point around a center in space. -/** \a center center of rotation - \a angleH,angleV rotation angles in radians (positive is counterclockwise (CCW) ) ) - \a p the point - \returns the rotated point */ +//! Rotates a point around a center in space +/** + * \a angleH is rotation along Y axis (heading) while \a angleV is rotation along X axis (TODO: ?). + * + * \param center center of rotation + * \param angleH,angleV rotation angles [radians] (positive is CCW) + * \param p the point to be rotated + */ inline void RotatePoint(const Math::Vector ¢er, float angleH, float angleV, Math::Vector &p) { p.x -= center.x; @@ -151,11 +165,14 @@ inline void RotatePoint(const Math::Vector ¢er, float angleH, float angleV, p = center + b; } -//! Rotates a point around a center in space. -/** \a center center of rotation - \a angleH,angleV rotation angles in radians (positive is counterclockwise (CCW) ) ) - \a p the point - \returns the rotated point */ +//! Rotates a point around a center in space +/** + * The rotation is performed first along Y axis (\a angleH) and then along X axis (\a angleV). + * + * \param center center of rotation + * \param angleH,angleV rotation angles [radians] (positive is CCW) + * \param p the point to be rotated + */ inline void RotatePoint2(const Math::Vector center, float angleH, float angleV, Math::Vector &p) { p.x -= center.x; @@ -189,10 +206,12 @@ inline float RotateAngle(float x, float y) return -atan + 0.5f*PI; } -//! Calculates the angle between two points and one center -/** \a center the center point - \a p1,p2 the two points - \returns The angle in radians (positive is counterclockwise (CCW) ) */ +//! Calculates the angle between two points and a center +/** + * \param center the center point + * \param p1,p2 the two points + * \returns the angle [radians] (positive is CCW) + */ inline float RotateAngle(const Math::Point ¢er, const Math::Point &p1, const Math::Point &p2) { if (PointsEqual(p1, center)) @@ -215,9 +234,11 @@ inline float RotateAngle(const Math::Point ¢er, const Math::Point &p1, const } //! Loads view matrix from the given vectors -/** \a from origin - \a at view direction - \a worldUp up vector */ +/** + * \param from origin + * \param at view direction + * \param worldUp up vector + */ inline void LoadViewMatrix(Math::Matrix &mat, const Math::Vector &from, const Math::Vector &at, const Math::Vector &worldUp) { @@ -280,10 +301,12 @@ inline void LoadViewMatrix(Math::Matrix &mat, const Math::Vector &from, } //! Loads a perspective projection matrix -/** \a fov field of view in radians - \a aspect aspect ratio (width / height) - \a nearPlane distance to near cut plane - \a farPlane distance to far cut plane */ +/** + * \param fov field of view in radians + * \param aspect aspect ratio (width / height) + * \param nearPlane distance to near cut plane + * \param farPlane distance to far cut plane + */ inline void LoadProjectionMatrix(Math::Matrix &mat, float fov = Math::PI / 2.0f, float aspect = 1.0f, float nearPlane = 1.0f, float farPlane = 1000.0f) { @@ -302,9 +325,11 @@ inline void LoadProjectionMatrix(Math::Matrix &mat, float fov = Math::PI / 2.0f, } //! Loads an othogonal projection matrix -/** \a left,right coordinates for left and right vertical clipping planes - \a bottom,top coordinates for bottom and top horizontal clipping planes - \a zNear,zFar distance to nearer and farther depth clipping planes */ +/** + * \param left,right coordinates for left and right vertical clipping planes + * \param bottom,top coordinates for bottom and top horizontal clipping planes + * \param zNear,zFar distance to nearer and farther depth clipping planes + */ inline void LoadOrthoProjectionMatrix(Math::Matrix &mat, float left, float right, float bottom, float top, float zNear = -1.0f, float zFar = 1.0f) { @@ -320,7 +345,10 @@ inline void LoadOrthoProjectionMatrix(Math::Matrix &mat, float left, float right } //! Loads a translation matrix from given vector -/** \a trans vector of translation*/ +/** + * \param mat result matrix + * \param trans vector of translation + */ inline void LoadTranslationMatrix(Math::Matrix &mat, const Math::Vector &trans) { mat.LoadIdentity(); @@ -330,7 +358,10 @@ inline void LoadTranslationMatrix(Math::Matrix &mat, const Math::Vector &trans) } //! Loads a scaling matrix fom given vector -/** \a scale vector with scaling factors for X, Y, Z */ +/** + * \param mat result matrix + * \param scale vector with scaling factors for X, Y, Z + */ inline void LoadScaleMatrix(Math::Matrix &mat, const Math::Vector &scale) { mat.LoadIdentity(); @@ -340,7 +371,10 @@ inline void LoadScaleMatrix(Math::Matrix &mat, const Math::Vector &scale) } //! Loads a rotation matrix along the X axis -/** \a angle angle in radians */ +/** + * \param mat result matrix + * \param angle angle [radians] + */ inline void LoadRotationXMatrix(Math::Matrix &mat, float angle) { mat.LoadIdentity(); @@ -351,7 +385,10 @@ inline void LoadRotationXMatrix(Math::Matrix &mat, float angle) } //! Loads a rotation matrix along the Y axis -/** \a angle angle in radians */ +/** + * \param mat result matrix + * \param angle angle [radians] + */ inline void LoadRotationYMatrix(Math::Matrix &mat, float angle) { mat.LoadIdentity(); @@ -362,7 +399,10 @@ inline void LoadRotationYMatrix(Math::Matrix &mat, float angle) } //! Loads a rotation matrix along the Z axis -/** \a angle angle in radians */ +/** + * \param mat result matrix + * \param angle angle [radians] + */ inline void LoadRotationZMatrix(Math::Matrix &mat, float angle) { mat.LoadIdentity(); @@ -373,8 +413,11 @@ inline void LoadRotationZMatrix(Math::Matrix &mat, float angle) } //! Loads a rotation matrix along the given axis -/** \a dir axis of rotation - \a angle angle in radians */ +/** + * \param mat result matrix + * \param dir axis of rotation + * \param angle angle [radians] + */ inline void LoadRotationMatrix(Math::Matrix &mat, const Math::Vector &dir, float angle) { float cos = cosf(angle); @@ -397,28 +440,28 @@ inline void LoadRotationMatrix(Math::Matrix &mat, const Math::Vector &dir, float } //! Calculates the matrix to make three rotations in the order X, Z and Y -inline void LoadRotationXZYMatrix(Math::Matrix &mat, const Math::Vector &angle) +inline void LoadRotationXZYMatrix(Math::Matrix &mat, const Math::Vector &angles) { Math::Matrix temp; - LoadRotationXMatrix(temp, angle.x); + LoadRotationXMatrix(temp, angles.x); - LoadRotationZMatrix(mat, angle.z); + LoadRotationZMatrix(mat, angles.z); mat = Math::MultiplyMatrices(temp, mat); - LoadRotationYMatrix(temp, angle.y); + LoadRotationYMatrix(temp, angles.y); mat = Math::MultiplyMatrices(temp, mat); } //! Calculates the matrix to make three rotations in the order Z, X and Y -inline void LoadRotationZXYMatrix(Math::Matrix &mat, const Math::Vector &angle) +inline void LoadRotationZXYMatrix(Math::Matrix &mat, const Math::Vector &angles) { Math::Matrix temp; - LoadRotationZMatrix(temp, angle.z); + LoadRotationZMatrix(temp, angles.z); - LoadRotationXMatrix(mat, angle.x); + LoadRotationXMatrix(mat, angles.x); mat = Math::MultiplyMatrices(temp, mat); - LoadRotationYMatrix(temp, angle.y); + LoadRotationYMatrix(temp, angles.y); mat = Math::MultiplyMatrices(temp, mat); } @@ -430,7 +473,9 @@ inline float DistanceProjected(const Math::Vector &a, const Math::Vector &b) } //! Returns the normal vector to a plane -/** \param p1,p2,p3 points defining the plane */ +/** + * \param p1,p2,p3 points defining the plane + */ inline Math::Vector NormalToPlane(const Math::Vector &p1, const Math::Vector &p2, const Math::Vector &p3) { Math::Vector u = p3 - p1; @@ -440,16 +485,20 @@ inline Math::Vector NormalToPlane(const Math::Vector &p1, const Math::Vector &p2 } //! Returns a point on the line \a p1 - \a p2, in \a dist distance from \a p1 -/** \a p1,p2 line start and end - \a dist scaling factor from \a p1, relative to distance between \a p1 and \a p2 */ +/** + * \param p1,p2 line start and end + * \param dist scaling factor from \a p1, relative to distance between \a p1 and \a p2 + */ inline Math::Vector SegmentPoint(const Math::Vector &p1, const Math::Vector &p2, float dist) { return p1 + (p2 - p1) * dist; } //! Returns the distance between given point and a plane -/** \param p the point - \param a,b,c points defining the plane */ +/** + * \param p the point + * \param a,b,c points defining the plane + */ inline float DistanceToPlane(const Math::Vector &a, const Math::Vector &b, const Math::Vector &c, const Math::Vector &p) { @@ -460,8 +509,10 @@ inline float DistanceToPlane(const Math::Vector &a, const Math::Vector &b, } //! Checks if two planes defined by three points are the same -/** \a plane1 array of three vectors defining the first plane - \a plane2 array of three vectors defining the second plane */ +/** + * \param plane1 array of three vectors defining the first plane + * \param plane2 array of three vectors defining the second plane + */ inline bool IsSamePlane(const Math::Vector (&plane1)[3], const Math::Vector (&plane2)[3]) { Math::Vector n1 = NormalToPlane(plane1[0], plane1[1], plane1[2]); @@ -479,7 +530,7 @@ inline bool IsSamePlane(const Math::Vector (&plane1)[3], const Math::Vector (&pl return true; } -//! Calculates the intersection "i" right "of" the plane "abc". +//! Calculates the intersection "i" right "of" the plane "abc" (TODO: ?) inline bool Intersect(const Math::Vector &a, const Math::Vector &b, const Math::Vector &c, const Math::Vector &d, const Math::Vector &e, Math::Vector &i) { @@ -502,7 +553,7 @@ inline bool Intersect(const Math::Vector &a, const Math::Vector &b, const Math:: } //! Calculates the intersection of the straight line passing through p (x, z) -/** Line is parallel to the y axis, with the plane abc. Returns p.y. */ +/** Line is parallel to the y axis, with the plane abc. Returns p.y. (TODO: ?) */ inline bool IntersectY(const Math::Vector &a, const Math::Vector &b, const Math::Vector &c, Math::Vector &p) { float d = (b.x-a.x)*(c.z-a.z) - (c.x-a.x)*(b.z-a.z); @@ -528,15 +579,18 @@ inline Math::Vector LookatPoint(const Math::Vector &eye, float angleH, float ang return lookat; } -//! TODO documentation +//! Transforms the point \a p by matrix \a m +/** Is equal to multiplying the matrix by the vector (of course without perspective divide). */ inline Math::Vector Transform(const Math::Matrix &m, const Math::Vector &p) { return MatrixVectorMultiply(m, p); } -//! Calculates the projection of the point \a p on a straight line \a a to \a b. -/** \a p point to project - \a a,b two ends of the line */ +//! Calculates the projection of the point \a p on a straight line \a a to \a b +/** + * \param point to project + * \param a,b two ends of the line + */ inline Math::Vector Projection(const Math::Vector &a, const Math::Vector &b, const Math::Vector &p) { float k = DotProduct(b - a, p - a); diff --git a/src/math/matrix.h b/src/math/matrix.h index 30e629a..30f790c 100644 --- a/src/math/matrix.h +++ b/src/math/matrix.h @@ -33,13 +33,14 @@ namespace Math { -/** \struct Matrix math/matrix.h - \brief 4x4 matrix - - Represents an universal 4x4 matrix that can be used in OpenGL and DirectX engines. - Contains the required methods for operating on matrices (inverting, multiplying, etc.). - - The internal representation is a 16-value table in column-major order, thus: +/** + * \struct Matrix math/matrix.h + * \brief 4x4 matrix + * + * Represents an universal 4x4 matrix that can be used in OpenGL and DirectX engines. + * Contains the required methods for operating on matrices (inverting, multiplying, etc.). + * + * The internal representation is a 16-value table in column-major order, thus: \verbatim m[0 ] m[4 ] m[8 ] m[12] @@ -48,16 +49,16 @@ m[2 ] m[6 ] m[10] m[14] m[3 ] m[7 ] m[11] m[15] \endverbatim - This representation is native to OpenGL; DirectX requires transposing the matrix. - - The order of multiplication of matrix and vector is also OpenGL-native - (see the function MatrixVectorMultiply). - - All methods are made inline to maximize optimization. - - Unit tests for the structure and related functions are in module: math/test/matrix_test.cpp. - - **/ + * This representation is native to OpenGL; DirectX requires transposing the matrix. + * + * The order of multiplication of matrix and vector is also OpenGL-native + * (see the function MatrixVectorMultiply). + * + * All methods are made inline to maximize optimization. + * + * Unit tests for the structure and related functions are in module: math/test/matrix_test.cpp. + * + */ struct Matrix { //! Matrix values in column-major order @@ -78,8 +79,10 @@ struct Matrix } //! Creates the matrix from 2D array - /** The array's first index is row, second is column. - \a m array with values */ + /** + * The array's first index is row, second is column. + * \param m array with values + */ inline explicit Matrix(const float (&m)[4][4]) { for (int c = 0; c < 4; ++c) @@ -91,11 +94,23 @@ struct Matrix } } + //! Sets value in given row and col + /** + * \param row row (0 to 3) + * \param col column (0 to 3) + * \param value value + */ inline void Set(int row, int col, float value) { m[(col-1)*4+(row-1)] = value; } + //! Returns the value in given row and col + /** + * \param row row (0 to 3) + * \param col column (0 to 3) + * \returns value + */ inline float Get(int row, int col) { return m[(col-1)*4+(row-1)]; @@ -148,9 +163,11 @@ struct Matrix } //! Calculates the cofactor of the matrix - /** \a r row (0 to 3) - \a c column (0 to 3) - \returns the cofactor */ + /** + * \param r row (0 to 3) + * \param c column (0 to 3) + * \returns the cofactor + */ inline float Cofactor(int r, int c) const { assert(r >= 0 && r <= 3); @@ -330,8 +347,10 @@ struct Matrix } //! Calculates the inverse matrix - /** The determinant of the matrix must not be zero. - \returns the inverted matrix */ + /** + * The determinant of the matrix must not be zero. + * \returns the inverted matrix + */ inline Matrix Inverse() const { float d = Det(); @@ -352,8 +371,10 @@ struct Matrix } //! Calculates the multiplication of this matrix * given matrix - /** \a right right-hand matrix - \returns multiplication result */ + /** + * \param right right-hand matrix + * \returns multiplication result + */ inline Matrix Multiply(const Matrix &right) const { float result[16] = { 0.0f }; diff --git a/src/math/point.h b/src/math/point.h index ecf896f..1093c54 100644 --- a/src/math/point.h +++ b/src/math/point.h @@ -32,14 +32,14 @@ namespace Math { -/** \struct Point math/point.h - \brief 2D point - - Represents a 2D point (x, y). - Contains the required methods for operating on points. - - All methods are made inline to maximize optimization. - +/** + * \struct Point + * \brief 2D point + * + * Represents a 2D point (x, y). + * Contains the required methods for operating on points. + * + * All methods are made inline to maximize optimization. */ struct Point { diff --git a/src/math/test/CMakeLists.txt b/src/math/test/CMakeLists.txt index c736022..87121a0 100644 --- a/src/math/test/CMakeLists.txt +++ b/src/math/test/CMakeLists.txt @@ -1,33 +1,23 @@ cmake_minimum_required(VERSION 2.8) set(CMAKE_BUILD_TYPE debug) -set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -O0") +set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -Wold-style-cast -std=gnu++0x") -add_executable(matrix_test matrix_test.cpp) -add_executable(vector_test vector_test.cpp) -add_executable(geometry_test geometry_test.cpp ../old/math3d.cpp ../old/d3dmath.cpp ../../graphics/d3d/d3dutil.cpp) - -enable_testing() - -add_test(matrix_test ./matrix_test) -add_test(vector_test ./vector_test) -add_test(geometry_test ./geometry_test) - -# Change to DirectX SDK directory -include_directories("c:/dxsdk/include") +include_directories( +. +../../.. +${GTEST_DIR}/include +) -add_definitions(-DSTRICT -DD3D_OVERLOADS) +add_executable(matrix_test matrix_test.cpp) +target_link_libraries(matrix_test gtest) -# 'make check' will compile the required test programs -# Note that 'make test' will still fail without compiled programs -add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS matrix_test vector_test) +add_executable(vector_test vector_test.cpp) +target_link_libraries(vector_test gtest) -# Files to be removed in distclean -set(REMOVE_FILES - CMakeFiles Testing cmake_install.cmake CMakeCache.txt CTestTestfile.cmake Makefile - ./matrix_test - ./vector_test - ./geometry_test -) +add_executable(geometry_test geometry_test.cpp) +target_link_libraries(geometry_test gtest) -add_custom_target(distclean COMMAND rm -rf ${REMOVE_FILES}) +add_test(matrix_test matrix_test) +add_test(vector_test vector_test) +add_test(geometry_test geometry_test) diff --git a/src/math/test/geometry_test.cpp b/src/math/test/geometry_test.cpp index 07fa2cf..8b83b8d 100644 --- a/src/math/test/geometry_test.cpp +++ b/src/math/test/geometry_test.cpp @@ -20,53 +20,41 @@ #include "../func.h" #include "../geometry.h" -#include "../conv.h" -#include "../../old/math3d.h" -#include "../../old/d3dutil.h" -#include -#include +#include "gtest/gtest.h" -using namespace std; const float TEST_TOLERANCE = 1e-5; // Test for rewritten function RotateAngle() -int TestRotateAngle() +TEST(GeometryTest, RotateAngleTest) { - if (! Math::IsEqual(Math::RotateAngle(0.0f, 0.0f), 0.0f, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(0.0f, 0.0f), 0.0f, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(1.0f, 0.0f), 0.0f, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(1.0f, 0.0f), 0.0f, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(1.0f, 1.0f), 0.25f * Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(1.0f, 1.0f), 0.25f * Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(0.0f, 2.0f), 0.5f * Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(0.0f, 2.0f), 0.5f * Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(-0.5f, 0.5f), 0.75f * Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(-0.5f, 0.5f), 0.75f * Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(-1.0f, 0.0f), Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(-1.0f, 0.0f), Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(-1.0f, -1.0f), 1.25f * Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(-1.0f, -1.0f), 1.25f * Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(0.0f, -2.0f), 1.5f * Math::PI, TEST_TOLERANCE)) - return __LINE__; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(0.0f, -2.0f), 1.5f * Math::PI, TEST_TOLERANCE)); - if (! Math::IsEqual(Math::RotateAngle(1.0f, -1.0f), 1.75f * Math::PI, TEST_TOLERANCE)) - return __LINE__; - - return 0; + EXPECT_TRUE(Math::IsEqual(Math::RotateAngle(1.0f, -1.0f), 1.75f * Math::PI, TEST_TOLERANCE)); } // Tests for other altered, complex or uncertain functions +/* + + TODO: write meaningful tests with proper test values + int TestAngle() { const Math::Vector u(-0.0786076246943884, 0.2231249091714256, -1.1601361718477805); @@ -360,42 +348,12 @@ int TestTransform() return 0; } -int main() -{ - // Functions to test - int (*TESTS[])() = - { - TestRotateAngle, - TestAngle, - TestRotateView, - TestLookatPoint, - TestProjection, - TestLoadViewMatrix, - TestLoadProjectionMatrix, - TestLoadTranslationMatrix, - TestLoadScaleMatrix, - TestLoadRotationXMatrix, - TestLoadRotationYMatrix, - TestLoadRotationZMatrix, - TestLoadRotationMatrix, - TestLoadRotationXZYMatrix, - TestLoadRotationZXYMatrix, - TestTransform - }; - const int TESTS_SIZE = sizeof(TESTS) / sizeof(*TESTS); - - int result = 0; - for (int i = 0; i < TESTS_SIZE; ++i) - { - result = TESTS[i](); - if (result != 0) - { - fprintf(stderr, "Test function %d failed at line %d\n", i+1, result); - return result; - } - } +*/ - fprintf(stderr, "All tests successful\n"); - return 0; +int main(int argc, char* argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); } diff --git a/src/math/test/matrix_test.cpp b/src/math/test/matrix_test.cpp index 663234c..867e0ec 100644 --- a/src/math/test/matrix_test.cpp +++ b/src/math/test/matrix_test.cpp @@ -26,13 +26,13 @@ #include "../func.h" #include "../matrix.h" -#include +#include "gtest/gtest.h" -using namespace std; const float TEST_TOLERANCE = 1e-6; -int TestTranspose() + +TEST(MatrixTest, TransposeTest) { const Math::Matrix mat( (float[4][4]) @@ -56,16 +56,10 @@ int TestTranspose() Math::Matrix transpose = Math::Transpose(mat); - if (! Math::MatricesEqual(transpose, expectedTranspose, TEST_TOLERANCE)) - { - fprintf(stderr, "Transpose mismatch!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::MatricesEqual(transpose, expectedTranspose, TEST_TOLERANCE)); } -int TestCofactor() +TEST(MatrixTest, CofactorTest) { const Math::Matrix mat1( (float[4][4]) @@ -93,12 +87,7 @@ int TestCofactor() { float ret = mat1.Cofactor(r, c); float exp = expectedCofactors1.m[4*c+r]; - if (! Math::IsEqual(ret, exp, TEST_TOLERANCE)) - { - fprintf(stderr, "Cofactors 1 mismatch!\n"); - fprintf(stderr, "r=%d, c=%d, %f (returned) != %f (expected)\n", r, c, ret, exp); - return __LINE__; - } + EXPECT_TRUE(Math::IsEqual(ret, exp, TEST_TOLERANCE)); } } @@ -129,19 +118,12 @@ int TestCofactor() { float ret = mat2.Cofactor(r, c); float exp = expectedCofactors2.m[4*c+r]; - if (! Math::IsEqual(ret, exp, TEST_TOLERANCE)) - { - fprintf(stderr, "Cofactors 2 mismatch!\n"); - fprintf(stderr, "r=%d, c=%d, %f (returned) != %f (expected)\n", r, c, ret, exp); - return __LINE__; - } + EXPECT_TRUE(Math::IsEqual(ret, exp, TEST_TOLERANCE)); } } - - return 0; } -int TestDet() +TEST(MatrixTest, DetTest) { const Math::Matrix mat1( (float[4][4]) @@ -156,12 +138,7 @@ int TestDet() const float expectedDet1 = 4.07415413729671; float ret1 = mat1.Det(); - if (! Math::IsEqual(ret1, expectedDet1, TEST_TOLERANCE)) - { - fprintf(stderr, "Det mismatch!\n"); - fprintf(stderr, "%f (returned) != %f (expected)\n", ret1, expectedDet1); - return __LINE__; - } + EXPECT_TRUE(Math::IsEqual(ret1, expectedDet1, TEST_TOLERANCE)); const Math::Matrix mat2( (float[4][4]) @@ -176,17 +153,10 @@ int TestDet() const float expectedDet2 = -6.35122307880942; float ret2 = mat2.Det(); - if (! Math::IsEqual(ret2, expectedDet2, TEST_TOLERANCE)) - { - fprintf(stderr, "Det mismatch!\n"); - fprintf(stderr, "%f (returned) != %f (expected)\n", ret2, expectedDet2); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::IsEqual(ret2, expectedDet2, TEST_TOLERANCE)); } -int TestInverse() +TEST(MatrixTest, InverseTest) { const Math::Matrix mat1( (float[4][4]) @@ -210,11 +180,7 @@ int TestInverse() Math::Matrix inverse1 = mat1.Inverse(); - if (! Math::MatricesEqual(inverse1, expectedInverse1, TEST_TOLERANCE)) - { - fprintf(stderr, "Inverse 1 mismatch!\n"); - return __LINE__; - } + EXPECT_TRUE(Math::MatricesEqual(inverse1, expectedInverse1, TEST_TOLERANCE)); const Math::Matrix mat2( (float[4][4]) @@ -238,16 +204,10 @@ int TestInverse() Math::Matrix inverse2 = mat2.Inverse(); - if (! Math::MatricesEqual(inverse2, expectedInverse2, TEST_TOLERANCE)) - { - fprintf(stderr, "Inverse 2 mismatch!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::MatricesEqual(inverse2, expectedInverse2, TEST_TOLERANCE)); } -int TestMultiply() +TEST(MatrixTest, MultiplyTest) { const Math::Matrix mat1A( (float[4][4]) @@ -280,11 +240,7 @@ int TestMultiply() ); Math::Matrix multiply1 = Math::MultiplyMatrices(mat1A, mat1B); - if (! Math::MatricesEqual(multiply1, expectedMultiply1, TEST_TOLERANCE ) ) - { - fprintf(stderr, "Multiply 1 mismath!\n"); - return __LINE__; - } + EXPECT_TRUE(Math::MatricesEqual(multiply1, expectedMultiply1, TEST_TOLERANCE)); const Math::Matrix mat2A( (float[4][4]) @@ -317,16 +273,10 @@ int TestMultiply() ); Math::Matrix multiply2 = Math::MultiplyMatrices(mat2A, mat2B); - if (! Math::MatricesEqual(multiply2, expectedMultiply2, TEST_TOLERANCE ) ) - { - fprintf(stderr, "Multiply 2 mismath!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::MatricesEqual(multiply2, expectedMultiply2, TEST_TOLERANCE)); } -int TestMultiplyVector() +TEST(MatrixTest, MultiplyVectorTest) { const Math::Matrix mat1( (float[4][4]) @@ -343,11 +293,7 @@ int TestMultiplyVector() const Math::Vector expectedMultiply1(0.608932463260470, -1.356893266403749, 3.457156276255142); Math::Vector multiply1 = Math::MatrixVectorMultiply(mat1, vec1, false); - if (! Math::VectorsEqual(multiply1, expectedMultiply1, TEST_TOLERANCE ) ) - { - fprintf(stderr, "Multiply vector 1 mismath!\n"); - return __LINE__; - } + EXPECT_TRUE(Math::VectorsEqual(multiply1, expectedMultiply1, TEST_TOLERANCE)); const Math::Matrix mat2( (float[4][4]) @@ -364,39 +310,13 @@ int TestMultiplyVector() const Math::Vector expectedMultiply2(0.2816820577317669, 0.0334468811767428, 0.1996974284970455); Math::Vector multiply2 = Math::MatrixVectorMultiply(mat2, vec2, true); - if (! Math::VectorsEqual(multiply2, expectedMultiply2, TEST_TOLERANCE ) ) - { - fprintf(stderr, "Multiply vector 2 mismath!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::VectorsEqual(multiply2, expectedMultiply2, TEST_TOLERANCE)); } -int main() +int main(int argc, char* argv[]) { - // Functions to test - int (*TESTS[])() = - { - TestTranspose, - TestCofactor, - TestDet, - TestInverse, - TestMultiply, - TestMultiplyVector - }; - const int TESTS_SIZE = sizeof(TESTS) / sizeof(*TESTS); - - int result = 0; - for (int i = 0; i < TESTS_SIZE; ++i) - { - result = TESTS[i](); - if (result != 0) - return result; - } - - fprintf(stderr, "All tests successful\n"); + ::testing::InitGoogleTest(&argc, argv); - return 0; + return RUN_ALL_TESTS(); } diff --git a/src/math/test/vector_test.cpp b/src/math/test/vector_test.cpp index 899a580..ead2fd2 100644 --- a/src/math/test/vector_test.cpp +++ b/src/math/test/vector_test.cpp @@ -26,59 +26,41 @@ #include "../func.h" #include "../vector.h" -#include +#include "gtest/gtest.h" -using namespace std; const float TEST_TOLERANCE = 1e-6; -int TestLength() + +TEST(VectorTest, LengthTest) { Math::Vector vec(-1.288447945923275, 0.681452565308134, -0.633761098985957); const float expectedLength = 1.58938001708428; - if (! Math::IsEqual(vec.Length(), expectedLength, TEST_TOLERANCE) ) - { - fprintf(stderr, "Length mismatch!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::IsEqual(vec.Length(), expectedLength, TEST_TOLERANCE)); } -int TestNormalize() +TEST(VectorTest, NormalizeTest) { Math::Vector vec(1.848877241804398, -0.157262961268577, -1.963031403332377); const Math::Vector expectedNormalized(0.6844609421393856, -0.0582193085618106, -0.7267212194481797); vec.Normalize(); - if (! Math::VectorsEqual(vec, expectedNormalized, TEST_TOLERANCE)) - { - fprintf(stderr, "Normalize mismatch!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::VectorsEqual(vec, expectedNormalized, TEST_TOLERANCE)); } -int TestDot() +TEST(VectorTest, DotTest) { Math::Vector vecA(0.8202190530968309, 0.0130926060162780, 0.2411914183883510); Math::Vector vecB(-0.0524083951404069, 1.5564932716738220, -0.8971342631500536); float expectedDot = -0.238988896477326; - if (! Math::IsEqual(Math::DotProduct(vecA, vecB), expectedDot, TEST_TOLERANCE) ) - { - fprintf(stderr, "Dot product mismatch!\n"); - return __LINE__; - } - - return 0; + EXPECT_TRUE(Math::IsEqual(Math::DotProduct(vecA, vecB), expectedDot, TEST_TOLERANCE)); } -int TestCross() +TEST(VectorTest, CrossTest) { Math::Vector vecA(1.37380499798567, 1.18054518384682, 1.95166361293121); Math::Vector vecB(0.891657855926886, 0.447591335394532, -0.901604070087823); @@ -86,42 +68,14 @@ int TestCross() Math::Vector expectedCross(-1.937932065431669, 2.978844370287636, -0.437739173833581); Math::Vector expectedReverseCross = -expectedCross; - if (! Math::VectorsEqual(vecA.CrossMultiply(vecB), expectedCross, TEST_TOLERANCE) ) - { - fprintf(stderr, "Cross product mismatch!\n"); - return __LINE__; - } - - if (! Math::VectorsEqual(vecB.CrossMultiply(vecA), expectedReverseCross, TEST_TOLERANCE) ) - { - fprintf(stderr, "Reverse cross product mismatch!\n"); - return __LINE__; - } + EXPECT_TRUE(Math::VectorsEqual(vecA.CrossMultiply(vecB), expectedCross, TEST_TOLERANCE)); - return 0; + EXPECT_TRUE(Math::VectorsEqual(vecB.CrossMultiply(vecA), expectedReverseCross, TEST_TOLERANCE)); } -int main() +int main(int argc, char* argv[]) { - // Functions to test - int (*TESTS[])() = - { - TestLength, - TestNormalize, - TestDot, - TestCross - }; - const int TESTS_SIZE = sizeof(TESTS) / sizeof(*TESTS); - - int result = 0; - for (int i = 0; i < TESTS_SIZE; ++i) - { - result = TESTS[i](); - if (result != 0) - return result; - } - - fprintf(stderr, "All tests successful\n"); - - return 0; + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); } diff --git a/src/math/vector.h b/src/math/vector.h index 4378e75..eb54a5b 100644 --- a/src/math/vector.h +++ b/src/math/vector.h @@ -32,16 +32,17 @@ namespace Math { -/** \struct Vector math/vector.h - \brief 3D (3x1) vector - - Represents a universal 3x1 vector that can be used in OpenGL and DirectX engines. - Contains the required methods for operating on vectors. - - All methods are made inline to maximize optimization. - - Unit tests for the structure and related functions are in module: math/test/vector_test.cpp. - +/** + * \struct Vector + * \brief 3D (3x1) vector + * + * Represents a universal 3x1 vector that can be used in OpenGL and DirectX engines. + * Contains the required methods for operating on vectors. + * + * All methods are made inline to maximize optimization. + * + * Unit tests for the structure and related functions are in module: math/test/vector_test.cpp. + * */ struct Vector { @@ -103,8 +104,10 @@ struct Vector } //! Calculates the cross product with another vector - /** \a right right-hand side vector - \returns the cross product*/ + /** + * \param right right-hand side vector + * \returns the cross product + */ inline Vector CrossMultiply(const Vector &right) const { float px = y * right.z - z * right.y; @@ -114,8 +117,10 @@ struct Vector } //! Calculates the dot product with another vector - /** \a right right-hand side vector - \returns the dot product */ + /** + * \param right right-hand side vector + * \returns the dot product + */ inline float DotMultiply(const Vector &right) const { return x * right.x + y * right.y + z * right.z; @@ -218,7 +223,7 @@ struct Vector return s.str(); } -}; // struct Point +}; // struct Vector //! Checks if two vectors are equal within given \a tolerance inline bool VectorsEqual(const Math::Vector &a, const Math::Vector &b, float tolerance = TOLERANCE) -- cgit v1.2.3-1-g7c22 From 34d7dcf3be24de04b2b9c64edb2666439b353a5b Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Wed, 12 Sep 2012 23:43:04 +0200 Subject: Simulation timestamps and input bindings - added new simulation time calculations in CApplication - added simulation frame updates - rewritten old input binding code and input state tracking --- src/app/app.cpp | 277 ++++++++++++++++++++++++++++++++++++++--- src/app/app.h | 216 ++++++++++++++++++++++++++++---- src/common/event.h | 8 +- src/common/global.h | 5 +- src/common/misc.h | 2 +- src/graphics/engine/engine.cpp | 30 +---- src/graphics/engine/engine.h | 9 +- 7 files changed, 469 insertions(+), 78 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index 981146d..fe1b986 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -81,23 +81,47 @@ CApplication::CApplication() m_robotMain = nullptr; m_sound = nullptr; - m_keyState = 0; - m_axeKey = Math::Vector(0.0f, 0.0f, 0.0f); - m_axeJoy = Math::Vector(0.0f, 0.0f, 0.0f); - m_exitCode = 0; m_active = false; m_debugMode = false; m_windowTitle = "COLOBOT"; + m_simulationSuspended = false; + + m_simulationSpeed = 1.0f; + + m_realAbsTimeBase = 0LL; + m_realAbsTime = 0LL; + m_realRelTime = 0LL; + + m_absTimeBase = 0LL; + m_exactAbsTime = 0LL; + m_exactRelTime = 0LL; + + m_absTime = 0.0f; + m_relTime = 0.0f; + + m_baseTimeStamp = CreateTimeStamp(); + m_curTimeStamp = CreateTimeStamp(); + m_lastTimeStamp = CreateTimeStamp(); + m_joystickEnabled = false; + m_kmodState = 0; + m_mouseButtonsState = 0; + + for (int i = 0; i < TRKEY_MAX; ++i) + m_trackedKeysState[i] = false; + + m_keyMotion = Math::Vector(0.0f, 0.0f, 0.0f); + m_joyMotion = Math::Vector(0.0f, 0.0f, 0.0f); + m_dataPath = "./data"; m_language = LANG_ENGLISH; - ResetKey(); + SetDefaultInputBindings(); } CApplication::~CApplication() @@ -110,6 +134,10 @@ CApplication::~CApplication() delete m_iMan; m_iMan = nullptr; + + DestroyTimeStamp(m_baseTimeStamp); + DestroyTimeStamp(m_curTimeStamp); + DestroyTimeStamp(m_lastTimeStamp); } bool CApplication::ParseArguments(int argc, char *argv[]) @@ -542,6 +570,10 @@ int CApplication::Run() { m_active = true; + GetCurrentTimeStamp(m_baseTimeStamp); + GetCurrentTimeStamp(m_lastTimeStamp); + GetCurrentTimeStamp(m_curTimeStamp); + while (true) { // To be sure no old event remains @@ -618,6 +650,9 @@ int CApplication::Run() // Update game and render a frame during idle time (no messages are waiting) Render(); + + // Update simulation state + StepSimulation(); } } @@ -737,8 +772,72 @@ bool CApplication::ProcessEvent(const Event &event) if (event.type == EVENT_ACTIVE) { m_active = event.active.gain; + if (m_debugMode) l->Info("Focus change: active = %s\n", m_active ? "true" : "false"); + + if (m_active) + ResumeSimulation(); + else + SuspendSimulation(); + } + else if (event.type == EVENT_KEY_DOWN) + { + m_kmodState = event.key.mod; + + if ((m_kmodState & KEY_MOD(SHIFT)) != 0) + m_trackedKeysState[TRKEY_SHIFT] = true; + else if ((m_kmodState & KEY_MOD(CTRL)) != 0) + m_trackedKeysState[TRKEY_CONTROL] = true; + else if (event.key.key == KEY(KP8)) + m_trackedKeysState[TRKEY_NUM_UP] = true; + else if (event.key.key == KEY(KP2)) + m_trackedKeysState[TRKEY_NUM_DOWN] = true; + else if (event.key.key == KEY(KP4)) + m_trackedKeysState[TRKEY_NUM_LEFT] = true; + else if (event.key.key == KEY(KP6)) + m_trackedKeysState[TRKEY_NUM_RIGHT] = true; + else if (event.key.key == KEY(KP_PLUS)) + m_trackedKeysState[TRKEY_NUM_PLUS] = true; + else if (event.key.key == KEY(KP_MINUS)) + m_trackedKeysState[TRKEY_NUM_MINUS] = true; + else if (event.key.key == KEY(PAGEUP)) + m_trackedKeysState[TRKEY_PAGE_UP] = true; + else if (event.key.key == KEY(PAGEDOWN)) + m_trackedKeysState[TRKEY_PAGE_DOWN] = true; + } + else if (event.type == EVENT_KEY_UP) + { + m_kmodState = event.key.mod; + + if ((m_kmodState & KEY_MOD(SHIFT)) != 0) + m_trackedKeysState[TRKEY_SHIFT] = false; + else if ((m_kmodState & KEY_MOD(CTRL)) != 0) + m_trackedKeysState[TRKEY_CONTROL] = false; + else if (event.key.key == KEY(KP8)) + m_trackedKeysState[TRKEY_NUM_UP] = false; + else if (event.key.key == KEY(KP2)) + m_trackedKeysState[TRKEY_NUM_DOWN] = false; + else if (event.key.key == KEY(KP4)) + m_trackedKeysState[TRKEY_NUM_LEFT] = false; + else if (event.key.key == KEY(KP6)) + m_trackedKeysState[TRKEY_NUM_RIGHT] = false; + else if (event.key.key == KEY(KP_PLUS)) + m_trackedKeysState[TRKEY_NUM_PLUS] = false; + else if (event.key.key == KEY(KP_MINUS)) + m_trackedKeysState[TRKEY_NUM_MINUS] = false; + else if (event.key.key == KEY(PAGEUP)) + m_trackedKeysState[TRKEY_PAGE_UP] = false; + else if (event.key.key == KEY(PAGEDOWN)) + m_trackedKeysState[TRKEY_PAGE_DOWN] = false; + } + else if (event.type == EVENT_MOUSE_BUTTON_DOWN) + { + m_mouseButtonsState |= 1 << event.mouseButton.button; + } + else if (event.type == EVENT_MOUSE_BUTTON_UP) + { + m_mouseButtonsState &= ~(1 << event.mouseButton.button); } // Print the events in debug mode to test the code @@ -800,9 +899,101 @@ void CApplication::Render() SDL_GL_SwapBuffers(); } -void CApplication::StepSimulation(float rTime) +void CApplication::SuspendSimulation() { - // TODO + m_simulationSuspended = true; + GetLogger()->Info("Suspend simulation\n"); +} + +void CApplication::ResumeSimulation() +{ + m_simulationSuspended = false; + + GetCurrentTimeStamp(m_baseTimeStamp); + CopyTimeStamp(m_curTimeStamp, m_baseTimeStamp); + m_realAbsTimeBase = m_realAbsTime; + m_absTimeBase = m_exactAbsTime; + + GetLogger()->Info("Resume simulation\n"); +} + +bool CApplication::GetSimulationSuspended() +{ + return m_simulationSuspended; +} + +void CApplication::SetSimulationSpeed(float speed) +{ + m_simulationSpeed = speed; + + GetCurrentTimeStamp(m_baseTimeStamp); + m_realAbsTimeBase = m_realAbsTime; + m_absTimeBase = m_exactAbsTime; + + GetLogger()->Info("Simulation speed = %.2f\n", speed); +} + +void CApplication::StepSimulation() +{ + if (m_simulationSuspended) + return; + + CopyTimeStamp(m_lastTimeStamp, m_curTimeStamp); + GetCurrentTimeStamp(m_curTimeStamp); + + long long absDiff = TimeStampExactDiff(m_baseTimeStamp, m_curTimeStamp); + m_realAbsTime = m_realAbsTimeBase + absDiff; + // m_baseTimeStamp is updated on simulation speed change, so this is OK + m_exactAbsTime = m_absTimeBase + m_simulationSpeed * absDiff; + m_absTime = (m_absTimeBase + m_simulationSpeed * absDiff) / 1e9f; + + m_realRelTime = TimeStampExactDiff(m_lastTimeStamp, m_curTimeStamp); + m_exactRelTime = m_simulationSpeed * m_realRelTime; + m_relTime = (m_simulationSpeed * m_realRelTime) / 1e9f; + + + m_engine->FrameUpdate(); + //m_sound->FrameMove(m_relTime); + + + Event frameEvent(EVENT_FRAME); + frameEvent.rTime = m_relTime; + m_eventQueue->AddEvent(frameEvent); +} + +float CApplication::GetSimulationSpeed() +{ + return m_simulationSpeed; +} + +float CApplication::GetAbsTime() +{ + return m_absTime; +} + +long long CApplication::GetExactAbsTime() +{ + return m_exactAbsTime; +} + +long long CApplication::GetRealAbsTime() +{ + return m_realAbsTime; +} + +float CApplication::GetRelTime() +{ + return m_relTime; +} + +long long CApplication::GetExactRelTime() +{ + return m_exactRelTime; +} + +long long CApplication::GetRealRelTime() +{ + return m_realRelTime; } Gfx::GLDeviceConfig CApplication::GetVideoConfig() @@ -863,25 +1054,79 @@ bool CApplication::GetDebugMode() return m_debugMode; } -void CApplication::FlushPressKey() +void CApplication::SetDefaultInputBindings() +{ + for (int i = 0; i < KEYRANK_MAX; i++) + m_inputBindings[i].Reset(); + + m_inputBindings[KEYRANK_LEFT ].key = KEY(LEFT); + m_inputBindings[KEYRANK_RIGHT ].key = KEY(RIGHT); + m_inputBindings[KEYRANK_UP ].key = KEY(UP); + m_inputBindings[KEYRANK_DOWN ].key = KEY(DOWN); + m_inputBindings[KEYRANK_GUP ].kmod = KEY_MOD(SHIFT); + m_inputBindings[KEYRANK_GDOWN ].kmod = KEY_MOD(CTRL); + m_inputBindings[KEYRANK_CAMERA ].key = KEY(SPACE); + m_inputBindings[KEYRANK_CAMERA ].joy = 2; + m_inputBindings[KEYRANK_DESEL ].key = KEY(KP0); + m_inputBindings[KEYRANK_DESEL ].kmod = 6; + m_inputBindings[KEYRANK_ACTION ].key = KEY(RETURN); + m_inputBindings[KEYRANK_ACTION ].joy = 1; + m_inputBindings[KEYRANK_NEAR ].key = KEY(KP_PLUS); + m_inputBindings[KEYRANK_NEAR ].joy = 5; + m_inputBindings[KEYRANK_AWAY ].key = KEY(KP_MINUS); + m_inputBindings[KEYRANK_AWAY ].joy = 4; + m_inputBindings[KEYRANK_NEXT ].key = KEY(TAB); + m_inputBindings[KEYRANK_NEXT ].joy = 3; + m_inputBindings[KEYRANK_HUMAN ].key = KEY(HOME); + m_inputBindings[KEYRANK_HUMAN ].joy = 7; + m_inputBindings[KEYRANK_QUIT ].key = KEY(ESCAPE); + m_inputBindings[KEYRANK_HELP ].key = KEY(F1); + m_inputBindings[KEYRANK_PROG ].key = KEY(F2); + m_inputBindings[KEYRANK_CBOT ].key = KEY(F3); + m_inputBindings[KEYRANK_VISIT ].key = KEY(KP_PERIOD); + m_inputBindings[KEYRANK_SPEED10].key = KEY(F4); + m_inputBindings[KEYRANK_SPEED15].key = KEY(F5); + m_inputBindings[KEYRANK_SPEED20].key = KEY(F6); +} + +int CApplication::GetKmods() { - // TODO + return m_kmodState; } -void CApplication::ResetKey() +bool CApplication::GetKmodState(int kmod) { - // TODO + return (m_kmodState & kmod) != 0; +} + +bool CApplication::GetTrackedKeyState(TrackedKey key) +{ + return m_trackedKeysState[key]; +} + +bool CApplication::GetMouseButtonState(int index) +{ + return (m_mouseButtonsState & (1< GetJoystickList(); @@ -158,10 +266,11 @@ public: //! Change the current joystick device bool ChangeJoystick(const JoystickDevice &newJoystick); - //! Enables/disables joystick + //! Management of joystick enable state + //@{ void SetJoystickEnabled(bool enable); - //! Returns whether joystick is enabled bool GetJoystickEnabled(); + //@} //! Polls the state of joystick axes and buttons void UpdateJoystick(); @@ -169,30 +278,56 @@ public: //! Updates the mouse position explicitly void UpdateMouse(); - void FlushPressKey(); - void ResetKey(); - void SetKey(int keyRank, int option, int key); - int GetKey(int keyRank, int option); + //! Returns the current key modifiers + int GetKmods(); + //! Returns whether the given kmod is active + bool GetKmodState(int kmod); + + //! Returns whether the tracked key is pressed + bool GetTrackedKeyState(TrackedKey key); - //! Sets the grab mode for input (keyboard & mouse) + //! Returns whether the mouse button is pressed + bool GetMouseButtonState(int index); + + //! Resets tracked key states, modifiers and motion vectors + void ResetKeyStates(); + + + // TODO move input binding and motion vectors to CRobotMain + + //! Sets the default input bindings + void SetDefaultInputBindings(); + + //! Management of input bindings + //@{ + void SetInputBinding(InputSlot slot, const InputBinding& binding); + const InputBinding& GetInputBinding(InputSlot slot); + //@} + + + //! Management of the grab mode for input (keyboard & mouse) + //@{ void SetGrabInput(bool grab); - //! Returns the grab mode bool GetGrabInput(); + //@} - //! Sets the visiblity of system mouse cursor + //! Management of the visiblity of system mouse cursor + //@{ void SetSystemMouseVisible(bool visible); - //! Returns the visiblity of system mouse cursor bool GetSystemMouseVisibile(); + //@} - //! Sets the position of system mouse cursor (in interface coords) + //! Management of the position of system mouse cursor (in interface coords) + //@{ void SetSystemMousePos(Math::Point pos); - //! Returns the position of system mouse cursor (in interface coords) Math::Point GetSystemMousePos(); + //@} - //! Enables/disables debug mode (prints more info in logger) + //! Management of debug mode (prints more info in logger) + //@{ void SetDebugMode(bool mode); - //! Returns whether debug mode is enabled bool GetDebugMode(); + //@} //! Returns the full path to a file in data directory std::string GetDataFilePath(const std::string &dirName, const std::string &fileName); @@ -253,13 +388,44 @@ protected: //! Text set as window title std::string m_windowTitle; - int m_keyState; - Math::Vector m_axeKey; - Math::Vector m_axeJoy; - Math::Point m_systemMousePos; - long m_mouseWheel; + //! Animation time stamps, etc. + //@{ + SystemTimeStamp* m_baseTimeStamp; + SystemTimeStamp* m_lastTimeStamp; + SystemTimeStamp* m_curTimeStamp; + + long long m_realAbsTimeBase; + long long m_realAbsTime; + long long m_realRelTime; + + long long m_absTimeBase; + long long m_exactAbsTime; + long long m_exactRelTime; - long m_key[50][2]; + float m_absTime; + float m_relTime; + + float m_simulationSpeed; + bool m_simulationSuspended; + //@} + + //! Current state of key modifiers (mask of SDLMod) + unsigned int m_kmodState; + //! Current state of some tracked keys (mask of TrackedKey) + bool m_trackedKeysState[TRKEY_MAX]; + //! Current state of mouse buttons (mask of button indexes) + unsigned int m_mouseButtonsState; + + //! Bindings for user inputs + InputBinding m_inputBindings[INPUT_SLOT_MAX]; + + //! Motion vector set by keyboard + Math::Vector m_keyMotion; + //! Motion vector set by joystick + Math::Vector m_joyMotion; + + //! Current system mouse position + Math::Point m_systemMousePos; //! Info about current joystick device JoystickDevice m_joystick; diff --git a/src/common/event.h b/src/common/event.h index e57bd08..4df1e6d 100644 --- a/src/common/event.h +++ b/src/common/event.h @@ -171,13 +171,19 @@ struct Event ActiveEventData active; }; - // TODO: refactor/rewrite + // TODO: remove long param; // parameter + + // TODO: remove? Math::Point pos; // mouse position (0 .. 1) + + // TODO: ? float axeX; // control the X axis (-1 .. 1) float axeY; // control of the Y axis (-1 .. 1) float axeZ; // control the Z axis (-1 .. 1) short keyState; // state of the keyboard (KS_ *) + + // TODO: remove in longer term (use CApplication's new time functions instead) float rTime; // relative time Event(EventType aType = EVENT_NULL) diff --git a/src/common/global.h b/src/common/global.h index acc5b8f..88f753e 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -84,9 +84,8 @@ enum ResearchType /** * \enum KeyRank * \brief Slots for key assignment of user controls - * - * TODO: refactor */ +// TODO: remove (use the new InputSlot enum from app/app.h) enum KeyRank { KEYRANK_LEFT = 0, @@ -113,6 +112,8 @@ enum KeyRank KEYRANK_AIMUP = 21, KEYRANK_AIMDOWN = 22, KEYRANK_CBOT = 23, + + KEYRANK_MAX }; // TODO: move to CRobotMain diff --git a/src/common/misc.h b/src/common/misc.h index 66da478..235b7a3 100644 --- a/src/common/misc.h +++ b/src/common/misc.h @@ -22,7 +22,7 @@ #include -// TODO: to be removed +// TODO: to be removed (replaced by TrackedKey enum and mouse states in app.h) const int KS_PAGEUP = (1<<4); const int KS_PAGEDOWN = (1<<5); const int KS_SHIFT = (1<<6); diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 068687a..d368aa6 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -357,22 +357,22 @@ bool Gfx::CEngine::ProcessEvent(const Event &event) } } } - else if (event.type == EVENT_FRAME) - { - m_highlightTime += event.rTime; - } // By default, pass on all events return true; } -void Gfx::CEngine::FrameMove(float rTime) +void Gfx::CEngine::FrameUpdate() { + float rTime = m_app->GetRelTime(); + m_lightMan->UpdateProgression(rTime); m_particle->FrameParticle(rTime); ComputeDistance(); UpdateGeometry(); + m_highlightTime = m_app->GetAbsTime(); + if (m_groundMark.draw) { if (m_groundMark.phase == Gfx::ENG_GR_MARK_PHASE_INC) // growing? @@ -402,16 +402,6 @@ void Gfx::CEngine::FrameMove(float rTime) } } } - - if (m_sound == nullptr) - m_sound = static_cast( m_iMan->SearchInstance(CLASS_SOUND) ); - - m_sound->FrameMove(rTime); -} - -void Gfx::CEngine::StepSimulation(float rTime) -{ - m_app->StepSimulation(rTime); } bool Gfx::CEngine::WriteScreenShot(const std::string& fileName, int width, int height) @@ -2726,16 +2716,6 @@ int Gfx::CEngine::GetEditIndentValue() return m_editIndentValue; } -void Gfx::CEngine::SetSpeed(float speed) -{ - m_speed = speed; -} - -float Gfx::CEngine::GetSpeed() -{ - return m_speed; -} - void Gfx::CEngine::SetTracePrecision(float factor) { m_tracePrecision = factor; diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 705c83a..1ce93a3 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -664,9 +664,7 @@ public: bool ProcessEvent(const Event& event); //! Called once per frame, the call is the entry point for animating the scene - void FrameMove(float rTime); - //! Evolved throughout the game - void StepSimulation(float rTime); + void FrameUpdate(); //! Writes a screenshot containing the current frame @@ -1098,11 +1096,6 @@ public: int GetEditIndentValue(); //@} - //@{ - //! Management of game speed - void SetSpeed(float speed); - float GetSpeed(); - //@{ //! Management of precision of robot tracks void SetTracePrecision(float factor); -- cgit v1.2.3-1-g7c22 From 87c87c2c06aaea40784ea4de11d4619b54fb8be2 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Thu, 13 Sep 2012 20:40:07 +0200 Subject: Image pixel read/write --- src/common/image.cpp | 142 +++++++++++++++++++++++++++++++++++++---- src/common/image.h | 17 ++++- src/common/test/CMakeLists.txt | 2 + src/common/test/image_test.cpp | 23 +++++++ 4 files changed, 167 insertions(+), 17 deletions(-) diff --git a/src/common/image.cpp b/src/common/image.cpp index 3d64377..50f6eee 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -21,6 +21,8 @@ #include #include #include +#include + #include #include #include @@ -88,21 +90,21 @@ bool PNGSaveSurface(const char *filename, SDL_Surface *surf) /* Opening output file */ fp = fopen(filename, "wb"); - if (fp == NULL) + if (fp == nullptr) { PNG_ERROR = std::string("Could not open file '") + std::string(filename) + std::string("' for saving"); return false; } /* Initializing png structures and callbacks */ - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, PNGUserError, NULL); - if (png_ptr == NULL) + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, PNGUserError, nullptr); + if (png_ptr == nullptr) return false; info_ptr = png_create_info_struct(png_ptr); - if (info_ptr == NULL) + if (info_ptr == nullptr) { - png_destroy_write_struct(&png_ptr, static_cast(NULL)); + png_destroy_write_struct(&png_ptr, static_cast(nullptr)); PNG_ERROR = "png_create_info_struct() error!"; return false; } @@ -142,7 +144,7 @@ bool PNGSaveSurface(const char *filename, SDL_Surface *surf) CImage::CImage() { - m_data = NULL; + m_data = nullptr; } CImage::~CImage() @@ -150,22 +152,22 @@ CImage::~CImage() Free(); } -bool CImage::IsEmpty() +bool CImage::IsEmpty() const { - return m_data == NULL; + return m_data == nullptr; } void CImage::Free() { - if (m_data != NULL) + if (m_data != nullptr) { - if (m_data->surface != NULL) + if (m_data->surface != nullptr) { SDL_FreeSurface(m_data->surface); - m_data->surface = NULL; + m_data->surface = nullptr; } delete m_data; - m_data = NULL; + m_data = nullptr; } } @@ -174,6 +176,118 @@ ImageData* CImage::GetData() return m_data; } +Math::IntPoint CImage::GetSize() const +{ + if (m_data == nullptr) + return Math::IntPoint(); + + return Math::IntPoint(m_data->surface->w, m_data->surface->h); +} + +/** + * Image must be valid and pixel coords in valid range. + * + * \param pixel pixel coords (range x: 0..width-1 y: 0..height-1) + * \returns color + */ +Gfx::Color CImage::GetPixel(Math::IntPoint pixel) +{ + assert(m_data != nullptr); + assert(pixel.x >= 0 || pixel.x <= m_data->surface->w); + assert(pixel.y >= 0 || pixel.y <= m_data->surface->h); + + int bpp = m_data->surface->format->BytesPerPixel; + int index = pixel.y * m_data->surface->pitch + pixel.x * bpp; + Uint8* p = &static_cast(m_data->surface->pixels)[index]; + + Uint32 u = 0; + switch (bpp) + { + case 1: + u = *p; + break; + + case 2: + u = *reinterpret_cast(p); + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + u = (p[0] << 16) | (p[1] << 8) | p[2]; + else + u = p[0] | (p[1] << 8) | (p[2] << 16); + break; + + case 4: + u = *reinterpret_cast(p); + break; + + default: + assert(false); + } + + Uint8 r = 0, g = 0, b = 0, a = 0; + SDL_GetRGBA(u, m_data->surface->format, &r, &g, &b, &a); + + return Gfx::Color(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f); +} + +/** + * Image must be valid and pixel coords in valid range. + * + * \param pixel pixel coords (range x: 0..width-1 y: 0..height-1) + * \param color color + */ +void CImage::SetPixel(Math::IntPoint pixel, Gfx::Color color) +{ + assert(m_data != nullptr); + assert(pixel.x >= 0 || pixel.x <= m_data->surface->w); + assert(pixel.y >= 0 || pixel.y <= m_data->surface->h); + + int bpp = m_data->surface->format->BytesPerPixel; + int index = pixel.y * m_data->surface->pitch + pixel.x * bpp; + Uint8* p = &static_cast(m_data->surface->pixels)[index]; + + Uint8 r = static_cast(color.r * 255.0f); + Uint8 g = static_cast(color.g * 255.0f); + Uint8 b = static_cast(color.b * 255.0f); + Uint8 a = static_cast(color.a * 255.0f); + Uint32 u = SDL_MapRGBA(m_data->surface->format, r, g, b, a); + + switch(bpp) + { + case 1: + *p = u; + break; + + case 2: + *reinterpret_cast(p) = u; + break; + + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + p[0] = (u >> 16) & 0xFF; + p[1] = (u >> 8) & 0xFF; + p[2] = u & 0xFF; + } + else + { + p[0] = u & 0xFF; + p[1] = (u >> 8) & 0xFF; + p[2] = (u >> 16) & 0xFF; + } + break; + + case 4: + *reinterpret_cast(p) = u; + break; + + default: + assert(false); + } +} + std::string CImage::GetError() { return m_error; @@ -189,10 +303,10 @@ bool CImage::Load(const std::string& fileName) m_error = ""; m_data->surface = IMG_Load(fileName.c_str()); - if (m_data->surface == NULL) + if (m_data->surface == nullptr) { delete m_data; - m_data = NULL; + m_data = nullptr; m_error = std::string(IMG_GetError()); return false; diff --git a/src/common/image.h b/src/common/image.h index 7588ea9..93c7cab 100644 --- a/src/common/image.h +++ b/src/common/image.h @@ -21,6 +21,8 @@ #pragma once +#include "graphics/core/color.h" +#include "math/intpoint.h" #include #include @@ -64,12 +66,21 @@ public: //! Frees the allocated image data void Free(); - //! Returns whether the image is empty (has NULL data) - bool IsEmpty(); + //! Returns whether the image is empty (has null data) + bool IsEmpty() const; - //! Returns the image data; if empty - returns NULL + //! Returns the image data; if empty - returns nullptr ImageData* GetData(); + //! Returns the image size + Math::IntPoint GetSize() const; + + //! Sets the color at given pixel + void SetPixel(Math::IntPoint pixel, Gfx::Color color); + + //! Returns the color at given pixel + Gfx::Color GetPixel(Math::IntPoint pixel); + //! Loads an image from the specified file bool Load(const std::string &fileName); diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt index d81acab..a1a7a50 100644 --- a/src/common/test/CMakeLists.txt +++ b/src/common/test/CMakeLists.txt @@ -7,6 +7,8 @@ include_directories("../../") include_directories("../../../") add_executable(image_test ../image.cpp image_test.cpp) +target_link_libraries(image_test -lpng -lSDL -lSDL_image) + add_executable(profile_test ../profile.cpp profile_test.cpp) add_test(profile_test ./profile_test) diff --git a/src/common/test/image_test.cpp b/src/common/test/image_test.cpp index 0ad1ee2..a98c9cc 100644 --- a/src/common/test/image_test.cpp +++ b/src/common/test/image_test.cpp @@ -22,6 +22,29 @@ int main(int argc, char *argv[]) printf("Error loading '%s': %s\n", err.c_str()); return 1; } + Gfx::Color color; + std::string str; + + color = image.GetPixel(Math::IntPoint(0, 0)); + str = color.ToString(); + printf("pixel @ (0,0): %s\n", str.c_str()); + + color = image.GetPixel(Math::IntPoint(0, 1)); + str = color.ToString(); + printf("pixel @ (0,1): %s\n", str.c_str()); + + color = image.GetPixel(Math::IntPoint(1, 0)); + str = color.ToString(); + printf("pixel @ (1,0): %s\n", str.c_str()); + + color = image.GetPixel(Math::IntPoint(1, 1)); + str = color.ToString(); + printf("pixel @ (1,1): %s\n", str.c_str()); + + image.SetPixel(Math::IntPoint(0, 0), Gfx::Color(0.1f, 0.2f, 0.3f, 0.0f)); + image.SetPixel(Math::IntPoint(1, 0), Gfx::Color(0.3f, 0.2f, 0.1f, 1.0f)); + image.SetPixel(Math::IntPoint(0, 1), Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f)); + image.SetPixel(Math::IntPoint(1, 1), Gfx::Color(0.0f, 0.0f, 0.0f, 1.0f)); if (! image.SavePNG(argv[2])) { -- cgit v1.2.3-1-g7c22 From 94e7fd920353c39471d8836a8bf87ffb113f1349 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Thu, 13 Sep 2012 23:28:06 +0200 Subject: Locale settings and translation fixes - added locale setting - removed unused translations - updated .po files --- src/app/app.cpp | 102 ++++++++++++++++++++++++++++++++++---- src/common/error_ids.h | 2 - src/common/restext.h | 2 + src/common/restext_strings.c | 63 +----------------------- src/po/de.po | 101 ++++++++++++++------------------------ src/po/fr.po | 101 ++++++++++++++------------------------ src/po/pl.po | 114 ++++++++++++++++++------------------------- 7 files changed, 216 insertions(+), 269 deletions(-) diff --git a/src/app/app.cpp b/src/app/app.cpp index fe1b986..6e336a2 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -29,7 +29,10 @@ #include #include -#include +#include + +#include +#include template<> CApplication* CSingleton::mInstance = nullptr; @@ -144,6 +147,7 @@ bool CApplication::ParseArguments(int argc, char *argv[]) { bool waitDataDir = false; bool waitLogLevel = false; + bool waitLanguage = false; for (int i = 1; i < argc; ++i) { @@ -153,6 +157,7 @@ bool CApplication::ParseArguments(int argc, char *argv[]) { waitDataDir = false; m_dataPath = arg; + GetLogger()->Info("Using custom data dir: '%s'\n", m_dataPath.c_str()); continue; } @@ -176,6 +181,22 @@ bool CApplication::ParseArguments(int argc, char *argv[]) continue; } + if (waitLanguage) + { + waitLanguage = false; + if (arg == "en") + m_language = LANG_ENGLISH; + else if (arg == "de") + m_language = LANG_GERMAN; + else if (arg == "fr") + m_language = LANG_FRENCH; + else if (arg == "pl") + m_language = LANG_POLISH; + else + return false; + continue; + } + if (arg == "-debug") { SetDebugMode(true); @@ -188,6 +209,21 @@ bool CApplication::ParseArguments(int argc, char *argv[]) { waitDataDir = true; } + else if (arg == "-language") + { + waitLanguage = true; + } + else if (arg == "-help") + { + GetLogger()->Message("COLOBOT\n"); + GetLogger()->Message("\n"); + GetLogger()->Message("List of available options:\n"); + GetLogger()->Message(" -help this help\n"); + GetLogger()->Message(" -datadir path set custom data directory path\n"); + GetLogger()->Message(" -debug enable debug mode (more info printed in logs)\n"); + GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n"); + GetLogger()->Message(" -language lang set language (one of: en, de, fr, pl)\n"); + } else { m_exitCode = 1; @@ -196,7 +232,7 @@ bool CApplication::ParseArguments(int argc, char *argv[]) } // Args not given? - if (waitDataDir || waitLogLevel) + if (waitDataDir || waitLogLevel || waitLanguage) return false; return true; @@ -206,7 +242,50 @@ bool CApplication::Create() { GetLogger()->Info("Creating CApplication\n"); - // TODO: verify that data directory exists + // I know, a primitive way to check for dir, but works + std::string readmePath = m_dataPath + "/README.txt"; + std::ifstream testReadme; + testReadme.open(readmePath.c_str(), std::ios_base::in); + if (!testReadme.good()) + { + GetLogger()->Error("Could not open test file in data dir: '%s'\n", readmePath.c_str()); + m_errorMessage = std::string("Could not read from data directory:\n") + + std::string("'") + m_dataPath + std::string("'\n") + + std::string("Please check your installation, or supply a valid data directory by -datadir option."); + m_exitCode = 1; + return false; + } + + /* Gettext initialization */ + + std::string locale = "C"; + switch (m_language) + { + case LANG_ENGLISH: + locale = "en_US.utf8"; + break; + + case LANG_GERMAN: + locale = "de_DE.utf8"; + break; + + case LANG_FRENCH: + locale = "fr_FR.utf8"; + break; + + case LANG_POLISH: + locale = "pl_PL.utf8"; + break; + } + + setlocale(LC_ALL, locale.c_str()); + + std::string trPath = m_dataPath + std::string("/i18n"); + bindtextdomain("colobot", trPath.c_str()); + bind_textdomain_codeset("colobot", "UTF-8"); + textdomain("colobot"); + + GetLogger()->Debug("Testing gettext translation: '%s'\n", gettext("Colobot rules!")); // Temporarily -- only in windowed mode m_deviceConfig.fullScreen = false; @@ -771,15 +850,18 @@ bool CApplication::ProcessEvent(const Event &event) if (event.type == EVENT_ACTIVE) { - m_active = event.active.gain; - if (m_debugMode) - l->Info("Focus change: active = %s\n", m_active ? "true" : "false"); + l->Info("Focus change: active = %s\n", event.active.gain ? "true" : "false"); - if (m_active) - ResumeSimulation(); - else - SuspendSimulation(); + if (m_active != event.active.gain) + { + m_active = event.active.gain; + + if (m_active) + ResumeSimulation(); + else + SuspendSimulation(); + } } else if (event.type == EVENT_KEY_DOWN) { diff --git a/src/common/error_ids.h b/src/common/error_ids.h index 3c0e0a1..fc1f7d6 100644 --- a/src/common/error_ids.h +++ b/src/common/error_ids.h @@ -26,8 +26,6 @@ enum Error ERR_CONTINUE = 2, // continues ERR_STOP = 3, // stops ERR_CMD = 4, // unknown command - ERR_INSTALL = 20, // incorrectly installed program - ERR_NOCD = 21, // CD not found ERR_MANIP_VEH = 100, // inappropriate vehicle ERR_MANIP_FLY = 101, // impossible in flight ERR_MANIP_BUSY = 102, // taking: hands already occupied diff --git a/src/common/restext.h b/src/common/restext.h index 0dba89a..b47e03c 100644 --- a/src/common/restext.h +++ b/src/common/restext.h @@ -40,6 +40,8 @@ enum ResType }; +// TODO: move to CRobotMain + extern void SetGlobalGamerName(char *name); extern bool SearchKey(char *cmd, KeyRank &key); extern bool GetResource(ResType type, int num, char* text); diff --git a/src/common/restext_strings.c b/src/common/restext_strings.c index 8e9471b..d041a28 100644 --- a/src/common/restext_strings.c +++ b/src/common/restext_strings.c @@ -22,36 +22,8 @@ const char * const strings_text[] = { -#if _FULL - [RT_VERSION_ID] = "1.18 /e", -#endif -#if _NET - [RT_VERSION_ID] = "CeeBot-A 1.18", -#endif -#if _SCHOOL & _EDU -#if _TEEN - [RT_VERSION_ID] = "CeeBot-Teen EDU 1.18", -#else - [RT_VERSION_ID] = "CeeBot-A EDU 1.18", -#endif -#endif -#if _SCHOOL & _PERSO -#if _TEEN - [RT_VERSION_ID] = "CeeBot-Teen PERSO 1.18", -#else - [RT_VERSION_ID] = "CeeBot-A PERSO 1.18", -#endif -#endif -#if _SCHOOL & _CEEBOTDEMO -#if _TEEN - [RT_VERSION_ID] = "CeeBot-Teen DEMO 1.18", -#else - [RT_VERSION_ID] = "CeeBot-A DEMO 1.18", -#endif -#endif -#if _DEMO - [RT_VERSION_ID] = "Demo 1.18 /e", -#endif + [RT_VERSION_ID] = "Colobot Gold", + [RT_DISINFO_TITLE] = "SatCom", [RT_WINDOW_MAXIMIZED] = "Maximize", [RT_WINDOW_MINIMIZED] = "Minimize", @@ -64,13 +36,8 @@ const char * const strings_text[] = [RT_IO_NEW] = "New ...", [RT_KEY_OR] = " or ", -#if _NEWLOOK - [RT_TITLE_BASE] = "CeeBot", - [RT_TITLE_INIT] = "CeeBot", -#else [RT_TITLE_BASE] = "COLOBOT", [RT_TITLE_INIT] = "COLOBOT", -#endif [RT_TITLE_TRAINER] = "Programming exercises", [RT_TITLE_DEFI] = "Challenges", [RT_TITLE_MISSION] = "Missions", @@ -111,15 +78,9 @@ const char * const strings_text[] = [RT_PERSO_COMBI] = "Suit color:", [RT_PERSO_BAND] = "Strip color:", -#if _NEWLOOK - [RT_DIALOG_QUIT] = "Do you want to quit CeeBot ?", - [RT_DIALOG_TITLE] = "CeeBot", - [RT_DIALOG_YESQUIT] = "Quit\\Quit CeeBot", -#else [RT_DIALOG_QUIT] = "Do you want to quit COLOBOT ?", [RT_DIALOG_TITLE] = "COLOBOT", [RT_DIALOG_YESQUIT] = "Quit\\Quit COLOBOT", -#endif [RT_DIALOG_ABORT] = "Quit the mission?", [RT_DIALOG_YES] = "Abort\\Abort the current mission", [RT_DIALOG_NO] = "Continue\\Continue the current mission", @@ -182,13 +143,8 @@ const char * const strings_event[] = [EVENT_INTERFACE_AGAIN] = "Restart\\Restart the mission from the beginning", [EVENT_INTERFACE_WRITE] = "Save\\Save the current mission ", [EVENT_INTERFACE_READ] = "Load\\Load a saved mission", -#if _NEWLOOK - [EVENT_INTERFACE_ABORT] = "\\Return to CeeBot", - [EVENT_INTERFACE_QUIT] = "Quit\\Quit CeeBot", -#else [EVENT_INTERFACE_ABORT] = "\\Return to COLOBOT", [EVENT_INTERFACE_QUIT] = "Quit\\Quit COLOBOT", -#endif [EVENT_INTERFACE_BACK] = "<< Back \\Back to the previous screen", [EVENT_INTERFACE_PLAY] = "Play\\Start mission!", [EVENT_INTERFACE_SETUPd] = "Device\\Driver and resolution settings", @@ -432,11 +388,7 @@ const char * const strings_event[] = [EVENT_HYPER_SIZE4] = "Size 4", [EVENT_HYPER_SIZE5] = "Size 5", [EVENT_SATCOM_HUSTON] = "Instructions from Houston", -#if _TEEN - [EVENT_SATCOM_SAT] = "Dictionnary", -#else [EVENT_SATCOM_SAT] = "Satellite report", -#endif [EVENT_SATCOM_LOADING] = "Programs dispatched by Houston", [EVENT_SATCOM_OBJECT] = "List of objects", [EVENT_SATCOM_PROG] = "Programming help", @@ -475,11 +427,7 @@ const char * const strings_object[] = [OBJECT_RESEARCH] = "Research center", [OBJECT_RADAR] = "Radar station", [OBJECT_INFO] = "Information exchange post", -#if _TEEN - [OBJECT_ENERGY] = "Disintegrator", -#else [OBJECT_ENERGY] = "Power cell factory", -#endif [OBJECT_LABO] = "Autolab", [OBJECT_NUCLEAR] = "Nuclear power station", [OBJECT_PARA] = "Lightning conductor", @@ -574,13 +522,6 @@ const char * const strings_object[] = const char * const strings_err[] = { [ERR_CMD] = "Unknown command", -#if _NEWLOOK - [ERR_INSTALL] = "CeeBot not installed.", - [ERR_NOCD] = "Please insert the CeeBot CD\nand re-run the game.", -#else - [ERR_INSTALL] = "COLOBOT not installed.", - [ERR_NOCD] = "Please insert the COLOBOT CD\nand re-run the game.", -#endif [ERR_MANIP_VEH] = "Inappropriate bot", [ERR_MANIP_FLY] = "Impossible when flying", [ERR_MANIP_BUSY] = "Already carrying something", diff --git a/src/po/de.po b/src/po/de.po index 88ab6f1..5af628c 100644 --- a/src/po/de.po +++ b/src/po/de.po @@ -1,29 +1,17 @@ -msgid "1.18 /e" -msgstr "1.18 /d" - -msgid "CeeBot-A 1.18" -msgstr "CeeBot-A 1.18" - -msgid "CeeBot-Teen EDU 1.18" -msgstr "CeeBot-Teen EDU 1.18" - -msgid "CeeBot-A EDU 1.18" -msgstr "CeeBot-A EDU 1.18" - -msgid "CeeBot-Teen PERSO 1.18" -msgstr "CeeBot-Teen PERSO 1.18" - -msgid "CeeBot-A PERSO 1.18" -msgstr "CeeBot-A PERSO 1.18" - -msgid "CeeBot-Teen DEMO 1.18" -msgstr "CeeBot-Teen DEMO 1.18" +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Language: de_DE\n" +"X-Source-Language: en_US\n" -msgid "CeeBot-A DEMO 1.18" -msgstr "CeeBot-A DEMO 1.18" +msgid "Colobot rules!" +msgstr "Colobot ist wunderbar!" -msgid "Demo 1.18 /e" -msgstr "Demo 1.18 /d" +msgid "Colobot Gold" +msgstr "Colobot Gold" msgid "SatCom" msgstr "SatCom" @@ -55,9 +43,6 @@ msgstr "Neu ..." msgid " or " msgstr " oder " -msgid "CeeBot" -msgstr "CeeBot" - msgid "COLOBOT" msgstr "COLOBOT" @@ -154,12 +139,6 @@ msgstr "Farbe des Anzugs:" msgid "Strip color:" msgstr "Farbe der Streifen:" -msgid "Do you want to quit CeeBot ?" -msgstr "Wollen Sie CeeBot schließen ?" - -msgid "Quit\\Quit CeeBot" -msgstr "Schließen\\CeeBot schließen" - msgid "Do you want to quit COLOBOT ?" msgstr "Wollen Sie COLOBOT schließen ?" @@ -223,8 +202,10 @@ msgstr "\\c; (keine)\\n;\n" msgid "\\b;Error\n" msgstr "\\b;Fehler\n" -msgid "The list is only available if a \\l;radar station\\u object\\radar; is working.\n" -msgstr "Die Liste ist ohne \\l;Radar\\u object\\radar; nicht verfügbar !\n" +msgid "" +"The list is only available if a \\l;radar station\\u object\\radar; is " +"working.\n" +msgstr "Die Liste ist ohne \\l;Radar\\u object\\radar; nicht verfügbar.\n" msgid "Open" msgstr "Öffnen" @@ -266,7 +247,7 @@ msgid "Next" msgstr "Nächster" msgid "Previous" -msgstr "Vorherg." +msgstr "Vorherg" msgid "Menu (\\key quit;)" msgstr "Menü (\\key quit;)" @@ -304,9 +285,6 @@ msgstr "Speichern\\Aktuelle Mission speichern" msgid "Load\\Load a saved mission" msgstr "Laden\\Eine gespeicherte Mission öffnen" -msgid "\\Return to CeeBot" -msgstr "\\Zurück zu CeeBot" - msgid "\\Return to COLOBOT" msgstr "\\Zurück zu COLOBOT" @@ -314,7 +292,7 @@ msgid "<< Back \\Back to the previous screen" msgstr "<< Zurück \\Zurück zum Hauptmenü" msgid "Play\\Start mission!" -msgstr "Spielen ...\\Los geht's" +msgstr "Spielen ...\\Los geht's!" msgid "Device\\Driver and resolution settings" msgstr "Bildschirm\\Driver und Bildschirmauflösung" @@ -401,10 +379,11 @@ msgid "Exit film\\Film at the exit of exercises" msgstr "Zurücksetzen \\Kleine Show beim Zurücksetzen in den Übungen" msgid "Friendly fire\\Your shooting can damage your own objects " -msgstr "Eigenbeschuss\\Ihre Einheiten werden von Ihren Waffen beschädigt." +msgstr "Eigenbeschuss\\Ihre Einheiten werden von Ihren Waffen beschädigt" msgid "Scrolling\\Scrolling when the mouse touches right or left border" -msgstr "Kameradrehung mit der Maus\\Die Kamera dreht wenn die Maus den Rand erreicht" +msgstr "" +"Kameradrehung mit der Maus\\Die Kamera dreht wenn die Maus den Rand erreicht" msgid "Mouse inversion X\\Inversion of the scrolling direction on the X axis" msgstr "Umkehr X\\Umkehr der Kameradrehung X-Achse" @@ -425,7 +404,8 @@ msgid "Big indent\\Indent 2 or 4 spaces per level defined by braces" msgstr "Einrücken mit 4 Leerstellen\\Einrücken mit 2 oder 4 Leerstellen" msgid "Access to solutions\\Show program \"4: Solution\" in the exercises" -msgstr "Lösung zugänglich\\Die Lösung ist im Programmslot \"4: Lösung\" zugänglich" +msgstr "" +"Lösung zugänglich\\Die Lösung ist im Programmslot \"4: Lösung\" zugänglich" msgid "Standard controls\\Standard key functions" msgstr "Alles zurücksetzen\\Standarddefinition aller Tasten" @@ -454,8 +434,9 @@ msgstr "Andere Kamera\\Sichtpunkt einstellen" msgid "Previous object\\Selects the previous object" msgstr "Vorherg. Auswahl\\Das vorhergehende Objekt auswählen" -msgid "Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" -msgstr "Standardhandlung\\Führt die Standardhandlung des Roboters aus." +msgid "" +"Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" +msgstr "Standardhandlung\\Führt die Standardhandlung des Roboters aus" msgid "Camera closer\\Moves the camera forward" msgstr "Kamera näher\\Bewegung der Kamera vorwärts" @@ -523,7 +504,8 @@ msgstr "Normal\\Normale Lautstärke" msgid "Use a joystick\\Joystick or keyboard" msgstr "Joystick\\Joystick oder Tastatur" -msgid "Access to solution\\Shows the solution (detailed instructions for missions)" +msgid "" +"Access to solution\\Shows the solution (detailed instructions for missions)" msgstr "Zeigt die Lösung\\Zeigt nach 3mal Scheitern die Lösung" msgid "\\New player name" @@ -1312,22 +1294,6 @@ msgstr "Fehler" msgid "Unknown command" msgstr "Befehl unbekannt" -msgid "CeeBot not installed." -msgstr "CeeBot wurde nicht installiert." - -msgid "" -"Please insert the CeeBot CD\n" -"and re-run the game." -msgstr "Legen Sie die CeeBot-CD ein\nund starten Sie das Spiel neu." - -msgid "COLOBOT not installed." -msgstr "COLOBOT wurde nicht installiert." - -msgid "" -"Please insert the COLOBOT CD\n" -"and re-run the game." -msgstr "Legen Sie die COLOBOT-CD ein\nund starten Sie das Spiel neu." - msgid "Inappropriate bot" msgstr "Roboter ungeeignet" @@ -1490,8 +1456,11 @@ msgstr "Zu nahe an einer anderen Fahne" msgid "No flag nearby" msgstr "Keine Fahne in Reichweite" -msgid "The mission is not accomplished yet (press \\key help; for more details)" -msgstr "Mission noch nicht beendet (Drücken Sie auf \\key help; für weitere Informationen)" +msgid "" +"The mission is not accomplished yet (press \\key help; for more details)" +msgstr "" +"Mission noch nicht beendet (Drücken Sie auf \\key help; für weitere " +"Informationen)" msgid "Bot destroyed" msgstr "Roboter zerstört" @@ -1647,7 +1616,9 @@ msgid "Instruction \"break\" outside a loop" msgstr "Anweisung \"break\" außerhalb einer Schleife" msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\"" -msgstr "Ein Label kann nur vor den Anweisungen \"for\", \"while\", \"do\" oder \"switch\" vorkommen" +msgstr "" +"Ein Label kann nur vor den Anweisungen \"for\", \"while\", \"do\" oder " +"\"switch\" vorkommen" msgid "This label does not exist" msgstr "Dieses Label existiert nicht" diff --git a/src/po/fr.po b/src/po/fr.po index c70a77e..f893440 100644 --- a/src/po/fr.po +++ b/src/po/fr.po @@ -1,29 +1,17 @@ -msgid "1.18 /e" -msgstr "1.18 /f" - -msgid "CeeBot-A 1.18" -msgstr "CeeBot-A 1.18" - -msgid "CeeBot-Teen EDU 1.18" -msgstr "CeeBot-Teen EDU 1.18" - -msgid "CeeBot-A EDU 1.18" -msgstr "CeeBot-A EDU 1.18" - -msgid "CeeBot-Teen PERSO 1.18" -msgstr "CeeBot-Teen PERSO 1.18" - -msgid "CeeBot-A PERSO 1.18" -msgstr "CeeBot-A PERSO 1.18" - -msgid "CeeBot-Teen DEMO 1.18" -msgstr "CeeBot-Teen DEMO 1.18" +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Language: fr_FR\n" +"X-Source-Language: en_US\n" -msgid "CeeBot-A DEMO 1.18" -msgstr "CeeBot-A DEMO 1.18" +msgid "Colobot rules!" +msgstr "Colobot est super!" -msgid "Demo 1.18 /e" -msgstr "Demo 1.18 /f" +msgid "Colobot Gold" +msgstr "Colobot Gold" msgid "SatCom" msgstr "SatCom" @@ -55,9 +43,6 @@ msgstr "Nouveau ..." msgid " or " msgstr " ou " -msgid "CeeBot" -msgstr "CeeBot" - msgid "COLOBOT" msgstr "COLOBOT" @@ -154,12 +139,6 @@ msgstr "Couleur de la combinaison :" msgid "Strip color:" msgstr "Couleur des bandes :" -msgid "Do you want to quit CeeBot ?" -msgstr "Voulez-vous quitter CeeBot ?" - -msgid "Quit\\Quit CeeBot" -msgstr "Quitter\\Quitter CeeBot" - msgid "Do you want to quit COLOBOT ?" msgstr "Voulez-vous quitter COLOBOT ?" @@ -223,8 +202,10 @@ msgstr "\\c; (aucun)\\n;\n" msgid "\\b;Error\n" msgstr "\\b;Erreur\n" -msgid "The list is only available if a \\l;radar station\\u object\\radar; is working.\n" -msgstr "Liste non disponible sans \\l;radar\\u object\\radar; !\n" +msgid "" +"The list is only available if a \\l;radar station\\u object\\radar; is " +"working.\n" +msgstr "Liste non disponible sans \\l;radar\\u object\\radar;.\n" msgid "Open" msgstr "Ouvrir" @@ -304,9 +285,6 @@ msgstr "Enregistrer\\Enregistrer la mission en cours" msgid "Load\\Load a saved mission" msgstr "Charger\\Charger une mission enregistrée" -msgid "\\Return to CeeBot" -msgstr "\\Retourner dans CeeBot" - msgid "\\Return to COLOBOT" msgstr "\\Retourner dans COLOBOT" @@ -314,7 +292,7 @@ msgid "<< Back \\Back to the previous screen" msgstr "<< Retour \\Retour au niveau précédent" msgid "Play\\Start mission!" -msgstr "Jouer ...\\Démarrer l'action" +msgstr "Jouer ...\\Démarrer l'action!" msgid "Device\\Driver and resolution settings" msgstr "Affichage\\Pilote et résolution d'affichage" @@ -404,13 +382,17 @@ msgid "Friendly fire\\Your shooting can damage your own objects " msgstr "Dégâts ŕ soi-męme\\Vos tirs infligent des dommages ŕ vos unités" msgid "Scrolling\\Scrolling when the mouse touches right or left border" -msgstr "Défilement dans les bords\\Défilement lorsque la souris touches les bords gauche ou droite" +msgstr "" +"Défilement dans les bords\\Défilement lorsque la souris touches les bords " +"gauche ou droite" msgid "Mouse inversion X\\Inversion of the scrolling direction on the X axis" -msgstr "Inversion souris X\\Inversion de la rotation lorsque la souris touche un bord" +msgstr "" +"Inversion souris X\\Inversion de la rotation lorsque la souris touche un bord" msgid "Mouse inversion Y\\Inversion of the scrolling direction on the Y axis" -msgstr "Inversion souris Y\\Inversion de la rotation lorsque la souris touche un bord" +msgstr "" +"Inversion souris Y\\Inversion de la rotation lorsque la souris touche un bord" msgid "Quake at explosions\\The screen shakes at explosions" msgstr "Secousses lors d'explosions\\L'écran vibre lors d'une explosion" @@ -454,7 +436,8 @@ msgstr "Changement de caméra\\Autre de point de vue" msgid "Previous object\\Selects the previous object" msgstr "Sélection précédente\\Sélectionne l'objet précédent" -msgid "Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" +msgid "" +"Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" msgstr "Action standard\\Action du bouton avec le cadre rouge" msgid "Camera closer\\Moves the camera forward" @@ -523,7 +506,8 @@ msgstr "Normal\\Niveaux normaux" msgid "Use a joystick\\Joystick or keyboard" msgstr "Utilise un joystick\\Joystick ou clavier" -msgid "Access to solution\\Shows the solution (detailed instructions for missions)" +msgid "" +"Access to solution\\Shows the solution (detailed instructions for missions)" msgstr "Accčs ŕ la solution\\Donne la solution" msgid "\\New player name" @@ -1312,22 +1296,6 @@ msgstr "Erreur" msgid "Unknown command" msgstr "Commande inconnue" -msgid "CeeBot not installed." -msgstr "CeeBot n'est pas installé." - -msgid "" -"Please insert the CeeBot CD\n" -"and re-run the game." -msgstr "Veuillez mettre le CD de CeeBot\net relancer le jeu." - -msgid "COLOBOT not installed." -msgstr "COLOBOT n'est pas installé." - -msgid "" -"Please insert the COLOBOT CD\n" -"and re-run the game." -msgstr "Veuillez mettre le CD de COLOBOT\net relancer le jeu." - msgid "Inappropriate bot" msgstr "Robot inadapté" @@ -1490,8 +1458,10 @@ msgstr "Trop proche d'un drapeau existant" msgid "No flag nearby" msgstr "Aucun drapeau ŕ proximité" -msgid "The mission is not accomplished yet (press \\key help; for more details)" -msgstr "La misssion n'est pas terminée (appuyez sur \\key help; pour plus de détails)" +msgid "" +"The mission is not accomplished yet (press \\key help; for more details)" +msgstr "" +"La misssion n'est pas terminée (appuyez sur \\key help; pour plus de détails)" msgid "Bot destroyed" msgstr "Robot détruit" @@ -1521,7 +1491,8 @@ msgid "Plans for tracked robots available " msgstr "Fabrication d'un robot ŕ chenilles possible" msgid "You can fly with the keys (\\key gup;) and (\\key gdown;)" -msgstr "Il est possible de voler avec les touches (\\key gup;) et (\\key gdown;)" +msgstr "" +"Il est possible de voler avec les touches (\\key gup;) et (\\key gdown;)" msgid "Plans for thumper available" msgstr "Fabrication d'un robot secoueur possible" @@ -1647,7 +1618,9 @@ msgid "Instruction \"break\" outside a loop" msgstr "Instruction \"break\" en dehors d'une boucle" msgid "A label must be followed by \"for\", \"while\", \"do\" or \"switch\"" -msgstr "Un label ne peut se placer que devant un \"for\", un \"while\", un \"do\" ou un \"switch\"" +msgstr "" +"Un label ne peut se placer que devant un \"for\", un \"while\", un \"do\" ou " +"un \"switch\"" msgid "This label does not exist" msgstr "Cette étiquette n'existe pas" diff --git a/src/po/pl.po b/src/po/pl.po index 1f5db21..98fda0e 100644 --- a/src/po/pl.po +++ b/src/po/pl.po @@ -1,29 +1,17 @@ -msgid "1.18 /e" -msgstr "Wersja 1.18 /pl" - -msgid "CeeBot-A 1.18" -msgstr "CeeBot-A 1.18" - -msgid "CeeBot-Teen EDU 1.18" -msgstr "CeeBot-Teen EDU 1.18" - -msgid "CeeBot-A EDU 1.18" -msgstr "CeeBot-A EDU 1.18" - -msgid "CeeBot-Teen PERSO 1.18" -msgstr "CeeBot-Teen PERSO 1.18" - -msgid "CeeBot-A PERSO 1.18" -msgstr "CeeBot-A PERSO 1.18" - -msgid "CeeBot-Teen DEMO 1.18" -msgstr "CeeBot-Teen DEMO 1.18" +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Language: pl_PL\n" +"X-Source-Language: en_US\n" -msgid "CeeBot-A DEMO 1.18" -msgstr "CeeBot-A DEMO 1.18" +msgid "Colobot rules!" +msgstr "Colobot rządzi!" -msgid "Demo 1.18 /e" -msgstr "Demo 1.18 /pl" +msgid "Colobot Gold" +msgstr "Colobot Gold" msgid "SatCom" msgstr "SatCom" @@ -55,9 +43,6 @@ msgstr "Nowy ..." msgid " or " msgstr " lub " -msgid "CeeBot" -msgstr "CeeBot" - msgid "COLOBOT" msgstr "COLOBOT" @@ -154,12 +139,6 @@ msgstr "Kolor skafandra:" msgid "Strip color:" msgstr "Kolor pasków:" -msgid "Do you want to quit CeeBot ?" -msgstr "Czy na pewno chcesz opuścić grę CeeBot?" - -msgid "Quit\\Quit CeeBot" -msgstr "Zakończ\\Kończy grę CeeBot" - msgid "Do you want to quit COLOBOT ?" msgstr "Czy na pewno chcesz opuścić grę COLOBOT?" @@ -223,8 +202,12 @@ msgstr "\\c; (brak)\\n;\n" msgid "\\b;Error\n" msgstr "\\b;Błąd\n" -msgid "The list is only available if a \\l;radar station\\u object\\radar; is working.\n" -msgstr "Lista jest dostępna jedynie gdy działa \\l;stacja radarowa\\u object\\radar;.\n" +msgid "" +"The list is only available if a \\l;radar station\\u object\\radar; is " +"working.\n" +msgstr "" +"Lista jest dostępna jedynie gdy działa \\l;stacja radarowa\\u " +"object\\radar;.\n" msgid "Open" msgstr "Otwórz" @@ -304,9 +287,6 @@ msgstr "Zapisz\\Zapisuje bieżącą misję" msgid "Load\\Load a saved mission" msgstr "Wczytaj\\Wczytuje zapisaną misję" -msgid "\\Return to CeeBot" -msgstr "\\Powróć do gry CeeBot" - msgid "\\Return to COLOBOT" msgstr "\\Powróć do gry COLOBOT" @@ -404,7 +384,9 @@ msgid "Friendly fire\\Your shooting can damage your own objects " msgstr "Przyjacielski ogień\\Własne strzały uszkadzają Twoje obiekty" msgid "Scrolling\\Scrolling when the mouse touches right or left border" -msgstr "Przewijanie\\Ekran jest przewijany gdy mysz dotknie prawej lub lewej jego krawędzi" +msgstr "" +"Przewijanie\\Ekran jest przewijany gdy mysz dotknie prawej lub lewej jego " +"krawędzi" msgid "Mouse inversion X\\Inversion of the scrolling direction on the X axis" msgstr "Odwrócenie myszy X\\Odwrócenie kierunków przewijania w poziomie" @@ -422,7 +404,9 @@ msgid "Automatic indent\\When program editing" msgstr "Automatyczne wcięcia\\Automatyczne wcięcia podczas edycji programu" msgid "Big indent\\Indent 2 or 4 spaces per level defined by braces" -msgstr "Duże wcięcie\\2 lub 4 spacje wcięcia na każdy poziom zdefiniowany przez klamry" +msgstr "" +"Duże wcięcie\\2 lub 4 spacje wcięcia na każdy poziom zdefiniowany przez " +"klamry" msgid "Access to solutions\\Show program \"4: Solution\" in the exercises" msgstr "Accčs aux solutions\\Programme \"4: Solution\" dans les exercices" @@ -454,8 +438,11 @@ msgstr "Zmień kamerę\\Przełącza pomiędzy kamerą pokładową i śledzącą" msgid "Previous object\\Selects the previous object" msgstr "Poprzedni obiekt\\Zaznacz poprzedni obiekt" -msgid "Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" -msgstr "Standardowa akcja\\Standardowa akcja robota (podnieś/upuść, strzelaj, szukaj, itp.)" +msgid "" +"Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)" +msgstr "" +"Standardowa akcja\\Standardowa akcja robota (podnieś/upuść, strzelaj, " +"szukaj, itp.)" msgid "Camera closer\\Moves the camera forward" msgstr "Kamera bliżej\\Przybliża kamerę" @@ -479,10 +466,12 @@ msgid "Programming help\\Gives more detailed help with programming" msgstr "Podręcznik programowania\\Dostarcza szczegółową pomoc w programowaniu" msgid "Key word help\\More detailed help about key words" -msgstr "Pomoc dot. słów kluczowych\\Dokładniejsza pomoc na temat słów kluczowych" +msgstr "" +"Pomoc dot. słów kluczowych\\Dokładniejsza pomoc na temat słów kluczowych" msgid "Origin of last message\\Shows where the last message was sent from" -msgstr "Miejsce nadania wiadomości\\Pokazuje skąd została wysłana ostatnia wiadomość" +msgstr "" +"Miejsce nadania wiadomości\\Pokazuje skąd została wysłana ostatnia wiadomość" msgid "Speed 1.0x\\Normal speed" msgstr "Prędkość 1,0x\\Prędkość normalna" @@ -506,13 +495,15 @@ msgid "3D sound\\3D positioning of the sound" msgstr "Dźwięk 3D\\Przestrzenne pozycjonowanie dźwięków" msgid "Lowest\\Minimum graphic quality (highest frame rate)" -msgstr "Najniższa\\Minimalna jakość grafiki (najwyższa częstotliwość odświeżania)" +msgstr "" +"Najniższa\\Minimalna jakość grafiki (najwyższa częstotliwość odświeżania)" msgid "Normal\\Normal graphic quality" msgstr "Normalna\\Normalna jakość grafiki" msgid "Highest\\Highest graphic quality (lowest frame rate)" -msgstr "Najwyższa\\Maksymalna jakość grafiki (najniższa częstotliwość odświeżania)" +msgstr "" +"Najwyższa\\Maksymalna jakość grafiki (najniższa częstotliwość odświeżania)" msgid "Mute\\No sound" msgstr "Cisza\\Brak dźwięków" @@ -523,8 +514,11 @@ msgstr "Normalne\\Normalna głośność dźwięków" msgid "Use a joystick\\Joystick or keyboard" msgstr "Używaj joysticka\\Joystick lub klawiatura" -msgid "Access to solution\\Shows the solution (detailed instructions for missions)" -msgstr "Dostęp do rozwiązania\\Pokazuje rozwiązanie (szczegółowe instrukcje dotyczące misji)" +msgid "" +"Access to solution\\Shows the solution (detailed instructions for missions)" +msgstr "" +"Dostęp do rozwiązania\\Pokazuje rozwiązanie (szczegółowe instrukcje " +"dotyczące misji)" msgid "\\New player name" msgstr "\\Nowe imię gracza" @@ -1312,22 +1306,6 @@ msgstr "Błąd" msgid "Unknown command" msgstr "Nieznane polecenie" -msgid "CeeBot not installed." -msgstr "Gra CeeBot nie jest zainstalowana." - -msgid "" -"Please insert the CeeBot CD\n" -"and re-run the game." -msgstr "Włóż dysk CD z grą CeeBot\ni uruchom grę jeszcze raz." - -msgid "COLOBOT not installed." -msgstr "Gra COLOBOT nie jest zainstalowana." - -msgid "" -"Please insert the COLOBOT CD\n" -"and re-run the game." -msgstr "Włóż dysk CD z grą COLOBOT\ni uruchom grę jeszcze raz." - msgid "Inappropriate bot" msgstr "Nieodpowiedni robot" @@ -1490,7 +1468,8 @@ msgstr "Za blisko istniejącej flagi" msgid "No flag nearby" msgstr "Nie ma flagi w pobliżu" -msgid "The mission is not accomplished yet (press \\key help; for more details)" +msgid "" +"The mission is not accomplished yet (press \\key help; for more details)" msgstr "Misja nie jest wypełniona (naciśnij \\key help; aby uzyskać szczegóły)" msgid "Bot destroyed" @@ -1590,7 +1569,8 @@ msgid "Spider fatally wounded" msgstr "Pająk śmiertelnie raniony" msgid "Press \\key help; to read instructions on your SatCom" -msgstr "Naciśnij klawisz \\key help; aby wyświetlić rozkazy na przekaźniku SatCom" +msgstr "" +"Naciśnij klawisz \\key help; aby wyświetlić rozkazy na przekaźniku SatCom" msgid "Opening bracket missing" msgstr "Brak nawiasu otwierającego" @@ -1638,7 +1618,7 @@ msgid "Unknown function" msgstr "Funkcja nieznana" msgid "Sign \" : \" missing" -msgstr "Brak znaku \" : " +msgstr "Brak znaku \" :\"" msgid "Keyword \"while\" missing" msgstr "Brak kluczowego słowa \"while" -- cgit v1.2.3-1-g7c22