SDL project

- added (very basic) SDL template in CApplication and CEngine
- split project into two targets: colobot_old (dependent on DirectX and WinAPI)
  and colobot_new (dependent on SDL and OpenGL)
- moved sound.h/cpp to old/ and created new template in Snd namespace
- added platform-independent dialog boxes in app/system.h/cpp
dev-ui
Piotr Dziwinski 2012-06-25 19:59:17 +02:00
parent f58918031c
commit b08a63790c
44 changed files with 3284 additions and 2031 deletions

View File

@ -1,9 +1,15 @@
# CMake project file for compiling with MinGW
# CMake project file for compiling with GCC/MinGW
cmake_minimum_required(VERSION 2.8)
project(colobot CXX)
project(colobot C CXX)
# Required packages
find_package(OpenGL REQUIRED)
find_package(SDL REQUIRED)
find_package(SDL_image REQUIRED)
# Build with debugging symbols
set(CMAKE_BUILD_TYPE debug)
# Currently compiles only with -fpermissive
@ -11,4 +17,5 @@ set(CMAKE_BUILD_TYPE debug)
set(CMAKE_CXX_FLAGS_RELEASE "-fpermissive -O2")
set(CMAKE_CXX_FLAGS_DEBUG "-fpermissive -w -g -O0")
# Subdirectory with sources
add_subdirectory(src bin)

View File

@ -1,7 +1,9 @@
# CBot shared library
# CBot shared library is built separately
add_subdirectory(CBot)
set(SOURCES
# Source files for old target (dependent on WinAPI & DirectX)
set(OLD_SOURCES
old/d3dapp.cpp
old/joystick.cpp
old/blitz.cpp
@ -23,29 +25,13 @@ old/d3dutil.cpp
old/d3dmath.cpp
old/math3d.cpp
old/modfile.cpp
app/app.cpp
old/sound.cpp
common/event.cpp
common/iman.cpp
common/metafile.cpp
common/misc.cpp
common/profile.cpp
common/restext.cpp
graphics/common/camera.cpp
graphics/common/cloud.cpp
graphics/common/color.cpp
graphics/common/engine.cpp
graphics/common/light.cpp
graphics/common/lightning.cpp
graphics/common/model.cpp
graphics/common/modfile.cpp
graphics/common/particle.cpp
graphics/common/planet.cpp
graphics/common/pyro.cpp
graphics/common/terrain.cpp
graphics/common/text.cpp
graphics/common/water.cpp
graphics/opengl/gldevice.cpp
graphics/opengl/glengine.cpp
object/auto/auto.cpp
object/auto/autobase.cpp
object/auto/autoconvert.cpp
@ -110,7 +96,6 @@ physics/physics.cpp
script/cbottoken.cpp
script/cmdtoken.cpp
script/script.cpp
sound/sound.cpp
ui/button.cpp
ui/check.cpp
ui/color.cpp
@ -139,25 +124,174 @@ ui/target.cpp
ui/window.cpp
)
add_definitions(-DSTRICT -DD3D_OVERLOADS)
# Source files for new target (dependent on SDL & OpenGL)
# Commented out files are still dependent on DirectX or WinAPI
set(NEW_SOURCES
app/app.cpp
app/main.cpp
app/system.cpp
common/event.cpp
common/iman.cpp
# common/metafile.cpp
# common/misc.cpp
# common/modfile.cpp
# common/profile.cpp
# common/restext.cpp
graphics/common/camera.cpp
graphics/common/cloud.cpp
graphics/common/color.cpp
graphics/common/device.cpp
graphics/common/engine.cpp
graphics/common/light.cpp
graphics/common/lightning.cpp
graphics/common/model.cpp
graphics/common/modfile.cpp
graphics/common/particle.cpp
graphics/common/planet.cpp
graphics/common/pyro.cpp
graphics/common/terrain.cpp
graphics/common/text.cpp
graphics/common/water.cpp
graphics/opengl/gldevice.cpp
graphics/opengl/glengine.cpp
# object/auto/auto.cpp
# object/auto/autobase.cpp
# object/auto/autoconvert.cpp
# object/auto/autoderrick.cpp
# object/auto/autodestroyer.cpp
# object/auto/autoegg.cpp
# object/auto/autoenergy.cpp
# object/auto/autofactory.cpp
# object/auto/autoflag.cpp
# object/auto/autohuston.cpp
# object/auto/autoinfo.cpp
# object/auto/autojostle.cpp
# object/auto/autokid.cpp
# object/auto/autolabo.cpp
# object/auto/automush.cpp
# object/auto/autonest.cpp
# object/auto/autonuclear.cpp
# object/auto/autopara.cpp
# object/auto/autoportico.cpp
# object/auto/autoradar.cpp
# object/auto/autorepair.cpp
# object/auto/autoresearch.cpp
# object/auto/autoroot.cpp
# object/auto/autosafe.cpp
# object/auto/autostation.cpp
# object/auto/autotower.cpp
# object/brain.cpp
# object/mainmovie.cpp
# object/motion/motion.cpp
# object/motion/motionant.cpp
# object/motion/motionbee.cpp
# object/motion/motionhuman.cpp
# object/motion/motionmother.cpp
# object/motion/motionspider.cpp
# object/motion/motiontoto.cpp
# object/motion/motionvehicle.cpp
# object/motion/motionworm.cpp
# object/object.cpp
# object/robotmain.cpp
# object/task/task.cpp
# object/task/taskadvance.cpp
# object/task/taskbuild.cpp
# object/task/taskfire.cpp
# object/task/taskfireant.cpp
# object/task/taskflag.cpp
# object/task/taskgoto.cpp
# object/task/taskgungoal.cpp
# object/task/taskinfo.cpp
# object/task/taskmanager.cpp
# object/task/taskmanip.cpp
# object/task/taskpen.cpp
# object/task/taskrecover.cpp
# object/task/taskreset.cpp
# object/task/tasksearch.cpp
# object/task/taskshield.cpp
# object/task/taskspiderexplo.cpp
# object/task/tasktake.cpp
# object/task/taskterraform.cpp
# object/task/taskturn.cpp
# object/task/taskwait.cpp
# physics/physics.cpp
# script/cbottoken.cpp
# script/cmdtoken.cpp
# script/script.cpp
sound/sound.cpp
# ui/button.cpp
# ui/check.cpp
# ui/color.cpp
# ui/compass.cpp
# ui/control.cpp
# ui/displayinfo.cpp
# ui/displaytext.cpp
# ui/edit.cpp
# ui/editvalue.cpp
# ui/gauge.cpp
# ui/group.cpp
# ui/image.cpp
# ui/interface.cpp
# ui/key.cpp
# ui/label.cpp
# ui/list.cpp
# ui/maindialog.cpp
# ui/mainmap.cpp
# ui/mainshort.cpp
# ui/map.cpp
# ui/scroll.cpp
# ui/shortcut.cpp
# ui/slider.cpp
# ui/studio.cpp
# ui/target.cpp
# ui/window.cpp
)
# Change to DirectX SDK directory
set(DXSDK_DIR "c:/dxsdk")
include_directories(${DXSDK_DIR}/include .)
# Configure options
option(DEBUG "Enable debug output" ON)
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(PLATFORM_WINDOWS 1)
set(PLATFORM_LINUX 0)
set(PLATFORM_OTHER 0)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(PLATFORM_WINDOWS 0)
set(PLATFORM_LINUX 1)
set(PLATFORM_OTHER 0)
else()
set(PLATFORM_WINDOWS 0)
set(PLATFORM_LINUX 0)
set(PLATFORM_OTHER 1)
endif()
# Configure file
configure_file(common/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/common/config.h)
# #defines needed for old target
add_definitions(-DSTRICT -DD3D_OVERLOADS)
include_directories(${DXSDK_DIR}/include . ${CMAKE_CURRENT_BINARY_DIR})
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/CBot ${DXSDK_DIR}/lib)
set( LIBS -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32
# Old target
set(OLD_LIBS -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32
-ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32
-lodbccp32 -lwinmm
${DXSDK_DIR}/lib/ddraw.lib ${DXSDK_DIR}/lib/dinput.lib ${DXSDK_DIR}/lib/dxguid.lib ${DXSDK_DIR}/lib/d3d8.lib ${DXSDK_DIR}/lib/dsound.lib )
${DXSDK_DIR}/lib/ddraw.lib ${DXSDK_DIR}/lib/dinput.lib ${DXSDK_DIR}/lib/dxguid.lib ${DXSDK_DIR}/lib/d3d8.lib ${DXSDK_DIR}/lib/dsound.lib)
# To build with libwine:
# include_directories(/usr/include/wine/windows /usr/include/wine/msvcrt)
# set(LIBS -lwine)
add_executable(colobot_old ${OLD_SOURCES})
add_executable(colobot ${SOURCES})
target_link_libraries(colobot_old CBot ${OLD_LIBS})
target_link_libraries(colobot CBot ${LIBS})
# New target
set(NEW_LIBS ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${OPENGL_LIBRARY})
add_executable(colobot_new ${NEW_SOURCES})
target_link_libraries(colobot_new ${NEW_LIBS})

View File

@ -19,5 +19,507 @@
#include "app/app.h"
#include "app/system.h"
#include "common/iman.h"
// TODO implementation
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
/**
* \struct ApplicationPrivate Private data of CApplication class
*
* Contains SDL-specific variables that should not be visible outside application module.
*/
struct ApplicationPrivate
{
//! Display surface
SDL_Surface *surface;
//! Currently handled event
SDL_Event currentEvent;
//! Joystick
SDL_Joystick *joystick;
//! Index of joystick device
int joystickDevice;
ApplicationPrivate()
{
memset(&currentEvent, 0, sizeof(SDL_Event));
surface = NULL;
joystick = NULL;
joystickDevice = 0;
}
};
CApplication::CApplication()
{
m_private = new ApplicationPrivate();
m_exitCode = 0;
m_iMan = new CInstanceManager();
m_event = new CEvent(m_iMan);
m_engine = 0;
m_robotMain = 0;
m_sound = 0;
m_keyState = 0;
m_axeKey = Math::Vector(0.0f, 0.0f, 0.0f);
m_axeJoy = Math::Vector(0.0f, 0.0f, 0.0f);
m_vidMemTotal = 0;
m_active = false;
m_activateApp = false;
m_ready = false;
m_joystick = false;
m_time = 0.0f;
for (int i = 0; i < 32; i++)
{
m_joyButton[i] = false;
}
m_windowTitle = "COLOBOT";
m_appUseZBuffer = true;
m_appUseStereo = true;
m_showStats = false;
m_debugMode = false;
m_audioState = true;
m_audioTrack = true;
m_niceMouse = false;
m_setupMode = true;
ResetKey();
}
CApplication::~CApplication()
{
delete m_private;
m_private = NULL;
delete m_iMan;
m_iMan = NULL;
}
Error CApplication::ParseArguments(int argc, char *argv[])
{
for (int i = 1; i < argc; ++i)
{
std::string arg = argv[i];
if (arg == "-debug")
{
m_showStats = true;
SetDebugMode(true);
}
else if (arg == "-audiostate")
{
m_audioState = false;
}
else if (arg == "-audiotrack")
{
m_audioTrack = false;
}
// TODO else {} report invalid argument
}
return ERR_OK;
}
bool CApplication::Create()
{
/*
TODO
Full screen by default unless in debug mode
if (! m_debugMode)
m_deviceConfig.fullScreen = true;
int full = 0;
if (GetProfileInt("Device", "FullScreen", full))
m_deviceConfig.fullScreen = full == 1;
*/
// Temporarily -- only in windowed mode
m_deviceConfig.fullScreen = false;
/*
TODO
// Create the 3D engine.
m_engine = new CEngine(m_iMan, this);
// Initialize the app's custom scene stuff
if (! m_engine->OneTimeSceneInit())
{
SystemDialog(SDT_ERROR, "COLOBOT - Error", m_engine->RetError());
return false;
}
// Create the sound instance.
m_sound = new CSound(m_iMan);
// Create the robot application.
m_robotMain = new CRobotMain(m_iMan);
*/
Uint32 initFlags = SDL_INIT_VIDEO;
if (m_joystick)
initFlags |= SDL_INIT_JOYSTICK;
if (SDL_Init(initFlags) < 0)
{
SystemDialog( SDT_ERROR, "COLOBOT - Error", "SDL initialization error:\n" + std::string(SDL_GetError()) );
return false;
}
const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo();
if (! videoInfo)
{
SystemDialog( SDT_ERROR, "COLOBOT - Error", "SDL error while getting video info:\n " + std::string(SDL_GetError()) );
return false;
}
Uint32 videoFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE;
if (m_deviceConfig.resizeable)
videoFlags |= SDL_RESIZABLE;
// Use hardware surface if available
if (videoInfo->hw_available)
videoFlags |= SDL_HWSURFACE;
else
videoFlags |= SDL_SWSURFACE;
// Enable hardware blit if available
if (videoInfo->blit_hw)
videoFlags |= SDL_HWACCEL;
if (m_deviceConfig.fullScreen)
videoFlags |= SDL_FULLSCREEN;
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) == 0)
{
SystemDialog( SDT_ERROR, "COLOBOT - Error", std::string("SDL_Image initialization error:\n") +
std::string(IMG_GetError()) );
return false;
}
m_private->surface = SDL_SetVideoMode(m_deviceConfig.width, m_deviceConfig.height,
m_deviceConfig.bpp, videoFlags);
if (! m_private->surface)
{
SystemDialog( SDT_ERROR, "COLOBT - Error", std::string("SDL error while setting video mode:\n") +
std::string(SDL_GetError()) );
return false;
}
SDL_WM_SetCaption(m_windowTitle.c_str(), m_windowTitle.c_str());
SDL_EnableUNICODE(1);
/*
TODO
InitJoystick();
if ( !GetProfileInt("Setup", "Sound3D", b3D) )
{
b3D = true;
}
m_pSound->SetDebugMode(m_bDebugMode);
m_pSound->Create(m_hWnd, b3D);
m_pSound->CacheAll();
m_pSound->SetState(m_bAudioState);
m_pSound->SetAudioTrack(m_bAudioTrack);
m_pSound->SetCDpath(m_CDpath);
// First execution?
if ( !GetProfileInt("Setup", "ObjectDirty", iValue) )
{
m_pD3DEngine->FirstExecuteAdapt(true);
}
// Creates the file colobot.ini at the first execution.
m_pRobotMain->CreateIni();
m_pRobotMain->ChangePhase(PHASE_WELCOME2);
m_engine->TimeInit();
*/
// The app is ready to go
m_ready = true;
return true;
}
void CApplication::Destroy()
{
if (m_private->joystick != NULL)
{
SDL_JoystickClose(m_private->joystick);
m_private->joystick = NULL;
}
SDL_FreeSurface(m_private->surface);
m_private->surface = NULL;
IMG_Quit();
SDL_Quit();
}
int CApplication::Run()
{
m_active = true;
while (m_private->currentEvent.type != SDL_QUIT)
{
// Use SDL_PeepEvents() if the app is active, so we can use idle time to
// render the scene. Else, use SDL_PollEvent() to avoid eating CPU time.
int count = 0;
if (m_active)
{
SDL_PumpEvents();
count = SDL_PeepEvents(&m_private->currentEvent, 1, SDL_GETEVENT, SDL_ALLEVENTS);
}
else
{
SDL_PollEvent(&m_private->currentEvent);
}
// If received an event
if ((m_active && count > 0) || (!m_active))
{
ParseEvent();
}
// Render a frame during idle time (no messages are waiting)
if (m_active && m_ready)
{
Event event;
while (m_event->GetEvent(event))
{
if (event.event == EVENT_QUIT)
{
goto end; // exit both loops
}
//m_robotMain->EventProcess(event);
}
//if ( !RetNiceMouse())
//{
// SetMouseType(m_engine->RetMouseType());
//}
// If an error occurs, push quit event to the queue
if (! Render())
{
SDL_Event quitEvent;
memset(&quitEvent, 0, sizeof(SDL_Event));
quitEvent.type = SDL_QUIT;
SDL_PushEvent(&quitEvent);
}
}
}
end:
//m_sound->StopMusic();
Destroy();
return m_exitCode;
}
void CApplication::ParseEvent()
{
/* Event event;
if (m_private->currentEvent.type == SDL_MOUSEBUTTONDOWN)
{
if (m_private->currentEvent.button.button == SDL_BUTTON_LEFT)
event.event = EVENT_LBUTTONDOWN;
else if (m_private->currentEvent.button.button == SDL_BUTTON_RIGHT)
event.event = EVENT_RBUTTONDOWN;
}
else if (m_private->currentEvent.type == SDL_MOUSEBUTTONUP)
{
if (m_private->currentEvent.button.button == SDL_BUTTON_LEFT)
event.event = EVENT_LBUTTONUP;
else if (m_private->currentEvent.button.button == SDL_BUTTON_RIGHT)
event.event = EVENT_RBUTTONUP;
}
else if (m_private->currentEvent.type == SDL_MOUSEMOTION)
{
event.event = EVENT_MOUSEMOVE;
}
else if (m_private->currentEvent.type == SDL_KEYDOWN)
{
event.event = EVENT_KEYDOWN;
}
else if (m_private->currentEvent.type == SDL_KEYUP)
{
event.event = EVENT_KEYUP;
}
if (m_robotMain != NULL && event.event != EVENT_NULL)
{
m_robotMain->EventProcess(event);
}
if (m_engine != NULL)
{
m_engine->MsgProc( hWnd, uMsg, wParam, lParam );
}
ProcessEvent(event);*/
}
void CApplication::ProcessEvent(Event event)
{
}
bool CApplication::Render()
{
bool result = m_engine->Render();
if (! result)
return false;
if (m_deviceConfig.doubleBuf)
SDL_GL_SwapBuffers();
return true;
}
void CApplication::Pause(bool pause)
{
// TODO
}
void CApplication::SetMousePos(Math::Point pos)
{
// TODO
}
void CApplication::StepSimulation(float rTime)
{
// TODO
}
void SetShowStat(bool show)
{
// TODO
}
bool CApplication::RetShowStat()
{
// TODO
return false;
}
void CApplication::SetDebugMode(bool mode)
{
// TODO
}
bool CApplication::RetDebugMode()
{
// TODO
return false;
}
bool CApplication::RetSetupMode()
{
// TODO
return false;
}
void CApplication::FlushPressKey()
{
// TODO
}
void CApplication::ResetKey()
{
// TODO
}
void CApplication::SetKey(int keyRank, int option, int key)
{
// TODO
}
int CApplication::RetKey(int keyRank, int option)
{
// TODO
return 0;
}
void CApplication::SetJoystick(bool enable)
{
// TODO
}
bool CApplication::RetJoystick()
{
// TODO
return false;
}
void SetMouseType(Gfx::MouseType type)
{
// TODO
}
void SetNiceMouse(bool nice)
{
// TODO
}
bool CApplication::RetNiceMouse()
{
return false;
}
bool CApplication::RetNiceMouseCap()
{
return false;
}
bool CApplication::WriteScreenShot(char *filename, int width, int height)
{
// TODO
}
void CApplication::InitText()
{
// TODO
}
void CApplication::DrawSuppl()
{
// TODO
}
void CApplication::ShowStats()
{
// TODO
}
void CApplication::OutputText(long x, long y, char* str)
{
// TODO
}

View File

@ -21,40 +21,59 @@
#include "common/misc.h"
#include "graphics/common/device.h"
#include "graphics/common/engine.h"
#include <string>
class CInstanceManager;
class CEvent;
class CRobotMain;
class CSound;
struct ApplicationPrivate;
/**
* \class CApplication Main application
*
* This class is responsible for creating and handling main application window,
* receiving events, etc.
*
* ...
*/
class CApplication
{
public:
//! Constructor (can only be called once!)
CApplication();
//! Destructor
~CApplication();
public:
//! Parses commandline arguments
Error ParseArguments(int argc, char *argv[]);
//! Initializes the application
bool Create();
//! Main event loop
int Run();
protected:
//LRESULT OnQuerySuspend( DWORD dwFlags );
//LRESULT OnResumeSuspend( DWORD dwData );
//! Cleans up before exit
void Destroy();
//! Processes an SDL event to Event struct
void ParseEvent();
//! Handles some incoming events
void ProcessEvent(Event event);
//! Renders the image in window
bool Render();
public:
Error RegQuery();
Error AudioQuery();
Error CheckMistery(char *strCmdLine);
int GetVidMemTotal();
bool IsVideo8MB();
bool IsVideo32MB();
//HRESULT Create( HINSTANCE, TCHAR* );
int Run();
//LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
void Pause(bool pause);
//Math::Point ConvPosToInterface(HWND hWnd, LPARAM lParam);
void StepSimulation(float rTime);
void SetMousePos(Math::Point pos);
void StepSimul(float rTime);
char* RetCDpath();
void SetShowStat(bool show);
bool RetShowStat();
@ -62,30 +81,21 @@ public:
bool RetDebugMode();
bool RetSetupMode();
bool EnumDevices(char *bufDevices, int lenDevices, char *bufModes, int lenModes, int &totalDevices, int &selectDevices, int &totalModes, int &selectModes);
bool RetFullScreen();
bool ChangeDevice(char *device, char *mode, bool bFull);
void FlushPressKey();
void ResetKey();
void SetKey(int keyRank, int option, int key);
int RetKey(int keyRank, int option);
void SetJoystick(bool bEnable);
void SetJoystick(bool enable);
bool RetJoystick();
void SetMouseType(Gfx::MouseType type);
void SetNiceMouse(bool bNice);
void SetNiceMouse(bool nice);
bool RetNiceMouse();
bool RetNiceMouseCap();
bool WriteScreenShot(char *filename, int width, int height);
//bool GetRenderDC(HDC &hDC);
//bool ReleaseRenderDC(HDC &hDC);
//PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp);
//bool CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC);
protected:
//HRESULT ConfirmDevice( DDCAPS* pddDriverCaps, D3DDEVICEDESC7* pd3dDeviceDesc );
//HRESULT Initialize3DEnvironment();
@ -102,55 +112,42 @@ protected:
void OutputText(long x, long y, char* str);
protected:
//! Private (SDL-dependent data)
ApplicationPrivate* m_private;
CInstanceManager* m_iMan;
Gfx::DeviceConfig m_deviceConfig;
Gfx::CEngine* m_engine;
CEvent* m_event;
CRobotMain* m_robotMain;
CSound* m_sound;
//HINSTANCE m_instance;
//HWND m_hWnd;
//D3DEnum_DeviceInfo* m_pDeviceInfo;
//LPDIRECTDRAW7 m_pDD;
//LPDIRECT3D7 m_pD3D;
//LPDIRECT3DDEVICE7 m_pD3DDevice;
//LPDIRECTDRAWSURFACE7 m_pddsRenderTarget;
//DDSURFACEDESC2 m_ddsdRenderTarget;
//LPDIRECTDRAWSURFACE7 m_pddsDepthBuffer;
//! Code to return at exit
int m_exitCode;
//HANDLE m_thread;
//DWORD m_threadId;
char m_CDpath[100];
//CD3DFramework7* m_pFramework;
bool m_active;
bool m_activateApp;
bool m_ready;
bool m_joystick;
std::string m_windowTitle;
long m_vidMemTotal;
char* m_strWindowTitle;
bool m_bAppUseZBuffer;
bool m_bAppUseStereo;
bool m_bShowStats;
bool m_bDebugMode;
bool m_bAudioState;
bool m_bAudioTrack;
bool m_bNiceMouse;
bool m_bSetupMode;
//HRESULT (*m_fnConfirmDevice)(DDCAPS*, D3DDEVICEDESC7*);
public:
Gfx::CEngine* m_pD3DEngine;
CRobotMain* m_pRobotMain;
CSound* m_pSound;
bool m_appUseZBuffer;
bool m_appUseStereo;
bool m_showStats;
bool m_debugMode;
bool m_audioState;
bool m_audioTrack;
bool m_niceMouse;
bool m_setupMode;
int m_keyState;
Math::Vector m_axeKey;
Math::Vector m_axeJoy;
bool m_joyButton[32];
Math::Point m_mousePos;
long m_mshMouseWheel;
long m_mouseWheel;
float m_aTime;
float m_time;
long m_key[50][2];
};

41
src/app/main.cpp Normal file
View File

@ -0,0 +1,41 @@
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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/.
// main.cpp
#include "app/app.h"
#include "app/system.h"
#include "common/misc.h"
#include "common/restext.h"
//! Entry point to the program
int main(int argc, char *argv[])
{
CApplication app; // single instance of the application
Error err = app.ParseArguments(argc, argv);
if (err != ERR_OK)
{
SystemDialog(SDT_ERROR, "COLOBOT", "Invalid commandline arguments!\n");
}
if (! app.Create())
return 0;
return app.Run();
}

253
src/app/system.cpp Normal file
View File

@ -0,0 +1,253 @@
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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/.
// system.cpp
#include "app/system.h"
#include "common/config.h"
#if defined(PLATFORM_WINDOWS)
#include <windows.h>
#elif defined(PLATFORM_LINUX)
#include <cstdlib>
#else
#include <iostream>
#endif
SystemDialogResult SystemDialog_Windows(SystemDialogType type, const std::string& title, const std::string& message);
SystemDialogResult SystemDialog_Linux(SystemDialogType type, const std::string& title, const std::string& message);
SystemDialogResult SystemDialog_Other(SystemDialogType type, const std::string& title, const std::string& message);
/**
* Displays a system dialog with info, error, question etc. message.
*
* \param type type of dialog
* \param message text of message (in UTF-8)
* \param title dialog title (in UTF-8)
* \returns result (which button was clicked)
*/
SystemDialogResult SystemDialog(SystemDialogType type, const std::string& title, const std::string& message)
{
#if defined(PLATFORM_WINDOWS)
return SystemDialog_Windows(type, title, message);
#elif defined(PLATFORM_LINUX)
return SystemDialog_Linux(type, title, message);
#else
return SystemDialog_Other(type, title, message);
#endif
}
#if defined(PLATFORM_WINDOWS)
// Convert a wide Unicode string to an UTF8 string
std::string UTF8_Encode_Windows(const std::wstring &wstr)
{
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
// Convert an UTF8 string to a wide Unicode String
std::wstring UTF8_Decode_Windows(const std::string &str)
{
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
SystemDialogResult SystemDialog_Windows(SystemDialogType type, const std::string& title, const std::string& message)
{
unsigned int windowsType = 0;
std::wstring windowsMessage = UTF8_Decode_Windows(message);
std::wstring windowsTitle = UTF8_Decode_Windows(title);
switch (type)
{
case SDT_INFO:
default:
windowsType = MB_ICONINFORMATION|MB_OK;
break;
case SDT_WARNING:
windowsType = MB_ICONWARNING|MB_OK;
break;
case SDT_ERROR:
windowsType = MB_ICONERROR|MB_OK;
break;
case SDT_YES_NO:
windowsType = MB_ICONQUESTION|MB_YESNO;
break;
case SDT_OK_CANCEL:
windowsType = MB_ICONWARNING|MB_OKCANCEL;
break;
}
switch (MessageBoxW(NULL, windowsMessage.c_str(), windowsTitle.c_str(), windowsType))
{
case IDOK:
return SDR_OK;
case IDCANCEL:
return SDR_CANCEL;
case IDYES:
return SDR_YES;
case IDNO:
return SDR_NO;
default:
break;
}
return SDR_OK;
}
#elif defined(PLATFORM_LINUX)
SystemDialogResult SystemDialog_Linux(SystemDialogType type, const std::string& title, const std::string& message)
{
std::string options = "";
switch (type)
{
case SDT_INFO:
default:
options = "--info";
break;
case SDT_WARNING:
options = "--warning";
break;
case SDT_ERROR:
options = "--error";
break;
case SDT_YES_NO:
options = "--question --ok-label=\"Yes\" --cancel-label=\"No\"";
break;
case SDT_OK_CANCEL:
options = "--question --ok-label=\"OK\" --cancel-label=\"Cancel\"";
break;
}
std::string command = "zenity " + options + " --text=\"" + message + "\" --title=\"" + title + "\"";
int code = system(command.c_str());
SystemDialogResult result = SDR_OK;
switch (type)
{
case SDT_YES_NO:
result = code ? SDR_NO : SDR_YES;
break;
case SDT_OK_CANCEL:
result = code ? SDR_CANCEL : SDR_OK;
break;
default:
break;
}
return result;
}
#else
SystemDialogResult SystemDialog_Other(SystemDialogType type, const std::string& title, const std::string& message)
{
switch (type)
{
case SDT_INFO:
std::cout << "INFO: ";
break;
case SDT_WARNING:
std::cout << "WARNING:";
break;
case SDT_ERROR:
std::cout << "ERROR: ";
break;
case SDT_YES_NO:
case SDT_OK_CANCEL:
std::cout << "QUESTION: ";
break;
}
std::cout << message << std::endl;
std::string line;
SystemDialogResult result = SDR_OK;
bool done = false;
while (!done)
{
switch (type)
{
case SDT_INFO:
case SDT_WARNING:
case SDT_ERROR:
std::cout << "Press ENTER to continue";
break;
case SDT_YES_NO:
std::cout << "Type 'Y' for Yes or 'N' for No";
break;
case SDT_OK_CANCEL:
std::cout << "Type 'O' for OK or 'C' for Cancel";
break;
}
std::getline(std::cin, line);
switch (type)
{
case SDT_INFO:
case SDT_WARNING:
case SDT_ERROR:
done = true;
break;
case SDT_YES_NO:
if (line == "Y" || line == "y")
{
result = SDR_YES;
done = true;
}
else if (line == "N" || line == "n")
{
result = SDR_NO;
done = true;
}
break;
case SDT_OK_CANCEL:
if (line == "O" || line == "o")
{
done = true;
result = SDR_OK;
}
else if (line == "C" || line == "c")
{
done = true;
result = SDR_CANCEL;
}
break;
}
}
return result;
}
#endif // if defined(PLATFORM_WINDOWS)

57
src/app/system.h Normal file
View File

@ -0,0 +1,57 @@
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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/.
// system.h
#pragma once
#include <string>
/**
* \enum SysDialogType Type of system dialog
*/
enum SystemDialogType
{
//! Information message
SDT_INFO,
//! Warning message
SDT_WARNING,
//! Error message
SDT_ERROR,
//! Yes/No question
SDT_YES_NO,
//! Ok/Cancel question
SDT_OK_CANCEL
};
/**
* \enum SysDialogResult Result of system dialog
*
* Means which button was pressed.
*/
enum SystemDialogResult
{
SDR_OK,
SDR_CANCEL,
SDR_YES,
SDR_NO
};
//! Displays a system dialog
SystemDialogResult SystemDialog(SystemDialogType, const std::string &title, const std::string &message);

View File

@ -0,0 +1,8 @@
#pragma once
// Macros set by CMake
#cmakedefine DEBUG
#cmakedefine PLATFORM_WINDOWS @PLATFORM_WINDOWS@
#cmakedefine PLATFORM_LINUX @PLATFORM_LINUX@
#cmakedefine PLATFORM_OTHER @PLATFORM_OTHER@

View File

@ -16,16 +16,23 @@
// event.cpp
#include <windows.h>
#include <stdio.h>
#include "common/struct.h"
#include "common/iman.h"
#include "common/event.h"
#include <string.h>
Event::Event()
{
event = EVENT_NULL;
param = 0;
axeX = 0.0f;
axeY = 0.0f;
axeZ = 0.0f;
keyState = 0;
rTime = 0.0f;
}
// Object's constructor.
@ -57,7 +64,7 @@ void CEvent::Flush()
void CEvent::MakeEvent(Event &event, EventMsg msg)
{
ZeroMemory(&event, sizeof(Event));
memset(&event, 0, sizeof(Event));
event.event = msg;
}

View File

@ -538,6 +538,8 @@ struct Event
float axeZ; // control the Z axis (-1 .. 1)
short keyState; // state of the keyboard (KS_ *)
float rTime; // relative time
Event();
};
@ -619,8 +621,6 @@ public:
bool AddEvent(const Event &event);
bool GetEvent(Event &event);
protected:
protected:
CInstanceManager* m_iMan;

View File

@ -17,7 +17,6 @@
// iman.cpp
#include <windows.h>
#include <stdio.h>
#include "common/struct.h"

View File

@ -19,12 +19,12 @@
#pragma once
#include "old/d3dengine.h"
#include "common/event.h"
class CD3DEngine;
// Possible types of the text resources.

View File

@ -19,8 +19,6 @@
#pragma once
#include <d3d.h>
#include <math/vector.h>

View File

@ -20,7 +20,6 @@
#pragma once
#include "engine.h"
#include "common/struct.h"
#include "common/event.h"

View File

@ -19,10 +19,10 @@
#pragma once
#include "common/struct.h"
#include "common/event.h"
#include "graphics/common/color.h"
#include "math/point.h"
#include "math/vector.h"

View File

@ -0,0 +1,14 @@
#include "graphics/common/device.h"
//! Sets the default values
Gfx::DeviceConfig::DeviceConfig()
{
width = 800;
height = 600;
bpp = 16;
fullScreen = false;
resizeable = false;
hardwareAccel = true;
doubleBuf = true;
noFrame = false;
}

View File

@ -22,6 +22,28 @@
namespace Gfx {
struct DeviceConfig
{
//! Screen width
int width;
//! Screen height
int height;
//! Bits per pixel
int bpp;
//! Full screen
bool fullScreen;
//! Resizeable window
bool resizeable;
//! Hardware acceleration
bool hardwareAccel;
//! Double buffering
bool doubleBuf;
//! No window frame (also set with full screen)
bool noFrame;
DeviceConfig();
};
class CDevice
{
// TODO

View File

@ -19,5 +19,55 @@
#include "graphics/common/engine.h"
#include <GL/gl.h>
#include <GL/glu.h>
// TODO implementation
Gfx::CEngine::CEngine(CInstanceManager *iMan, CApplication *app)
{
// TODO
}
Gfx::CEngine::~CEngine()
{
// TODO
}
int Gfx::CEngine::Render()
{
/* Just a hello world for now */
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glTranslatef(0.0f, 0.0f, -6.0f);
glBegin(GL_TRIANGLES);
{
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(-2.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(2.0f, -1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(0.0f, 1.5f);
}
glEnd();
glFlush();
return 1;
}

View File

@ -20,11 +20,11 @@
#pragma once
#include "common/misc.h"
#include "common/struct.h"
#include "object/object.h"
#include "math/vector.h"
class CInstanceManager;
class CObject;
class CSound;

View File

@ -20,7 +20,6 @@
#pragma once
#include "engine.h"
#include "common/struct.h"
#include "common/event.h"
#include "modfile.h"
#include "vertex.h"

View File

@ -305,7 +305,7 @@ protected:
void DrawParticuleWheel(int i);
CObject* SearchObjectGun(Math::Vector old, Math::Vector pos, ParticuleType type, CObject *father);
CObject* SearchObjectRay(Math::Vector pos, Math::Vector goal, ParticuleType type, CObject *father);
void Play(Sound sound, Math::Vector pos, float amplitude);
void Play(Snd::Sound sound, Math::Vector pos, float amplitude);
bool TrackMove(int i, Math::Vector pos, float progress);
void TrackDraw(int i, ParticuleType type);

View File

@ -19,7 +19,6 @@
#pragma once
#include "common/struct.h"
#include "common/event.h"
#include "math/point.h"

View File

@ -19,9 +19,11 @@
#pragma once
#include "graphics/common/engine.h"
#include "object/object.h"
#include "common/misc.h"
#include "graphics/common/engine.h"
//#include "object/object.h"
// TEMPORARILY!
enum ObjectType {};
class CInstanceManager;
@ -93,7 +95,7 @@ public:
CPyro(CInstanceManager* iMan);
~CPyro();
void DeleteObject(bool bAll=FALSE);
void DeleteObject(bool bAll=false);
bool Create(PyroType type, CObject* pObj, float force=1.0f);
bool EventProcess(const Event &event);
Error IsEnded();

View File

@ -62,7 +62,7 @@
#include "ui/window.h"
#include "ui/displaytext.h"
#include "old/text.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/particule.h"
#include "script/cmdtoken.h"

View File

@ -85,7 +85,7 @@
#include "ui/displaytext.h"
#include "script/cmdtoken.h"
#include "script/cbottoken.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "object/object.h"

View File

@ -21,7 +21,7 @@
#include "old/d3dengine.h"
#include "old/camera.h"
#include "sound/sound.h"
#include "old/sound.h"
class CInstanceManager;

View File

@ -69,7 +69,7 @@
#include "ui/edit.h"
#include "ui/displaytext.h"
#include "old/text.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "script/cbottoken.h"
#include "script/cmdtoken.h"
#include "object/mainmovie.h"

View File

@ -35,7 +35,7 @@
#include "old/camera.h"
#include "object/auto/auto.h"
#include "object/auto/autopara.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/blitz.h"

View File

@ -35,7 +35,7 @@
#include "old/math3d.h"
#include "old/joystick.h"
#include "object/robotmain.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/d3dapp.h"
// fix for "MSH_MOUSEWHEEL undefined" error

View File

@ -44,7 +44,7 @@
#include "old/cloud.h"
#include "old/blitz.h"
#include "old/planet.h"
#include "sound/sound.h"
#include "old/sound.h"

View File

@ -38,7 +38,7 @@
#include "object/auto/auto.h"
#include "object/robotmain.h"
#include "old/terrain.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/water.h"
#include "old/particule.h"

View File

@ -21,7 +21,7 @@
#include "math/point.h"
#include "old/d3dengine.h"
#include "sound/sound.h"
#include "old/sound.h"
class CInstanceManager;

View File

@ -39,7 +39,7 @@
#include "object/motion/motion.h"
#include "object/motion/motionhuman.h"
#include "ui/displaytext.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/pyro.h"

1659
src/old/sound.cpp Normal file

File diff suppressed because it is too large Load Diff

242
src/old/sound.h Normal file
View File

@ -0,0 +1,242 @@
// * 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/.
// sound.h
#pragma once
#include <dsound.h>
const int MAXFILES = 200;
const int MAXSOUND = 32;
const int MAXVOLUME = 20;
const int MAXOPER = 4;
class CInstanceManager;
enum Sound
{
SOUND_CLICK = 0,
SOUND_BOUM = 1,
SOUND_EXPLO = 2,
SOUND_FLYh = 3, // human
SOUND_FLY = 4,
SOUND_STEPs = 5, // smooth
SOUND_MOTORw = 6, // wheel
SOUND_MOTORt = 7, // tank
SOUND_MOTORr = 8, // roller
SOUND_ERROR = 9,
SOUND_CONVERT = 10,
SOUND_ENERGY = 11,
SOUND_PLOUF = 12,
SOUND_BLUP = 13,
SOUND_WARNING = 14,
SOUND_DERRICK = 15,
SOUND_LABO = 16,
SOUND_STATION = 17,
SOUND_REPAIR = 18,
SOUND_RESEARCH = 19,
SOUND_INSECTs = 20, // spider
SOUND_BURN = 21,
SOUND_TZOING = 22,
SOUND_GGG = 23,
SOUND_MANIP = 24,
SOUND_FIRE = 25, // shooting with fireball
SOUND_HUMAN1 = 26, // breathing
SOUND_STEPw = 27, // water
SOUND_SWIM = 28,
SOUND_RADAR = 29,
SOUND_BUILD = 30,
SOUND_ALARM = 31, // energy alarm
SOUND_SLIDE = 32,
SOUND_EXPLOi = 33, // insect
SOUND_INSECTa = 34, // ant
SOUND_INSECTb = 35, // bee
SOUND_INSECTw = 36, // worm
SOUND_INSECTm = 37, // mother
SOUND_TREMBLE = 38,
SOUND_PSHHH = 39,
SOUND_NUCLEAR = 40,
SOUND_INFO = 41,
SOUND_OPEN = 42,
SOUND_CLOSE = 43,
SOUND_FACTORY = 44,
SOUND_EGG = 45,
SOUND_MOTORs = 46, // submarine
SOUND_MOTORi = 47, // insect (legs)
SOUND_SHIELD = 48,
SOUND_FIREi = 49, // shooting with orgaball (insect)
SOUND_GUNDEL = 50,
SOUND_PSHHH2 = 51, // shield
SOUND_MESSAGE = 52,
SOUND_BOUMm = 53, // metal
SOUND_BOUMv = 54, // plant
SOUND_BOUMs = 55, // smooth
SOUND_EXPLOl = 56, // little
SOUND_EXPLOlp = 57, // little power
SOUND_EXPLOp = 58, // power
SOUND_STEPh = 59, // hard
SOUND_STEPm = 60, // metal
SOUND_POWERON = 61,
SOUND_POWEROFF = 62,
SOUND_AIE = 63,
SOUND_WAYPOINT = 64,
SOUND_RECOVER = 65,
SOUND_DEADi = 66,
SOUND_JOSTLE = 67,
SOUND_GFLAT = 68,
SOUND_DEADg = 69, // shooting death
SOUND_DEADw = 70, // drowning
SOUND_FLYf = 71, // reactor fail
SOUND_ALARMt = 72, // temperature alarm
SOUND_FINDING = 73, // finds a cache object
SOUND_THUMP = 74,
SOUND_TOUCH = 75,
SOUND_BLITZ = 76,
SOUND_MUSHROOM = 77,
SOUND_FIREp = 78, // shooting with phazer
SOUND_EXPLOg1 = 79, // impact gun 1
SOUND_EXPLOg2 = 80, // impact gun 2
SOUND_MOTORd = 81, // engine friction
};
enum SoundNext
{
SOPER_CONTINUE = 1,
SOPER_STOP = 2,
SOPER_LOOP = 3,
};
struct SoundOper
{
char bUsed;
float finalAmplitude;
float finalFrequency;
float totalTime;
float currentTime;
SoundNext nextOper;
};
struct SoundChannel
{
char bUsed; // buffer used?
char bMute; // silence?
Sound type; // SOUND_*
int priority; // so great -> important
Math::Vector pos; // position in space
unsigned short uniqueStamp; // unique marker
LPDIRECTSOUNDBUFFER soundBuffer;
LPDIRECTSOUND3DBUFFER soundBuffer3D;
float startAmplitude;
float startFrequency;
float changeFrequency;
int initFrequency;
float volume; // 2D: volume 1..0 depending on position
float pan; // 2D: pan -1..+1 depending on position
SoundOper oper[MAXOPER];
};
class CSound
{
public:
CSound(CInstanceManager* iMan);
~CSound();
void SetDebugMode(bool bMode);
bool Create(HWND hWnd, bool b3D);
void CacheAll();
void SetState(bool bState);
bool RetEnable();
void SetCDpath(char *path);
void SetAudioTrack(bool bAudio);
void SetSound3D(bool bMode);
bool RetSound3D();
bool RetSound3DCap();
void SetAudioVolume(int volume);
int RetAudioVolume();
void SetMidiVolume(int volume);
int RetMidiVolume();
void SetListener(Math::Vector eye, Math::Vector lookat);
void FrameMove(float rTime);
int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop=false);
int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop=false);
bool FlushEnvelope(int channel);
bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
bool Position(int channel, Math::Vector pos);
bool Frequency(int channel, float frequency);
bool Stop(int channel);
bool StopAll();
bool MuteAll(bool bMute);
bool PlayMusic(int rank, bool bRepeat);
bool RestartMusic();
void SuspendMusic();
void StopMusic();
bool IsPlayingMusic();
void AdaptVolumeMusic();
protected:
bool CheckChannel(int &channel);
bool CreateSoundBuffer(int channel, DWORD size, DWORD freq, DWORD bitsPerSample, DWORD blkAlign, bool bStereo);
bool ReadData(LPDIRECTSOUNDBUFFER lpDSB, Sound sound, DWORD size);
bool CreateBuffer(int channel, Sound sound);
void ComputeVolumePan2D(int channel, const Math::Vector &pos);
bool ReadFile(Sound sound, char *metaname, char *filename);
int RetPriority(Sound sound);
bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded);
void OperNext(int channel);
bool PlayAudioTrack(int rank);
protected:
CInstanceManager* m_iMan;
HWND m_hWnd;
bool m_bEnable;
bool m_bState;
bool m_bAudioTrack;
bool m_ctrl3D;
bool m_bDebugMode;
LPDIRECTSOUND m_lpDS;
LPDIRECTSOUND3DLISTENER m_listener;
SoundChannel m_channel[MAXSOUND];
char* m_files[MAXFILES];
UINT m_MidiDeviceID;
int m_MIDIMusic;
bool m_bRepeatMusic;
int m_audioVolume;
int m_midiVolume;
int m_lastMidiVolume;
Math::Vector m_eye;
Math::Vector m_lookat;
float m_lastTime;
float m_playTime;
int m_uniqueStamp;
int m_maxSound;
char m_CDpath[100];
};

View File

@ -34,7 +34,7 @@
#include "old/particule.h"
#include "old/terrain.h"
#include "object/object.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/water.h"

View File

@ -42,7 +42,7 @@
#include "object/brain.h"
#include "object/motion/motion.h"
#include "object/motion/motionhuman.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "object/task/task.h"
#include "script/cmdtoken.h"
#include "physics/physics.h"

File diff suppressed because it is too large Load Diff

View File

@ -1,242 +1,165 @@
// * 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/.
// sound.h
#pragma once
#include <dsound.h>
const int MAXFILES = 200;
const int MAXSOUND = 32;
const int MAXVOLUME = 20;
const int MAXOPER = 4;
class CInstanceManager;
enum Sound
{
SOUND_CLICK = 0,
SOUND_BOUM = 1,
SOUND_EXPLO = 2,
SOUND_FLYh = 3, // human
SOUND_FLY = 4,
SOUND_STEPs = 5, // smooth
SOUND_MOTORw = 6, // wheel
SOUND_MOTORt = 7, // tank
SOUND_MOTORr = 8, // roller
SOUND_ERROR = 9,
SOUND_CONVERT = 10,
SOUND_ENERGY = 11,
SOUND_PLOUF = 12,
SOUND_BLUP = 13,
SOUND_WARNING = 14,
SOUND_DERRICK = 15,
SOUND_LABO = 16,
SOUND_STATION = 17,
SOUND_REPAIR = 18,
SOUND_RESEARCH = 19,
SOUND_INSECTs = 20, // spider
SOUND_BURN = 21,
SOUND_TZOING = 22,
SOUND_GGG = 23,
SOUND_MANIP = 24,
SOUND_FIRE = 25, // shooting with fireball
SOUND_HUMAN1 = 26, // breathing
SOUND_STEPw = 27, // water
SOUND_SWIM = 28,
SOUND_RADAR = 29,
SOUND_BUILD = 30,
SOUND_ALARM = 31, // energy alarm
SOUND_SLIDE = 32,
SOUND_EXPLOi = 33, // insect
SOUND_INSECTa = 34, // ant
SOUND_INSECTb = 35, // bee
SOUND_INSECTw = 36, // worm
SOUND_INSECTm = 37, // mother
SOUND_TREMBLE = 38,
SOUND_PSHHH = 39,
SOUND_NUCLEAR = 40,
SOUND_INFO = 41,
SOUND_OPEN = 42,
SOUND_CLOSE = 43,
SOUND_FACTORY = 44,
SOUND_EGG = 45,
SOUND_MOTORs = 46, // submarine
SOUND_MOTORi = 47, // insect (legs)
SOUND_SHIELD = 48,
SOUND_FIREi = 49, // shooting with orgaball (insect)
SOUND_GUNDEL = 50,
SOUND_PSHHH2 = 51, // shield
SOUND_MESSAGE = 52,
SOUND_BOUMm = 53, // metal
SOUND_BOUMv = 54, // plant
SOUND_BOUMs = 55, // smooth
SOUND_EXPLOl = 56, // little
SOUND_EXPLOlp = 57, // little power
SOUND_EXPLOp = 58, // power
SOUND_STEPh = 59, // hard
SOUND_STEPm = 60, // metal
SOUND_POWERON = 61,
SOUND_POWEROFF = 62,
SOUND_AIE = 63,
SOUND_WAYPOINT = 64,
SOUND_RECOVER = 65,
SOUND_DEADi = 66,
SOUND_JOSTLE = 67,
SOUND_GFLAT = 68,
SOUND_DEADg = 69, // shooting death
SOUND_DEADw = 70, // drowning
SOUND_FLYf = 71, // reactor fail
SOUND_ALARMt = 72, // temperature alarm
SOUND_FINDING = 73, // finds a cache object
SOUND_THUMP = 74,
SOUND_TOUCH = 75,
SOUND_BLITZ = 76,
SOUND_MUSHROOM = 77,
SOUND_FIREp = 78, // shooting with phazer
SOUND_EXPLOg1 = 79, // impact gun 1
SOUND_EXPLOg2 = 80, // impact gun 2
SOUND_MOTORd = 81, // engine friction
};
enum SoundNext
{
SOPER_CONTINUE = 1,
SOPER_STOP = 2,
SOPER_LOOP = 3,
};
struct SoundOper
{
char bUsed;
float finalAmplitude;
float finalFrequency;
float totalTime;
float currentTime;
SoundNext nextOper;
};
struct SoundChannel
{
char bUsed; // buffer used?
char bMute; // silence?
Sound type; // SOUND_*
int priority; // so great -> important
Math::Vector pos; // position in space
unsigned short uniqueStamp; // unique marker
LPDIRECTSOUNDBUFFER soundBuffer;
LPDIRECTSOUND3DBUFFER soundBuffer3D;
float startAmplitude;
float startFrequency;
float changeFrequency;
int initFrequency;
float volume; // 2D: volume 1..0 depending on position
float pan; // 2D: pan -1..+1 depending on position
SoundOper oper[MAXOPER];
};
class CSound
{
public:
CSound(CInstanceManager* iMan);
~CSound();
void SetDebugMode(bool bMode);
bool Create(HWND hWnd, bool b3D);
void CacheAll();
void SetState(bool bState);
bool RetEnable();
void SetCDpath(char *path);
void SetAudioTrack(bool bAudio);
void SetSound3D(bool bMode);
bool RetSound3D();
bool RetSound3DCap();
void SetAudioVolume(int volume);
int RetAudioVolume();
void SetMidiVolume(int volume);
int RetMidiVolume();
void SetListener(Math::Vector eye, Math::Vector lookat);
void FrameMove(float rTime);
int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop=false);
int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop=false);
bool FlushEnvelope(int channel);
bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper);
bool Position(int channel, Math::Vector pos);
bool Frequency(int channel, float frequency);
bool Stop(int channel);
bool StopAll();
bool MuteAll(bool bMute);
bool PlayMusic(int rank, bool bRepeat);
bool RestartMusic();
void SuspendMusic();
void StopMusic();
bool IsPlayingMusic();
void AdaptVolumeMusic();
protected:
bool CheckChannel(int &channel);
bool CreateSoundBuffer(int channel, DWORD size, DWORD freq, DWORD bitsPerSample, DWORD blkAlign, bool bStereo);
bool ReadData(LPDIRECTSOUNDBUFFER lpDSB, Sound sound, DWORD size);
bool CreateBuffer(int channel, Sound sound);
void ComputeVolumePan2D(int channel, const Math::Vector &pos);
bool ReadFile(Sound sound, char *metaname, char *filename);
int RetPriority(Sound sound);
bool SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded);
void OperNext(int channel);
bool PlayAudioTrack(int rank);
protected:
CInstanceManager* m_iMan;
HWND m_hWnd;
bool m_bEnable;
bool m_bState;
bool m_bAudioTrack;
bool m_ctrl3D;
bool m_bDebugMode;
LPDIRECTSOUND m_lpDS;
LPDIRECTSOUND3DLISTENER m_listener;
SoundChannel m_channel[MAXSOUND];
char* m_files[MAXFILES];
UINT m_MidiDeviceID;
int m_MIDIMusic;
bool m_bRepeatMusic;
int m_audioVolume;
int m_midiVolume;
int m_lastMidiVolume;
Math::Vector m_eye;
Math::Vector m_lookat;
float m_lastTime;
float m_playTime;
int m_uniqueStamp;
int m_maxSound;
char m_CDpath[100];
};
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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/.
// sound.h
#pragma once
#include "math/vector.h"
class CInstanceManager;
namespace Snd {
const int MAXFILES = 200;
const int MAXSOUND = 32;
const int MAXVOLUME = 20;
const int MAXOPER = 4;
enum Sound
{
SOUND_CLICK = 0,
SOUND_BOUM = 1,
SOUND_EXPLO = 2,
SOUND_FLYh = 3, // human
SOUND_FLY = 4,
SOUND_STEPs = 5, // smooth
SOUND_MOTORw = 6, // wheel
SOUND_MOTORt = 7, // tank
SOUND_MOTORr = 8, // roller
SOUND_ERROR = 9,
SOUND_CONVERT = 10,
SOUND_ENERGY = 11,
SOUND_PLOUF = 12,
SOUND_BLUP = 13,
SOUND_WARNING = 14,
SOUND_DERRICK = 15,
SOUND_LABO = 16,
SOUND_STATION = 17,
SOUND_REPAIR = 18,
SOUND_RESEARCH = 19,
SOUND_INSECTs = 20, // spider
SOUND_BURN = 21,
SOUND_TZOING = 22,
SOUND_GGG = 23,
SOUND_MANIP = 24,
SOUND_FIRE = 25, // shooting with fireball
SOUND_HUMAN1 = 26, // breathing
SOUND_STEPw = 27, // water
SOUND_SWIM = 28,
SOUND_RADAR = 29,
SOUND_BUILD = 30,
SOUND_ALARM = 31, // energy alarm
SOUND_SLIDE = 32,
SOUND_EXPLOi = 33, // insect
SOUND_INSECTa = 34, // ant
SOUND_INSECTb = 35, // bee
SOUND_INSECTw = 36, // worm
SOUND_INSECTm = 37, // mother
SOUND_TREMBLE = 38,
SOUND_PSHHH = 39,
SOUND_NUCLEAR = 40,
SOUND_INFO = 41,
SOUND_OPEN = 42,
SOUND_CLOSE = 43,
SOUND_FACTORY = 44,
SOUND_EGG = 45,
SOUND_MOTORs = 46, // submarine
SOUND_MOTORi = 47, // insect (legs)
SOUND_SHIELD = 48,
SOUND_FIREi = 49, // shooting with orgaball (insect)
SOUND_GUNDEL = 50,
SOUND_PSHHH2 = 51, // shield
SOUND_MESSAGE = 52,
SOUND_BOUMm = 53, // metal
SOUND_BOUMv = 54, // plant
SOUND_BOUMs = 55, // smooth
SOUND_EXPLOl = 56, // little
SOUND_EXPLOlp = 57, // little power
SOUND_EXPLOp = 58, // power
SOUND_STEPh = 59, // hard
SOUND_STEPm = 60, // metal
SOUND_POWERON = 61,
SOUND_POWEROFF = 62,
SOUND_AIE = 63,
SOUND_WAYPOINT = 64,
SOUND_RECOVER = 65,
SOUND_DEADi = 66,
SOUND_JOSTLE = 67,
SOUND_GFLAT = 68,
SOUND_DEADg = 69, // shooting death
SOUND_DEADw = 70, // drowning
SOUND_FLYf = 71, // reactor fail
SOUND_ALARMt = 72, // temperature alarm
SOUND_FINDING = 73, // finds a cache object
SOUND_THUMP = 74,
SOUND_TOUCH = 75,
SOUND_BLITZ = 76,
SOUND_MUSHROOM = 77,
SOUND_FIREp = 78, // shooting with phazer
SOUND_EXPLOg1 = 79, // impact gun 1
SOUND_EXPLOg2 = 80, // impact gun 2
SOUND_MOTORd = 81, // engine friction
};
enum SoundNext
{
SOPER_CONTINUE = 1,
SOPER_STOP = 2,
SOPER_LOOP = 3,
};
struct SoundOper
{
char bUsed;
float finalAmplitude;
float finalFrequency;
float totalTime;
float currentTime;
Snd::SoundNext nextOper;
};
struct SoundChannel
{
char bUsed; // buffer used?
char bMute; // silence?
Snd::Sound type; // SOUND_*
int priority; // so great -> important
Math::Vector pos; // position in space
unsigned short uniqueStamp; // unique marker
// LPDIRECTSOUNDBUFFER soundBuffer;
// LPDIRECTSOUND3DBUFFER soundBuffer3D;
float startAmplitude;
float startFrequency;
float changeFrequency;
int initFrequency;
float volume; // 2D: volume 1..0 depending on position
float pan; // 2D: pan -1..+1 depending on position
Snd::SoundOper oper[MAXOPER];
};
class CSound
{
// TODO
};
}; // namespace Sound

View File

@ -31,7 +31,7 @@
#include "common/misc.h"
#include "common/iman.h"
#include "old/text.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "ui/control.h"

View File

@ -36,7 +36,7 @@
#include "ui/window.h"
#include "ui/group.h"
#include "old/text.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "ui/displaytext.h"

View File

@ -28,7 +28,7 @@
#include "common/misc.h"
#include "common/iman.h"
#include "common/restext.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "old/text.h"
#include "ui/key.h"

View File

@ -52,7 +52,7 @@
#include "ui/editvalue.h"
#include "old/text.h"
#include "old/camera.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "script/cmdtoken.h"
#include "object/robotmain.h"
#include "ui/maindialog.h"

View File

@ -38,7 +38,7 @@
#include "object/robotmain.h"
#include "object/object.h"
#include "old/camera.h"
#include "sound/sound.h"
#include "old/sound.h"
#include "script/script.h"
#include "ui/interface.h"
#include "ui/button.h"