From 8798f7dd40485bd905e36290169f02d1ecd442fe Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 14 Jan 2012 18:34:14 -0500 Subject: [PATCH 001/586] Bringing in some of Azathoth's work --- CMakeLists.txt | 1 + apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwrender/water.cpp | 104 ++++++++++++++ apps/openmw/mwrender/water.hpp | 45 +++++++ apps/openmw/mwworld/scene.cpp | 122 +++++------------ files/CMakeLists.txt | 12 ++ files/plugins.cfg.linux | 2 +- files/water/Example_Fresnel.cg | 116 ++++++++++++++++ files/water/Example_FresnelPS.asm | 72 ++++++++++ files/water/GlassFP.cg | 15 +++ files/water/GlassVP.cg | 24 ++++ files/water/Water02.jpg | Bin 0 -> 185893 bytes files/water/caustic_0.png | Bin 0 -> 35147 bytes files/water/perlinvolume.dds | Bin 0 -> 2097280 bytes files/water/water.compositor | 21 +++ files/water/water.material | 217 ++++++++++++++++++++++++++++++ files/water/waves2.dds | Bin 0 -> 262272 bytes 17 files changed, 661 insertions(+), 92 deletions(-) create mode 100644 apps/openmw/mwrender/water.cpp create mode 100644 apps/openmw/mwrender/water.hpp create mode 100644 files/CMakeLists.txt create mode 100644 files/water/Example_Fresnel.cg create mode 100644 files/water/Example_FresnelPS.asm create mode 100644 files/water/GlassFP.cg create mode 100644 files/water/GlassVP.cg create mode 100644 files/water/Water02.jpg create mode 100644 files/water/caustic_0.png create mode 100644 files/water/perlinvolume.dds create mode 100644 files/water/water.compositor create mode 100644 files/water/water.material create mode 100644 files/water/waves2.dds diff --git a/CMakeLists.txt b/CMakeLists.txt index 723d10b34..b3439d1a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,7 @@ link_directories(${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR}) add_subdirectory( extern/caelum ) add_subdirectory( extern/mygui_3.0.1 ) +add_subdirectory( files/) # Make sure that certain libraries are used as static libraries # This is in effect turns off __declspec (dllexport) for windows diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index e17a2cb25..f1d940253 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging sky player npcs creatures objects renderinginterface + renderingmanager debugging sky player npcs creatures objects renderinginterface water ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp new file mode 100644 index 000000000..acfda488b --- /dev/null +++ b/apps/openmw/mwrender/water.cpp @@ -0,0 +1,104 @@ +#include "water.hpp" + +namespace MWRender { + Water::Water (Ogre::Camera *camera) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { + + try { + Ogre::CompositorManager::getSingleton().addCompositor(mViewport, "Water", -1); + Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); + } catch(...) { + } + mIsUnderwater = false; + + mCamera->addListener(this); + + + for (unsigned int i = 0; i < 2; i++) { + Ogre::TexturePtr tex = Ogre::TextureManager::getSingleton().createManual(i == 0 ? "refraction" : "reflection", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 512, 512, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET); + + Ogre::RenderTarget* rtt = tex->getBuffer()->getRenderTarget(); + rtt->addViewport(mCamera)->setOverlaysEnabled(false); + rtt->addListener(this); + + if (i == 0) mRefractionTarget = rtt; + else mReflectionTarget = rtt; + } + + + mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, 0); + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 7000, 7000, 10, 10, true, 1, 3, 5, Ogre::Vector3::UNIT_Z); + + + mWater = mSceneManager->createEntity("Water", "water"); + mWater->setMaterialName("Water/ReflectionRefraction"); + mWaterNode = mSceneManager->getRootSceneNode()->createChildSceneNode(); + mWaterNode->attachObject(mWater); + + } + + + Water::~Water() { + Ogre::MeshManager::getSingleton().remove("water"); + Ogre::TextureManager::getSingleton().remove("refraction"); + Ogre::TextureManager::getSingleton().remove("reflection"); + Ogre::CompositorManager::getSingleton().removeCompositorChain(mViewport); + } + + + void Water::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) { + mWater->setVisible(false); + + if (evt.source == mReflectionTarget) { + mCamera->enableReflection(mWaterPlane); + } else { + } + } + + void Water::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) { + mWater->setVisible(true); + + if (evt.source == mReflectionTarget) { + mCamera->disableReflection(); + } else { + } + } + + void Water::checkUnderwater() { + Ogre::Vector3 pos = mCamera->getPosition(); + if (mIsUnderwater && pos.y > 0) { + try { + Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); + } catch(...) { + } + std::cout << "Removing water compositor" << "\n"; + mIsUnderwater = false; + } + + if (!mIsUnderwater && pos.y < 0) { + try { + Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", true); + } catch(...) { + } + mIsUnderwater = true; + std::cout << "Adding water compositor" << "\n"; + } + } + + + void Water::cameraPreRenderScene(Ogre::Camera *cam) { + Ogre::Vector3 pos = cam->getPosition(); + + if (pos != mOldCameraPos) { + mWaterNode->setPosition(pos.x, 0, pos.z); + + mOldCameraPos = pos; + } + } + + void Water::cameraPostRenderScene(Ogre::Camera *cam) { + } + + void Water::cameraDestroyed(Ogre::Camera *cam) { + } + +} diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp new file mode 100644 index 000000000..8e04ca3c8 --- /dev/null +++ b/apps/openmw/mwrender/water.hpp @@ -0,0 +1,45 @@ +#ifndef GAME_MWRENDER_WATER_H +#define GAME_MWRENDER_WATER_H + +#include + + +namespace MWRender { + + /// Water rendering + class Water : Ogre::RenderTargetListener, Ogre::Camera::Listener { + Ogre::Camera *mCamera; + Ogre::SceneManager *mSceneManager; + Ogre::Viewport *mViewport; + + Ogre::RenderTarget *mRefractionTarget; + Ogre::RenderTarget *mReflectionTarget; + + Ogre::Plane mWaterPlane; + Ogre::SceneNode *mWaterNode; + Ogre::Entity *mWater; + + Ogre::Vector3 mOldCameraPos; + bool mIsUnderwater; + + + + void preRenderTargetUpdate(const Ogre::RenderTargetEvent&); + void postRenderTargetUpdate(const Ogre::RenderTargetEvent&); + + void cameraPreRenderScene(Ogre::Camera *cam); + void cameraPostRenderScene(Ogre::Camera *cam); + void cameraDestroyed(Ogre::Camera *cam); + + public: + + Water (Ogre::Camera *camera); + ~Water(); + + void checkUnderwater(); + + + }; +} + +#endif diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index c9d477833..152e00130 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -15,30 +15,6 @@ namespace { - - -template -void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) -{ - if (!cellRefList.list.empty()) - { - //const MWWorld::Class& class_ = MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell)); - - for (typename T::List::iterator it = cellRefList.list.begin(); - it != cellRefList.list.end(); it++) - { - if (it->mData.getCount() || it->mData.isEnabled()) - { - MWWorld::Ptr ptr (&*it, &cell); - /* TODO: call - * RenderingManager.insertObject - * class_.insertObjectPhysic - * class_.insertObjectMechanics - */ - } - } - } -} template void insertCellRefList(MWRender::RenderingManager& rendering, MWWorld::Environment& environment, T& cellRefList, ESMS::CellStore &cell, MWWorld::PhysicsSystem& physics) @@ -76,20 +52,22 @@ void insertCellRefList(MWRender::RenderingManager& rendering, MWWorld::Environme namespace MWWorld { - + void Scene::unloadCell (CellStoreCollection::iterator iter) { - + std::cout << "Unloading cell\n"; ListHandles functor; - + MWWorld::Ptr::CellStore* active = *iter; - mRendering.removeCell(active); + + + active->forEach(functor); - { + { + - // silence annoying g++ warning for (std::vector::const_iterator iter (functor.mHandles.begin()); iter!=functor.mHandles.end(); ++iter){ @@ -97,10 +75,13 @@ namespace MWWorld mPhysics->removeObject (node->getName()); } } + mRendering.removeCell(active); + //mPhysics->removeObject("Unnamed_43"); mWorld->getLocalScripts().clearCell (active); mEnvironment.mMechanicsManager->dropActors (active); mEnvironment.mSoundManager->stopSound (active); - mActiveCells.erase (iter); + mActiveCells.erase(active); + } void Scene::loadCell (Ptr::CellStore *cell) @@ -108,18 +89,18 @@ namespace MWWorld // register local scripts mWorld->getLocalScripts().addCell (cell); - + std::pair result = mActiveCells.insert(cell); if(result.second){ insertCell(*cell, mEnvironment); - mRendering.getObjects().buildStaticGeometry(*cell); + //mRendering.cellAdded (cell); mRendering.configureAmbient(*cell); - + } - - + + } void Scene::playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, @@ -140,15 +121,13 @@ namespace MWWorld mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); CellStoreCollection::iterator active = mActiveCells.begin(); - Ptr::CellStore* cellstore = *active; - + while (active!=mActiveCells.end()) { - cellstore = *active; - if (!(cellstore->cell->data.flags & ESM::Cell::Interior)) + if (!((*active)->cell->data.flags & ESM::Cell::Interior)) { - if (std::abs (X-cellstore->cell->data.gridX)<=1 && - std::abs (Y-cellstore->cell->data.gridY)<=1) + if (std::abs (X-(*active)->cell->data.gridX)<=1 && + std::abs (Y-(*active)->cell->data.gridY)<=1) { // keep cells within the new 3x3 grid ++active; @@ -164,15 +143,13 @@ namespace MWWorld for (int y=Y-1; y<=Y+1; ++y) { CellStoreCollection::iterator iter = mActiveCells.begin(); - while (iter!=mActiveCells.end()) { - cellstore = *iter; - assert (!(cellstore->cell->data.flags & ESM::Cell::Interior)); + assert (!((*iter)->cell->data.flags & ESM::Cell::Interior)); - if (x==cellstore->cell->data.gridX && - y==cellstore->cell->data.gridY) + if (x==(*iter)->cell->data.gridX && + y==(*iter)->cell->data.gridY) break; ++iter; @@ -188,15 +165,13 @@ namespace MWWorld // find current cell CellStoreCollection::iterator iter = mActiveCells.begin(); - while (iter!=mActiveCells.end()) { - cellstore = *iter; - assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); + assert (!((*iter)->cell->data.flags & ESM::Cell::Interior)); - if (X==cellstore->cell->data.gridX && - Y==cellstore->cell->data.gridY) + if (X==(*iter)->cell->data.gridX && + Y==(*iter)->cell->data.gridY) break; ++iter; @@ -204,7 +179,7 @@ namespace MWWorld assert (iter!=mActiveCells.end()); - mCurrentCell = cellstore; + mCurrentCell = *iter; // adjust player playerCellChange (mWorld->getExterior(X, Y), position, adjustPlayerPos); @@ -215,10 +190,10 @@ namespace MWWorld mCellChanged = true; } - //We need the ogre renderer and a scene node. + //We need the ogre renderer and a scene node. Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, PhysicsSystem *physics) - : mRendering(rendering), mCurrentCell (0), - mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) + : mCurrentCell (0), mCellChanged (false), mEnvironment (environment), mWorld(world), + mPhysics(physics), mRendering(rendering) { } @@ -241,7 +216,7 @@ namespace MWWorld std::cout << "Changing to interior\n"; // remove active CellStoreCollection::iterator active = mActiveCells.begin(); - std::cout << "Size: " << mActiveCells.size() << "\n"; + while (active!=mActiveCells.end()) { unloadCell (active++); @@ -261,7 +236,6 @@ namespace MWWorld mWorld->adjustSky(); mCellChanged = true; - //currentRegion->name = ""; } void Scene::changeToExteriorCell (const ESM::Position& position) @@ -284,38 +258,6 @@ namespace MWWorld mCellChanged = false; } -/*#include -#include -#include - -#include "../mwworld/class.hpp" -#include "../mwworld/ptr.hpp"*/ - -void Scene::insertCell(ESMS::CellStore &cell) -{ - // Loop through all references in the cell - insertCellRefList (cell.activators, cell); - insertCellRefList (cell.potions, cell); - insertCellRefList (cell.appas, cell); - insertCellRefList (cell.armors, cell); - insertCellRefList (cell.books, cell); - insertCellRefList (cell.clothes, cell); - insertCellRefList (cell.containers, cell); - insertCellRefList (cell.creatures, cell); - insertCellRefList (cell.doors, cell); - insertCellRefList (cell.ingreds, cell); - insertCellRefList (cell.creatureLists, cell); - insertCellRefList (cell.itemLists, cell); - insertCellRefList (cell.lights, cell); - insertCellRefList (cell.lockpicks, cell); - insertCellRefList (cell.miscItems, cell); - insertCellRefList (cell.npcs, cell); - insertCellRefList (cell.probes, cell); - insertCellRefList (cell.repairs, cell); - insertCellRefList (cell.statics, cell); - insertCellRefList(cell.weapons, cell); -} - void Scene::insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment) { diff --git a/files/CMakeLists.txt b/files/CMakeLists.txt new file mode 100644 index 000000000..720044df8 --- /dev/null +++ b/files/CMakeLists.txt @@ -0,0 +1,12 @@ +project(resources) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/caustic_0.png "${OpenMW_BINARY_DIR}/resources/water/caustic_0.png" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/Example_Fresnel.cg "${OpenMW_BINARY_DIR}/resources/water/Example_Fresnel.cg" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/Example_FresnelPS.asm "${OpenMW_BINARY_DIR}/resources/water/Example_FresnelPS.asm" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/GlassFP.cg "${OpenMW_BINARY_DIR}/resources/water/GlassFP.cg" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/GlassVP.cg "${OpenMW_BINARY_DIR}/resources/water/GlassVP.cg" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/perlinvolume.dds "${OpenMW_BINARY_DIR}/resources/water/perlinvolume.dds" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/Water02.jpg "${OpenMW_BINARY_DIR}/resources/water/Water02.jpg" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/water.compositor "${OpenMW_BINARY_DIR}/resources/water/water.compositor" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/water.material "${OpenMW_BINARY_DIR}/resources/water/water.material" COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/water/waves2.dds "${OpenMW_BINARY_DIR}/resources/water/waves2.dds" COPYONLY) diff --git a/files/plugins.cfg.linux b/files/plugins.cfg.linux index b6e104351..2921153b4 100644 --- a/files/plugins.cfg.linux +++ b/files/plugins.cfg.linux @@ -7,6 +7,6 @@ PluginFolder=${OGRE_PLUGIN_DIR} Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager diff --git a/files/water/Example_Fresnel.cg b/files/water/Example_Fresnel.cg new file mode 100644 index 000000000..e091fc587 --- /dev/null +++ b/files/water/Example_Fresnel.cg @@ -0,0 +1,116 @@ +// Vertex program for fresnel reflections / refractions +void main_vp( + float4 pos : POSITION, + float4 normal : NORMAL, + float2 tex : TEXCOORD0, + + out float4 oPos : POSITION, + out float3 noiseCoord : TEXCOORD0, + out float4 projectionCoord : TEXCOORD1, + out float3 oEyeDir : TEXCOORD2, + out float3 oNormal : TEXCOORD3, + + uniform float4x4 worldViewProjMatrix, + uniform float3 eyePosition, // object space + uniform float timeVal, + uniform float scale, // the amount to scale the noise texture by + uniform float scroll, // the amount by which to scroll the noise + uniform float noise // the noise perturb as a factor of the time + ) +{ + oPos = mul(worldViewProjMatrix, pos); + // Projective texture coordinates, adjust for mapping + float4x4 scalemat = float4x4(0.5, 0, 0, 0.5, + 0,-0.5, 0, 0.5, + 0, 0, 0.5, 0.5, + 0, 0, 0, 1); + projectionCoord = mul(scalemat, oPos); + // Noise map coords + noiseCoord.xy = (tex + (timeVal * scroll)) * scale; + noiseCoord.z = noise * timeVal; + + oEyeDir = normalize(pos.xyz - eyePosition); + oNormal = normal.rgb; + +} + +// Fragment program for distorting a texture using a 3D noise texture +void main_fp( + float3 noiseCoord : TEXCOORD0, + float4 projectionCoord : TEXCOORD1, + float3 eyeDir : TEXCOORD2, + float3 normal : TEXCOORD3, + + out float4 col : COLOR, + + uniform float4 tintColour, + uniform float noiseScale, + uniform float fresnelBias, + uniform float fresnelScale, + uniform float fresnelPower, + uniform sampler2D waterTex : register(s0), + uniform sampler2D noiseMap : register(s1), + uniform sampler2D reflectMap : register(s2), + uniform sampler2D refractMap : register(s3) + ) +{ + // Do the tex projection manually so we can distort _after_ + float2 final = projectionCoord.xy / projectionCoord.w; + + // Noise + float3 noiseNormal = (tex2D(noiseMap, (noiseCoord.xy / 5)).rgb - 0.5).rbg * noiseScale; + final += noiseNormal.xz; + + // Fresnel + //normal = normalize(normal + noiseNormal.xz); + float fresnel = fresnelBias + fresnelScale * pow(1 + dot(eyeDir, normal), fresnelPower); + + // Reflection / refraction + float4 reflectionColour = tex2D(reflectMap, final); + float4 refractionColour = tex2D(refractMap, final) + tintColour; + + // Final colour + col = lerp(refractionColour, reflectionColour, fresnel) * tex2D(waterTex, noiseNormal) / 3 ; + + +} + + +// Old version to match ATI PS 1.3 implementation +void main_vp_old( + float4 pos : POSITION, + float4 normal : NORMAL, + float2 tex : TEXCOORD0, + + out float4 oPos : POSITION, + out float fresnel : COLOR, + out float3 noiseCoord : TEXCOORD0, + out float4 projectionCoord : TEXCOORD1, + + uniform float4x4 worldViewProjMatrix, + uniform float3 eyePosition, // object space + uniform float fresnelBias, + uniform float fresnelScale, + uniform float fresnelPower, + uniform float timeVal, + uniform float scale, // the amount to scale the noise texture by + uniform float scroll, // the amount by which to scroll the noise + uniform float noise // the noise perturb as a factor of the time + ) +{ + oPos = mul(worldViewProjMatrix, pos); + // Projective texture coordinates, adjust for mapping + float4x4 scalemat = float4x4(0.5, 0, 0, 0.5, + 0,-0.5, 0, 0.5, + 0, 0, 0.5, 0.5, + 0, 0, 0, 1); + projectionCoord = mul(scalemat, oPos); + // Noise map coords + noiseCoord.xy = (tex + (timeVal * scroll)) * scale; + noiseCoord.z = noise * timeVal; + + // calc fresnel factor (reflection coefficient) + float3 eyeDir = normalize(pos.xyz - eyePosition); + fresnel = fresnelBias + fresnelScale * pow(1 + dot(eyeDir, normal), fresnelPower); + +} diff --git a/files/water/Example_FresnelPS.asm b/files/water/Example_FresnelPS.asm new file mode 100644 index 000000000..2de078ef5 --- /dev/null +++ b/files/water/Example_FresnelPS.asm @@ -0,0 +1,72 @@ +ps.1.4 + // conversion from Cg generated ARB_fragment_program to ps.1.4 by NFZ + // command line args: -profile arbfp1 -entry main_fp + // program main_fp + // c0 : distortionRange + // c1 : tintColour + // testure 0 : noiseMap + // texture 1 : reflectMap + // texture 2 : refractMap + // v0.x : fresnel + // t0.xyz : noiseCoord + // t1.xyw : projectionCoord + +def c2, 2, 1, 0, 0 + + // Cg: distort.x = tex3D(noiseMap, noiseCoord).x; + // arbfp1: TEX R0.x, fragment.texcoord[0], texture[0], 3D; + // sample noise map using noiseCoord in TEX unit 0 + +texld r0, t0.xyz + + // get projected texture coordinates from TEX coord 1 + // will be used in phase 2 + +texcrd r1.xy, t1_dw.xyw +mov r1.z, c2.y + + // Cg: distort.y = tex3D(noiseMap, noiseCoord + yoffset).x; + // arbfp1: ADD R1.xyz, fragment.texcoord[0], c1; + // arbfp1: TEX R1.x, R1, texture[0], 3D; + // arbfp1: MOV R0.y, R1.x; + + // Cg: distort = (distort * 2 - 1) * distortionRange; + // arbfp1: MAD R0.xy, R0, c0.x, -c0.y; + // arbfp1: MUL R0.xy, R0, u0.x; + // (distort * 2 - 1) same as 2*(distort -.5) so use _bx2 + + + // Cg: final = projectionCoord.xy / projectionCoord.w; + // Cg: final += distort; + // arbfp1: RCP R0.w, fragment.texcoord[1].w; + // arbfp1: MAD R0.xy, fragment.texcoord[1], R0.w, R0; + // final = (distort * projectionCoord.w) + projectionCoord.xy + // for ps.1.4 have to re-arrange things a bit to perturb projected texture coordinates + +mad r0.xyz, r0_bx2, c0.x, r1 + +phase + + // do dependant texture reads + // Cg: reflectionColour = tex2D(reflectMap, final); + // arbfp1: TEX R0, R0, texture[1], 2D; + // sampe reflectMap using dependant read : texunit 1 + +texld r1, r0.xyz + + // Cg: refractionColour = tex2D(refractMap, final) + tintColour; + // arbfp1: TEX R1, R0, texture[2], 2D; + // sample refractMap : texunit 2 + +texld r2, r0.xyz + + // adding tintColour that is in global c1 + // arbfp1: ADD R1, R1, u1; + +add r2, r2, c1 + + // Cg: col = lerp(refractionColour, reflectionColour, fresnel); + // arbfp1: ADD R0, R0, -R1; + // arbfp1: MAD result.color, fragment.color.primary.x, R0, R1; + +lrp r0, v0.x, r1, r2 diff --git a/files/water/GlassFP.cg b/files/water/GlassFP.cg new file mode 100644 index 000000000..eb18885d2 --- /dev/null +++ b/files/water/GlassFP.cg @@ -0,0 +1,15 @@ +sampler RT : register(s0); +sampler NormalMap : register(s1); +sampler CausticMap : register(s2); + +float4 main_ps(float2 iTexCoord : TEXCOORD0, + float3 noiseCoord : TEXCOORD1, + uniform float4 tintColour) : COLOR +{ + float4 normal = tex2D(NormalMap, noiseCoord); + + + return tex2D(RT, iTexCoord + normal.xy * 0.05) + + (tex2D(CausticMap, noiseCoord) / 5) + + tintColour ; +} diff --git a/files/water/GlassVP.cg b/files/water/GlassVP.cg new file mode 100644 index 000000000..71153769c --- /dev/null +++ b/files/water/GlassVP.cg @@ -0,0 +1,24 @@ +void glass_vp +( + in float4 inPos : POSITION, + + out float4 pos : POSITION, + out float2 uv0 : TEXCOORD0, + out float4 noiseCoord : TEXCOORD1, + + uniform float4x4 worldViewProj, + uniform float timeVal, + uniform float scale +) +{ + // Use standardise transform, so work accord with render system specific (RS depth, requires texture flipping, etc) + pos = mul(worldViewProj, inPos); + + // The input positions adjusted by texel offsets, so clean up inaccuracies + inPos.xy = sign(inPos.xy); + + // Convert to image-space + uv0 = (float2(inPos.x, -inPos.y) + 1.0f) * 0.5f; + noiseCoord = (pos + timeVal) * scale; +} + diff --git a/files/water/Water02.jpg b/files/water/Water02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3efda7b6a88488f34f83ef292e57466db09818d3 GIT binary patch literal 185893 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 literal 0 HcmV?d00001 diff --git a/files/water/caustic_0.png b/files/water/caustic_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fee464860ea42100b844a4d8dfaa101c3bb80a88 GIT binary patch literal 35147 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Ⓢ+p>caiAE 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�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⩔jXf~T)t@b>`XZ1}WXzmgvic~p|ZvqVA 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

3X6KRrMiKbQ@^|Ag;R0leCt%5#7~ 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%0A}9&@$#GffZoEiQ0$R6dA|3w27HBm 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 z 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

N+W*Q_>{H&2lwvZn*zEswczQ!I5ARL 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 AApigX literal 0 HcmV?d00001 diff --git a/files/water/water.compositor b/files/water/water.compositor new file mode 100644 index 000000000..67bf90896 --- /dev/null +++ b/files/water/water.compositor @@ -0,0 +1,21 @@ +compositor Water +{ + technique + { + texture rt0 target_width target_height PF_R8G8B8 + + target rt0 { input previous } + + target_output + { + // Start with clear output + input none + + pass render_quad + { + material Water/Compositor + input 0 rt0 + } + } + } +} diff --git a/files/water/water.material b/files/water/water.material new file mode 100644 index 000000000..9929feabc --- /dev/null +++ b/files/water/water.material @@ -0,0 +1,217 @@ +// Derived from ogre samples + + +vertex_program Water/GlassVP cg +{ + source GlassVP.cg + entry_point glass_vp + profiles vs_1_1 arbvp1 + + default_params + { + param_named_auto worldViewProj worldviewproj_matrix + } +} + + +fragment_program Water/GlassFP cg +{ + source GlassFP.cg + entry_point main_ps + profiles ps_2_0 arbfp1 +} + +material Water/Compositor +{ + technique + { + pass + { + depth_check off + + vertex_program_ref Water/GlassVP + { + param_named_auto timeVal time 0.25 + param_named scale float 0.1 + } + + fragment_program_ref Water/GlassFP + { + param_named tintColour float4 0 0.35 0.35 1 + } + + texture_unit RT + { + tex_coord_set 0 + tex_address_mode clamp + filtering linear linear linear + } + + texture_unit + { + texture WaterNormal1.tga 2d + tex_coord_set 1 + //tex_address_mode clamp + filtering linear linear linear + } + texture_unit + { + texture caustic_0.png 2d + tex_coord_set 2 + //tex_address_mode clamp + filtering linear linear linear + } + } + } +} + + + + + + + +vertex_program Water/RefractReflectVP cg +{ + source Example_Fresnel.cg + entry_point main_vp + profiles vs_1_1 arbvp1 +} +vertex_program Water/RefractReflectVPold cg +{ + source Example_Fresnel.cg + entry_point main_vp_old + profiles vs_1_1 arbvp1 +} + +fragment_program Water/RefractReflectFP cg +{ + source Example_Fresnel.cg + entry_point main_fp + // sorry, ps_1_1 and fp20 can't do this + profiles ps_2_0 arbfp1 +} + +fragment_program Water/RefractReflectPS asm +{ + source Example_FresnelPS.asm + // sorry, only for ps_1_4 :) + syntax ps_1_4 + +} + + +material Water/ReflectionRefraction +{ + // ps_2_0 / arbfp1 + technique + { + pass + { + + vertex_program_ref Water/RefractReflectVP + { + param_named_auto worldViewProjMatrix worldviewproj_matrix + param_named_auto eyePosition camera_position_object_space + param_named_auto timeVal time 0.15 + param_named scroll float 1 + param_named scale float 1 + param_named noise float 1 + // scroll and noisePos will need updating per frame + } + fragment_program_ref Water/RefractReflectFP + { + param_named fresnelBias float -0.1 + param_named fresnelScale float 0.8 + param_named fresnelPower float 20 + param_named tintColour float4 0 0.15 0.15 1 + param_named noiseScale float 0.05 + } + // Water + texture_unit + { + // Water texture + texture Water02.jpg + // min / mag filtering, no mip + filtering linear linear none + } + // Noise + texture_unit + { + // Perlin noise volume + texture waves2.dds + // min / mag filtering, no mip + filtering linear linear none + } + // Reflection + texture_unit + { + // Will be filled in at runtime + texture reflection + tex_address_mode clamp + } + // Refraction + texture_unit + { + // Will be filled in at runtime + texture refraction + tex_address_mode clamp + } + } + + + } + + // ATI 8500 + + technique + { + pass + { + vertex_program_ref Water/RefractReflectVPold + { + param_named_auto worldViewProjMatrix worldviewproj_matrix + param_named_auto eyePosition camera_position_object_space + param_named fresnelBias float -0.3 + param_named fresnelScale float 1.4 + param_named fresnelPower float 8 + param_named_auto timeVal time_0_1 20 + param_named scroll float 1 + param_named scale float 4 + param_named noise float 1 + // scroll and noisePos will need updating per frame + } + + // for ATI RADEON 8500 - 9200 + fragment_program_ref Water/RefractReflectPS + { + // distortionRange + param_indexed 0 float 0.025 + // tintColour + param_indexed 1 float4 0.05 0.12 0.15 1 + } + + // Noise + texture_unit + { + // Perlin noise volume + texture perlinvolume.dds 3d + // min / mag filtering, no mip + filtering linear linear none + } + // Reflection + texture_unit + { + // Will be filled in at runtime + texture Reflection + tex_address_mode clamp + } + // Refraction + texture_unit + { + // Will be filled in at runtime + texture Refraction + tex_address_mode clamp + } + } + } +} diff --git a/files/water/waves2.dds b/files/water/waves2.dds new file mode 100644 index 0000000000000000000000000000000000000000..c379886faec80aa3b6772a890e0f49822782b33d GIT binary patch literal 262272 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 gsQ~eb`z73kNP2Y0|?iZ|j%iYiX zRccth!IE=2AFcgde97RA;cs&HYkK)6uBP~<`8O~D{4#%M=ceoTc++5X#UFMI_M<1F z6`$gnZy%1lj~CQm;_;6$Xp_~77SqymbA^5{7 z^HQ0K4lfJuvq$F5t9^PRKHgLEqJB^Rp^i^2TUS3#=JQqSI?u&ZwhK2ayqM!PJhsz2QEu z-~KP%6+LTqG<2P@<;>;;YcmV5bMGTB+=w^EZ-!^}^jCK748FMY&j0aOH+W*~ntR`f z#^vrKFYeqLcyZ^wM`t(18MzXMOG9igbi7XnJmY*W@zi$b+nKqBK{sl_U5fT};av0z zMOP@7G*e@wufy@}(tIA?edH_q_;>nnyVpO*bK_6{o<4D@n|q?uT187SR9{X(heReg{0N#&pyIyNQ zp780tijH*Ay~^(2h3ozIzV?%ox4Zuk536Y6PwC}O!gWr=9itx!<}#vYPfv5K33aB5 zHX&S|IH(qaKiO$$S1o*UjqhLCkC^&MjLCh<4%x04wCVo%tZ<(8u|yl_d-Hm}K8l+i z)*EDx`>@&k0bV@=V!l4o_ov~-Aw*j>;@l0p_d{OW8L#&g{aG&@`jpq*k59<{;-cA0 zJk~!p@u16i^e#@cs}|2*V*26ii!0np@$wWeQqSQ6@XW{aXLb2MewNX5kNY*;h<@c# z_}bud@#x#gj&)k>P5-^(y?1XO&_Y3JWsvoy0b zx6Q-`99z*tOy)hA1zQQnrbcKwtL}evWd*0p-lsF(zux9z_5L?MSO49&K37-wPx3$* zx%ZPVo0q8D3)ebv>laJCV!9ITiMi`47ntfcpc zzqM%)^tpDTcwO1sT8*9xo>}Ix)DqD$_50ptwCI@Zst<=L4&ZApjPrTSew_3);ql^o zmH3&Mz7xMBoRqx;IPE7ds_S1`jdu)9Pg_kH4-h@p)$GgM$lsyC^3~Y8|Kz-$etyf> zZgw5M{lB+&X#jR;dM>@bX{`?UQjmv-IR8@Z3+`o*R-d9O`(-{E~_*J>?3LK|>{ z%nZTXuO}a7j@0gviyOcF?AX4${~#W4nHx*K|F=Oo|IyDCza5@iN73cepV$XIc3)rc zfcG>1A3u+OqyOH4C$HvCCbz1|hcdf<^Y4C=S@_ItpXSlj&z~jUE`9P0eeJd4sTz%g zyPmuTH;!&&S{%-2k={ivRfobLH|c@4;$!7G%=rA&qjt0MRfJtcJ6t$$XF0o?;sHMt z4M((W@_6QQPwDAT(br}#WOjdewsc~&`O&*(h6F!XX6^j`4DDy%Z(e>g{^4hWhk1>8 zPw7cAZ;)Kua`!uY$y>ku?iX5kfSK$z`+xrG8TcY@nNHsMOdn^?%KIsE;1lKuVB>Vf z@tSu3X(IUjKUsVpR@C718jUW^W4t!E=&v^1{kDADbVlh|^ghqxgr2tdg;oMyvXPm@ z;G)j_7+!5sA70~GR*RM+^VItH;DX8h>fz{Iyq4^2FdrL@NP4yOCDB8tCJ{TuEAzDQ z$mkQ*VK6<|=qqM*qX&B3JaA@rmh3^IC!`;2du?_>Hu))w>994Mzubtj|KY6j&{T%QfeZ4rjw- zy-M3Xp-!1nQ)PyS=Q(~g^}8Ov?Edq2N8EARj^d{#zRaHrUK8zx-3)_rKHs9}f>X#* z6KydxGp*St={bet!Ke@9*mSSAz?v-PVFP z%CURyqr2a@;ht~n^Z9qq%DXRZ^2XbF_e0lqZ+>WYpHJB4!4uz`i@$p`hru-Iu1D2@ zlX!w)3oAJK>>KrYs0ZTB4U3@-=y<&=nUVF`<0NJ`{4DrHeNWAv{(VnCfb{a3JoF9=iB8;;rp|hYM~-`{Vxc`@B@ALuhB0 ziPuAmSax8QyB}{ny?dYYa|)iEdAeS@wiBsIXr?r(>%F>a#dV+07QDzT@72_C@gP{&!)}LLE!-zh65MdKYwC9xAFj#w zm#3cXsK4o+^-JB0wGtPz*ZptI;{5d|TJ{t#$NM6n%Nmm?5r; z@xILJ>noy*y8DyyvAaKbDtNA4)Qv&+o~GwTnv8jT>P6bBi_t=!F~^5%{q{q@`MYnO z$i4NwQ?HNUDaDQF#HM(5=&f*L=~sL{@H^bCm@ZcHCVDw@mb4w0<^6{Kqdut5k3O^F z^Qz^u!mp(+%09wPSW7$zGk=@i1l#dL;D?mGC-*at2B+IqW7>cAO6zyEH_BcMu^_!O zUhnHGym>dHy~H=}1rM{&d^h#Kd#^5_`Ky}4`Skqiy^qXo*>@_}e!G49{C^!inEb`i zZ)Sfq94)oyHs-UK^Y`p_Z7;`r1b#NAKZHv!HgR#;5$dcLAKZ#aNtR%j-nGI~EA2z4l^xBGdq#AC|dp)>w_P;!^SMTVZ z%HYw#XCFKA-XCO^ELed4;J!ZVhOcOc3$jwF6T__62^w)M8+H@pOP5-oZ93$f>Cn4n zr;)wYI5}Q(_|+OtIryLRN@rIvX#AsHO~HMm-NO%UW&TNTxXw$)Opl(B4_9<6@Wgm9 zWj>r1i!YHm9dSf$p7>}!i*Dfebc1U4Cfp#kVaw~uy!}e{l=D-OpU<`2dvyt(TAi*Y zX#2PEyMR#?4l>>YWp4)FJvv-Ix-Xw`_eQ)&y2nc+>bGHc+D<5b5qzWZ8u5{hhYsI` z%#i1fX0C##3GH?2KXH99SfDRB?$vOdwGZ|`!Z7Ct@vA5CtG#p-uz(l(qNfTjNSAra zEYw5c1z~sYaU)vkq0At}KPfswwMVHH{jBK6qQeW1GwLpl`dkwWQXAlNaS^X&j$uB1 zKMt{)UAJYwL$IXyqpPvjy|2v3#WQKAXinuqxqt7yuROLZ4)a927EC+6+jw|?xf7mz zbtSVk;Rj)UMSpDuGxJ1S^e>z0?oFPP;`&Q^gm~o8=}cX(n(rF9b@^9kZa@Fa?0+5< zd!spl#qgZUY}?e*jC)_@e?Dej2FBNHsR=h}V|V0gucf+~nOL0sn$Hpz*2vrtFGs#z z)iyuxYvH);FU)K`U4nfwv`U%ZoW!3*o7C|-;%}VUH#(*1O`Q8KelPxTN9KHv-u=Rd zkHmu`b-^J{Z!cVhXY&BoA5LT^9E%!YN59l^ChNY`y6MTxv)I3Nx4VAw-Nk=8VZZ%J z?=fDriE+cu#6a$1_Oj~7NAwHFvz+?*<5?T`*#4hj$@I$lhQCI)}M$X8+BK1BPJ<&qWk$U4u`4H-E{W8iAQir zv9?+6YW&Evm)NuG_x{b-Ww*w3=8xSS@8gx(iW-@gp?IT~*We|ObGJCBkFGmoc)w_q zaOyBpJxeE;jr~Z`Qbfgg|HH-c=UZvYOnN9K3%o+cOsin;LRmFke#?c1F zqbr^gwchg3%HN{|j~|=UghD>|(&-z2_gc&GF2fhM3vty>5-L4vKOFwe|=4T&GOxjVC zH}y}$^7d&zH{LNPg4;QR1Mc^Tdrq%@z07WSKEbi^av$vA5r1$3Ltg7CuUpUXt@!fx z!2+^3G#EgiyI~$k{&uHJ{Xsh_2GM4_XBW&S`tslLD%v#1vF&xQ$%*)}W6n&k5k5UL z#Hrn38?=5rX`RKAfAI4gsSjZ`@s;9Nd^O&M@yg%AiSqIk^UU+4he+%YhrAA7*^?A} zSWRK3tmPbJ=XddJ_PK>Oh_`tw938*%c&wKm()Y6~5=QIZsHHNyIO<%6hYTkZ59J}x zE4@3syv!)j0bdl$s`!U09Kmz&8q{ihkm__ia;u%3;x^Bevw240Sc12@i#UUZ`$(%7 zo)V8UuGWVW*5QH+XT*rqgsByRF=Wo*%)Ou0Pv8CdY=3%x@6BuEE6f|f&l*11cxL3? zpN|dg|F`Fc?)?1Ar| zm!a{Y6`9e?o8g1;yL-+VJqLe)=o=dLdf^1sV=X;d3!V`iGqW_&!m9uI16+6|xqm#p zozH<*E^{-mQaqHq0Bg9od;5>hJvjJ-FPAzW{?mIany@S_ghT-XWF!2=8*ZUl@-=`C9JNUXfcuOy`2cw9O^^UmQ#u<&K=FiSQ z+Vx(3vAt?`obh7ndia0xK3_LDS2Wa~ZTP;_<+j<=^|0B}6S@DH6U^P0fBImU z{l|D=G!*(AJAi%WT`|zEH=Jp3(_>Hj-S|jEt49~0PKUEaixWRBoV)lQ9gzDUT+>&) zd^}T{%I)IGWd0mq8Esit-k>L`s|)Oi@jS#gxm(!6?8bT+zbgv5>b7Ib}<-Qqn(H?7aF`zrUvbK<9Er|893hRvCd&?F5fMysPo zql*>WOWuy&H*rhsk@M4o!%tpq((pFq;rN(M#Q(Rh-Y$At&$y!Btcf-870GL@>g}TY zACI=pxv?)`>5N_hR;X`SSQzp9A@xA8I{UmX=q2!eW+dXHsKziecxmvRt?B>{ap2v5 zIzMQZXfXcl;rH_QqT3f^Jzt)FnTLpkeyF;beT=EoQ;YJ&#@R(sPp23$Jg9kax{&d9^ltTk3UZ@n;l`<(ZWOAXG%|_cji}=`a%9r@1C7z8}H9Pw(ZWY zyT5Q4zB2JCe+stG`$hcrXKFeAZ({m!eB?>&Gfe&$3vearDd5)O806<=*uysNATf;S@Z-)14nQ2vv&g)FJLB%*J)mD_HZ}@eSSF2%uj*^Xn8&37#7NgRNUH4(!?~xnsV)a7#Y3XdagH*@%_lR-&_p zZJE>J_Yw`Nx~J+rjme?z7>ysl4(B62xb!*ECi=PY@Lj;M%y+8pUPTNT6?YIm+W`Ov#4ltIkU0Um7XCUDc74&6>7~k-=Oh=z zOMRABaC!_DTX#p3E5@DOF<$D!>f2#;QFzkC1hZSTT@&-PabuhA(!RPszVFVixrM1k zejgJn=KHc=E3-h`c=s)5X9EthhJ(tv@;dD^onFkjbpD)y)Om}u@!gRVru*%@d6=H_ zAvkV4a8J{4_PT4iU)kp}%F`gTKcnJ-UTOhOc`^PLxJ!MG9VqEh;jvB%GagGMJriyK_j z=a1hk+O_EE

G5I(z}7~>w4dlNn&9tp?u#f{AW1_wT6-$}t7ecut^OKzDic%NP& zbx8Q)crt{aY&naW>s?iA@iwW>(LK=hSJUU0ng~`(&jmlWAJ@I|TKQwsrRcBKVnx@O zoff|u-VZTmB;>X-QRE{79v*3C&4j{sPSf4_hSGApds2#za%&M(9KlMi;1 zH+|7o(^xgkq0Z+^4zNvMOUBQuKEh))TFl94uyM7;S0%k~ z?z=P8j`kQKCPTQ}tQSO6m*V8<~%J=cnK4x%IPe_P~x#MhE`>Uw`jJzA|U&z7FKRx}%lU zYwp)dYG*kWcX^3U;mU^RLBp!Pns)bS+1$Hm;@9}guH%oI-fwiB!E_66AUDKIKfdv2 za1TSU`?5DGe2_Xt48UhQPdK3ByDu(}q{gK~9x)41;j3CPlUy;|6|5w?X2<16+MJ~h zJu!`i_-oEqZaDUDqp@|yI(!gPOXdtFPq_Oy%k*+~Z^;AE-md5y3ieAcKF6~m^;b)6 znRvFAS=4a*dA7kiolSdta^G_QeHIt|{AYN~ivRioJX3ou7(uX`)QVzGu>9nl4Z4i& z!#{gG`@Ob(FY_cgBfF8sDm#DYogcGc$xGRlO#?4hkA`=VTSxe!4&R&o*^nM}NX?p^ z@9NHJIq12}4Q}9z)n+v0>Wt*T@MxtMXvmkm34QjN#jLrv?qBJ>Q_n_=Jn0VBg0)6_ z>G{ShBb=7FZRYqpvwWFeKEuN&GgW3>&YA0*jy_op(Zu7`M&Em@HtO#UxP$6~;FafV zv{%`~vf}SLx8}h4`yJ0$Qn!R>*oL?B-F}Jdz z&fUV>WH0t=I28Cz+un@ietmz#-EZi1%$X$5nFZEoXYWpWzzuw#d7BG6`c-G7^#Ad^ zOMdm4G*@y*+>d_hrkdw z;Ap(G&##KNaCKTR{-OGeO+N8k^nlqBvFYA->9*qC+{WFse*3M@w(%$F1LggKH3VbO zQ=3C>bVj4Cv!@{((uvG~h*MtI)xlsL>dHQ!Yhu!<`=418I4v%3qMALC$GiCAVajjZ z?7|BDa`qps$YDkA5Wd^_XlK?;?KqGl{1wD% zTI6N?+HyFhvS%Ut%bGOIJo|zR(T37_rk=^U%XR-T7he1|3cgS@A}H# zj^Y6aONxdlJKggPKEMO)tED~9T!-0)Hr-%emp)-Sb7ng{Q*O{;ZU>k3nzCCpd%&X| z?C2NcosilgHD1Yw@P9bm<#-mQ=NUGuHI`kw@Gai5jWu(bDJIuF&%zl- zU#RxsXM0xs(GSM=X4+>8S9S07Ik=KwI?21{t32-!xqC1*eCoeE_w@9BcJ_wGH+?XD zn%7!~5x8TEnb(d-N+o$tZwcp{jTWJ3cg#IR|J;o4D10tGFZ|1Hk)>*8AmZtt9GRXV z-bS=y_?PIM-7R(8y8ftWt%H|}CF|KK4fooR^SkbS;&JwZq;4ZMSgA zo%jRcl;+HTX5KZko@F0Q?isFZ25wBlBAN51#`JK5;F+ zmUgL@K3`pt+QMg&S)kzHWwy#)$Sl`N`YZ81v)efD;!jzX12O{_UM)OZ<~N7c0HeVd z&HhzkF2O(26DBwLEaeY*B)jA3j|Sk*$Nk79GYVh%(NOjh1TTe+Wv0x$RN`jpIzDH~ zx6=!SKZCh0t4pHAraj=jXs?6XD1IqsQ^YBroBlt&r9Ea(+l@A%j&Hn*Kf4Ay);mqm zDaX@bfwqCiSNcu<%o{v;Gpo)&`C7|sz%lcvwIfa(+3+0X;Dvb8H}wS_m=;|Z|A}^49apcETG;oEr)+%UXVf{#*R-!@70p5v-N~PP zJ3ABYX}q|Zx<56c*WHrCX5e0Q!#Ji3)wRqes=tFVx_@}cd3f(a&ZPauuU`n>FBkLp zrO$&g4!~&!;?WDoJFO1v=Y!Pe_t|v_KWbFMi+JWakLmd{hYSCUr%z*CugAj)zJxn0 zHF?wQ)ytphWDY{@6+BX`p@-lLQE->kAmw$z)Pk+>i&wuTm!w}$ZA52XG!@x(7T$JO z53ubsEc^O0*DkifPw;Z~^WeYMyk{8yLiB!_L0O9yPt4C9(x=8l3E#6&dhF=x=)mJM z%*W>f?=Cxm+}R30tZ^}*$^)Y+-n#$d=G65uHEVX!jF+53`w?Eg%&a}FA54E`E=zvR z-HDIXxSTakzk|Pi1=cY;sa~mj9`@MtIDEyN96ms;nzO5qfU9Na;>0vxAf7U*BlQ!` z5zf%-buQxD=nQW8OtTvn*1*R(!NWDEtx`w2Py99c-QqO+ z__Lmd`winXvP&s*Rk$O5m@nIR-F}VNJ1i|b4dO>sYTS}r(_gB4_*B3*!_l}K;kScV z;3%^zIlWIX0Y3Hdu9(Q4Qgdz%o(^w>%hCQocxZ^OsWl(R6UzPLJ8sUfX z{PLw{h`+y>+f1D>5}$YYL3Ynoa!)-wpMC1<^t$2i3I?~FKF>1>*A{Nb?gR1FuDsOp z;=pR|M)W$g0dxuWnn%~XuoUjWPV`_sc|W{asuMezm*#nNKwq&(Q?cbaud4@~sb-#! zSbb65!OQpDERL|5-DzrvSMoi=6PPWZH9J1P6}~W<0ll_!XZOt%K9Fy_9-AKCj*gYj z*7Z%E(+B!r-UDJxUXwmnT(eKH;0<&w`qAvR$^7buTvq&UgJ~o_r~&Lz=WYMA-Eith zcP?52nq1zgbT@F5cysv7rzhoRbu&M%Cf~!Q*W$0^?l1L+_YcQ%|6AWW<=1#Ej*BDF z6^T!fL4~S_bF5sm94nNb13sT$J5W!9SCyGYgFy2`7>q zXcrA%LfComGhgxe_N6CFjFc~v%cCRP)#q;FNLKY`iOIoBaIfY5WVSGSRe9SqczRqB zhwZ(vZwfw{od$40`6qmDY7zLDI9&Q|@gsieWA@IB(36g)c9)mN>=mxi_hpx7&0VSK zLo4b4+`@%uUFlh8qXX{x%+2-d0WX;K;T<5aP3oEHw-+Ykp{b6rLt{~1f@!q%d+oEW z@MSrB;d;DA=RrL&p+@m*JOXG5QqOhtAgz49KKr(3k^KN$`l0CQGAHi!+o9?2!U#5s z4kBJZVnBK%^;UFf!5(os&9PwcbUoRXGMISgzD?q@>f&BaoieW1kKgW?`Z@P@IXGtC zW9gA;QJq^~rS_3i`5$?frEW_tmpK$YmHeB3liliiWS*l>$xT!6(57eHDZa0EL&1{g zdF_~`qy@;V&xo3=<}O7O(GH%cPKD=(57e8T4O2joNXb*4}^#Y&uKXr4wF;-eZbR=X|sZYXuMF6$P8E!(`2vhQHQ_PT}J1jnIRM z!Hq3_)`QGfWTxu9$G^C*&$fpL_OoYMJo zxwPobXYBx*r%|^@q3SHeugYAs&!whshRIele>dmuH1#PT@Dlv5(o6D@ga`Rd_{6FC z=~dUws_|mJ91ph@dY8I*lUm5#g!yMq5?(8hI8)hKq1QDR=#I+!iz9Rx6?rT(E17wW z&u{$LM`6FiaMxgXsq2T#_rw!<*uS+`gPtI}Yw#uFc;=D^=?UOAWq#WQT}ZXkKM{)VVyzd>(4DmE4i!j^iAnf5W3C z@6iFR`U=0b?)$Isb6F7w;D7WJ(-Uf+^R&Nbx1+~O{#1v>*DKtNTE*@dv)9pBs3{V6 z@dt84G-=^;V1IOJWB+r0wW_bu^S85mavT?)T60jXnO>+02d~l;#>acbvxwFu&s+Xm zjAk%iM0Q)66*12nZ;fCI`hdE6EW3uH^@a8FcfduYmkvIfKG406&MY&abiwKXJ0v^@ z{h-;|cxCYt^*R$5ws?E&nLodQJGMJsT%UjwJS`{N74P{4pK7I!#I@jfvsZ)f#w+Tq zcnN3!C|uH=pL9OsPg-J2VwCrr9R*FjYkbPmN9l1Ia(MRsh|zYr$N|yU1RM9+U5yVn zEikTCKZx55jtdJZ^|&|@j5RTX&-wH<-$y?YehJ?npC~z{57u~EJQ`68&*`5NOP9rg z;1uy-fo=JHcD<<0z2^9|R}a7V z?lyM(cYHO(Yu*oZpR|!hcT;MY>?c{`N9SC7{xd!YwP^WX>+xGTc=Va0cOR)7#miG} z+JY5%F7~MMhlb&8sKt2o*u(x5ZP3#&1T}!Zf6ZL!=IsyH@821$ALUnH2ejoo_8PD0 z-{UJ{Z-D-#iJvn=ksRP2L=#wYn_Mdgy3gWU;N&JvqI1q% z=ET%p3udvLM{|SXwz{bF_jPf-BEDxQSad$w5kPCUl+QGtXz|y}jLwj_Fs!zU*3$2n zD*1QnEIM8Lx%i2sZ*b2CaYy~}`wQj=!#+a`oV`lX57uCGO|yg@_q*ly(KMybNiERM zeHTB9M~rhb=e%auPB;17J{7p}hVR-}wEW&*Khc6KwBWhXaYrMh zzN4o!Ym?6+{c+;FXOX?sExEX80>i<6@U!%>de~_gu{k2owJHBa@5V!XK3+RB>94Z? zuI%w?Y-G>FAdWN~xZF>(qvlhOt?1jGmGHD?+~9t}9nw>X$;&)M+Va30ZA~)!%isy%&u)jZlJZtXU z!XTpe#HG@*c(ya~O;PV;-UFWQvt6_ssPSy_b96PS5nJ$%R`4ltsc=jBobkNQa0L%& z8G=I=9+O9%xIxPuzrH5@*DSxE;v0vrqbDgd^b^h0bHN)^Z{;o?Kb!P*Wq#FpY|cfO zt-czj+p{~DuO|-=Ind9A%iDS5&dIM5^cx`zN zu=ntocCyT?v())^bv(HF=x2}2mOYT;;Vu4+8pvmyyS3`9W&go;`b_^;-ILmg2daHb zd>(d=@Bi};ZVl8Q-2U+F19^K*tnJ!8)v|A`jW>o{mhY8bCB7It(JR2dw)G~#tn?M~ ze*8Wfi~9fR<2~84WwtatQSqzuJ?G+|;`8*Z7E8^g4#{3AeIrbrPdZFDce<*cfUjrX z8Rln4P{A2955ikZOt%x|`k=f&6x_gQqf(t~qxJW}4 zz51fPHqGIXA819z(Q$2rT<4ww&9*BtLO$h{E{c}|Fh zYMOXWaG=?mQm1*@K=Me?x3f@0(Z)Pgy9Q z&f!h;0h{iqK1+YEw@6$~JrI8-aXq<}zww{$@=iFQUw)7oGyhIaxqw4%`2?eX)qQ;-B0774O(f;Y+jkR}9L`*Y#$+#duV7Z++xjYw@0k5hf<> zWM^Qx|L4wa6}^gHF#S;YNO8N=_y4O2$Iw%I=6N=C=R391T)wCKAH2~%`eP1>?|e14TY}_hn2qG>kBrReb&n~X)F5mHGTV*{?s#X#2*C~Q(c8&Zx${8pPN^YGP?n%`;cSH3XM&E}{+N>pB&kocN~RRj=0H`}B8a z!Xc^~%Z!gXs9>P@5I8SS-|#!;x5mwWH0}84*v}Rnty;R7{YCj+VodoN@v&KZHaplWQ;0y!lGrgxSe5PxC_)BGwnoPv06`B^Vq$HFt1||475Vob_k(;q0Q}-;b^- z^W!{9cHV#Di~D%`ecnDhu!8Nv9~69JG564C8!T?R6UtmOa0kyqDvR>T{@Y}#|tj&H+PGf!0f)1w}zRdB_K!{w-hGhr1$Pbi9`Mp5jyRO}>|!%?{uz=Kosj>cQgEs&-ye@2z{i z?nUluGv561e9F#%N$-6O)-<^P{Pu}ozwqCC@6>-jELW|<_R&knF!W*frG9Ahrg;{~tQo8evkJ=py8WcWJwzpZa-dyjd~ zMIRB))c5b|Fa5j=YpJL7+`-=5O?rp<=qc$R%HC<%jOS?&SaehLs#9I(C%8g(mC4Ec zHEF#3%(36|Vpr=$Uo+xtWnXgPmS9EZUiCTC^hjp#{hT4OK0MrDnHi9u@llC8(Gk|- zZI?O^W>w})!-YoMC`M-<4G$cze_zoNz#r5Yna!%etj6N2Bd?d;Oqp{z_D*e%ItOY3 zwcCW(fQL*@DCg^Zvzea79qQ5@bor8Q9Q?tHoA)01DsR-6%y_-zJ<`*Cfb+ZinXBL6 zhp_8T@1_6dv2cSA!-Jb2dj9bChcEBm`^fAb-<1Qt4AC^|5vI1`hdZ8i!Io2VdY>@V zqM3_6Sv{882=>aa8eWh(3x`y6MBx?JXrMOKXglhUO);3i+{Ivk_`mjM=FE6g1t(74 zwSVFY96wlIV;gR5cWUrD+RgZar4Gz2Li(?1_!3Xp+*vV3f2g;LpSW2O^+=f!m%j?{ zn0x_4oup+O`|ZUyN7Hx7OTlR21NxNYe3}XI8IEyHU3`5G-pOkYUS$_t@a|GO@EXBg zjXSrs;8^}n&Ho#dGX^t*ShQ<)k7frIJUW`x)YThithVi++mqi9>_W?as9mu#{-ztW zO87ZEaroHm{LAjYSC04H!69f6;7AL(lW>bEpSyXA!WqbG_(Ol6$JFJ=Ht)PJxML<@ zC;Jhj3zlXF-e&KNy~R4ffjASEM$NZYRB$8eMPWEM(rG^z-%=%lG=8`4<1* zmVUZk-cOT`!47wyd*(y46PK^Vm3TD_;E)E?hD9Ibe#cufyQ5pbS^h-4kLa$;-sq9T zjm9WX$?VV;KN{hiGj~3WGs-@ZA)4nQ96&h85j92pz3@x8hvV5>_&9(4U@B&_3XV1H zv*NuYzb(5*t7bNNG=7y=%U8E~x9!{;`r6jrN4}PQuDFvX49E`R>9gCJmAd=PA0Naw z(H-1!|95yW-FN5tu)XO1U*`K(=f!BQ;#_txiXTO1ojs}LoVGkiI<*OLb0T^j&SWFL zbaK0O)RVd2X2J)Om(8SuSfhrx!-vhh1LhdnIUN0Xkp%bL#tCn`st zU7B$(s&-qC>6ypWyXxz6Ew%Tu^A;U$H$AGlDSHrh=~HjG`#ZrhJfrNjU-#eQC7vjn zqiYkz6Xh7E&i==#qT7w0MZSvGR-Fu=O^>{E0e)yMkiX2mFAwe6b+gOcX`S9>?ftJm zv5E6eJyG}q&m}o8GlX5SN$)$+mIuX?^loZ5b($Cvtg(|C+Z~O+aCAF0IWnG@<9D9_ z`QZKw|9a}(iGS+H0glR>O+8@tcScv9`8xGpeA@8+!BlvX7QHb~z;Ij9MbZ5v21Fw< zL~CRBm>PQ`{k)iC2GGyUxrfKVJJgTzOgow>U)jYz_xo$-gA0U9jbHto9GMwQIw`zf z=F1l*(m%jSdHFs=!=m2z47&1fa#m`fcvT03$!ty=?&9aY68+t1a(wz&c|dJp2PxmA z>;VbJE{4IH7K7Cd@&fCp!Q<~l*LmIE?CWZQE?=NBGtOt;_r}jgZ#ZXH6p#A48Kd-t zmj`%34DphqeXI{;KcqkB^<+oP>--+uuf#_+^+)_{;{6@%8jfVqT*XCsI2_IbZ}-au z1N6*RoQY_z69ZE7^HY6cCwKVZ53g^D0qeY5SM_o6f|u)I?~gqDAahgp9zDq1sN9+U zJ{aJR`mgLj@%{09^F_~$e~2f1I2!%FJ*hrxvC&=*e%#sD7N4%%Njby)&)%+lMswbK zG(36$IJKER^+w`N_M_jY_uHeH&TceZ{cJqyH|&^Nd3W&Jt6sAi;`pjB(7Y^W=UZms z<&x}|(D&Nu=6k~Pr(k+|dh@Jma&ceJlzF0@L9s&KN&P7n(Ab{8Hp6doS&tOo`_8?O zy}HZ~uXFdw@9p_PbcW$#=JW`4 z9C$P>lX|bFSOzPGgU_0;ZJ%3#;ji(X-*)eJs%pBF!_;dRC@Z##6#ps{(7GmxEv#T^f8~nbu`Csh*&)H9H>GivOf;zXp z^^ui3okzlXhf6PfVCpAW)UrCDBX;O7r}YNbKEH77W`MnR{UfY_kGFU*7#>+IHj~&N-bUW9M*Au6_rJF>Yu9Gu z)O&AzrR?D38FR}1y%ToB@sPdT>;Dg^kA`t7>LW8rX0*j2TGsZue7wV-b&vPDT75qL zEF0>5dJej}>V#c-)3kKc;ng?gPWQRF;qR>Iqr0${^wPXrpFi6B4_`X^zfWI0x-~Ev zZ?yaILs1iK!tyqJZF}#jwdL&WV9YM`W^g#4ZRZ;{9sE`|KDE3b zi;i0D-F9!YJ4(Ja3vEuvXBMBJ#P6KbIknO_y;OAnut4?Zf_p=^pk}UzpATND7K~O3 z4tRCN&nbP@qu(B_L?*$M3>#0jK2fl6p#O~pjKDt*tIrt&->{ye3*WeY=;;rOPJFhkT z?TtiTJh-?2jP5lWq1|;COvIMZXXE`?ymEy%Wkv9U?n5*Xpq}R zKP$fVaIN&U{%xrr<+Z7Jj?wee2AsbZOsSg~=W9irG{Xy@DH=O_+UPXlZ8Y=~ z?lApyyz3Y6jx=oX+*IGINob~uwrs(9nd<7fR-!QoCNG!Z8I!yC3RK&ZI12kYod3ds z%5CZ!`^qYJzx>l-7=8GFa07|;;o8T-qqwh=(FUs_>|I>&-p|!(J6oCQf&tsf(N3Q4 zyZ5u%-rK*N;~W1%@BY93#ff+R<%Ng$|Mi8Qx3~W?_x~iHdAoc5Ji5coY6K6#aZT7s zKD`;fB1#{ zxBt`l(f{cG{L!!f!(SY|b7t=7&fp6V%uTED;qXuC$!P%85qiPw!HjOW%yQuf=8IO3 zN9-QIn1iza0e=`z=+p)HjZfexxElWLE}GJv!X^dZ_`=UW~6z@xiv^z7@Xo&Zpj(5pUpOba6P-Qb$ZDUg%q4 zv)TRNYbacgdL(#I^qB649??9I`e58SnM@A?yX?Yn!)4fM*Vxum?Po8fyMLo#eU0;L z?$?U^5O0e3qRM9z*<++;U95<2dcDjZ!uiZSILBpvG_T!RUQ1u){fA42;hDF!Bgy|; z7eiLXm5!P#TDsJpT^z%z9&|bP-`r&$eMr@kQEF3l@J==dIvD@>=kz^aIgAmbp-zAP&GYFk7OhgB|no znAJnVl9S8s&%QCt`(XIJFaEIN9MS__pV3cF(m__$eenAZP2OTnuK0gxx}V^_@B7a0 zyy&8nF1+x<3s1Q4f}Jg!6pd>%S*8x17@GuI$5{I7>i%D^i34l<)C7~fp%(3$?L0K&P?O2QC!fC=X1qHyi`TX}>ilMVYG(8FbG-L{ z<31kF+hOJE=9_7<ifRHl-3hsVS&e=yeFcx`xO=NK&t{DBocjApUX6p7^wKNlKz!MI zXFMPNlRa@T?c42$e)#fFylqEYJJ@M9ow0OCFduo$?AN_p$K!`}z?f&+4J{szy$A77 z{I@h{OYwUAoaq=h>-Y4McHr4}OLOb}r`?T9-M$??=1TiU@c3}@*I&qQwOvH*6WnZ0 z3IkYs{EOF4*+r*jzYOcy%*RAOB^Mo!4|`!Y?SA|}+N#6q4?Hn__o_WNyLoOGpMh|gc$&B1Wr;ZpUa6M9qqt$oE8FHE`1Gcd3tFwc3I zz@q&?<^=p-+RMQcqx(H_q5XtvuY69c^{4owq??OdKObk%vvl{pfAa$|XG{FQDyGFh z3X_XFXy$;cAAIX-VxJ;`p3qfe(7 zvH!{M4PzAt`+o3w|IG99tol)JRed+=+3+TF2)vJWeaw`D)Y5qR(P@4yE1>*ue( zNduz~mCw%Sv5a4T?6!R{cW9>X!SL;cXlL8XsNZ34@c>2+AN?E6hgjxajQzd0^GEl+ z^IylS#^b{qaOUuN)V}zLy(6(7SBO8wh&OTjaq!-UU&PZHrtmi2(T`t$@B4oA@cI94 zc-7$Z*>S_O()n(7o6y*2*RTwVg|oy)kw>bbB!*wu#n z0yFbH%>CEX-Zh)ev#h#x4u*b8pLbb}d_B$Em=U(m2#3$Rii5r;kFDvG;-_9NZ>!_O z`j_B+GwD9k7sC4w>kp@!_c{OgU3rD#3Wx*63v~gWCXN(NHjezJSmOSF=oTLIZ8g>4 zSmN|F@25$GpXS*M!&blMrv|g6zYeQdc}K_YP8X}>Ew~__3oTkResi!e@PRMK4^9uH zUd3rYUXQ#PA5eU~)>oP?bwTt0YySJSdT2FMI`}JbWt#K5SDrtQMmjt1H4cuRV7=YC zhs~Yb+09A*(+AsWqK?Yf?49`rk44X=d@kqDHX{|Ymz%BXh30x+?zjDfXLol}{r+du z)9Le%FT2z2Kgl~p&Y&5NU&fot=h)TLi2?O$zURi6&GD4*47>AVmNxq8U0)N=UmcWx zQJly)AkDY&rNy=CtLENf1T6C`%*3n;ZrB&^$CoyH9%`|Csc{6GslW`2eJ>77w7JFZ zuBr1d3%LL`5Fe_%zeo$UP|v3}oyUuugKI2_iN&=rj+r>(X~y7s2OfX@qxnPV^FRL7 z<8Q1zgDbWl<~IokoXHn@@Eq)Qv=?jR!PTGMPy;k4+<@a=Z?9?IuH*Tv`x%eJ1i~ip za+;mtx|UH#(mxaVnzae2(kJCAz2`BCq5_u?|}fh_OC3dNQack*R| zG5q+!;hC|EL633Id%5Mkw3~6;eP~CrnobQ!k1hAB(dirD#`?b9dxgg%zbwkBySu91 zvwmG{+iGrH{jFCTv-{p#JyZBC464tx)~vRgqB@v9yQej2rQy2}^OF1hb( zYWB-w0R7OX#ev^HRj=V4caA&Xea@Nqt~3Ji|GNLx=;DsPng3b7XL!}^uE4eY6rS_x z>t>hwspDZPJL!?*SjyEqYAbneJuZJ(`SPeR_h2#e}|g(tn#0b7$O-X4diL z^B7-DC*&@~X`QB(sxMX}!(zH?@IX0Z1LlKgvR=Om>s9OGs&=-+oP4Qs)BB!*@xtMr z-3SX-m#fLmo8Y2mPqfkbS`Lnh_i6^|9S>jOY5>nBTtyupU*F!Dyl2dX>VM?__VuL? zq!%z-cD_dqV#lE0JFw4iUa`KtoO!|N2l-CfYoZn$`ln{1)dKAUO}DEzorMpil^VOU z<&NpJh33I&LJo=tJfqJy1K{bt!V_*`_(8|Z2q(u+8vA(o6m0P>*y8ba?a?RSwOtM8 ztfa?u#`QNedt+96R87PW1qPc3Z(3S4LVEYKcl_Pob7o-po*`edGkLt+5KGcngopA3 zyRE|^;_vi@C9jvd2Y(BVd(=OA35*B@Jpem-Dv*f{;C^r|J?uh z#5?MZCy#$-{>MM~Z+`X1um7`We}wmUPmJmNZL7nZgWVi6FY`L@$9!~s*Z-!utNFj5 z1J8lZ_xQ!UBv094XWzh?8*=}4{q^Ht`8P{)G>jzuMzcqEhj)!S++1|*SM2^Ti*cLr zU*9vC3B`zIDuRC zVsF75uC#|iKX43!*n=_A z?h718y9v(ce^g#q3+Z3%Hm+V%Coib0W*)!%jY*z%&Bo35@nMh3^Y+WR|HU{vZh6Pj zY3pOd`pgeb<{dxkOf@cSc>}g}CX5>fLVIcs>)FF{;WF`gUpcx6!)SlKeg-DI`YS^# zq8G|{K5aV>l%sK=<+`K!8`8vI2%{SR?d?_jZ`Disfv~Q4>bv<(O&6apOwXBGQfn5k z;)l-5>v{543&szsE}c&g!568yeft6r*%O%met!JTiu?V%BI&?rMtMc$36C#)JU()} z9MXiG6U)=h@F;ukdOuU#ZMu#t5B})zRoG26oAcsa``N?JMqbFvVkJe>ctp60gN zcBdXdel8!>!^4AlZ{$0u#)-opKUK^(kD+;Z?(F5x10KV5efuf%nAviT7-4QC2H2@y zK2`sy-@+c@gzH=QeCj1<0e}2P{5ZIme1UT*28bK@{q|Fxm792gh&An%Kf+V(5bgB@ z%)foFlkWW_J=S#p3=fm{2j8hb!oUkf$8 zTJ?BySI?5qN4t%_aBPFm(U=*&{?VyxPd@oGSK6yW^IL4#Y`;RhT5|!qn3v|;Rr2N^ z{=xnyfAYKbnS7$Jb{jpTetoKb^^Jf1d;2@T#RFJi`o`gh=;vLm#_Bm#XNzg|z(?L# z-9GsJk9}u<8g?06~ml7T#-m5p;`N2DKx4-n9c<4SW2AJ2-44zY4 zgvI7<1$&8S=I^pUJM1)0fE+pg>GN&+TzSXDtM1-c6QrTgBUIn3d1(^hDx03$IraDO zmsTICq2vSpqIyF(roRu5LoN~L$K9X9&zVvG9nzz=&)mMPS10q_wpGG!Ks{zwc0fyy?g3N@s8xi(R-2FQ(((dh-)@@qOy&<1xn5P1CXU*605D zWqT*L9$b0%xhH?{3;CqR-E>~@KJCNv6?U=dF2PiDZ_)S<;w8&_M{*Kt;yUsu!F7gx>B@8>`AZgQ5!KJzdmfB$X|VZTE$ zgil-g;A^nIb8lS#my3^Xd|>|Jm)^VZgFpG%wKx9t`|^pTFJCqs|vAhyRTG%!^MAY2H2ZQo8@JdAbPyeN!)S zD*vH4Sf07r*gNMDC%2gCot|=+ngyPUC#=@Fh6kM&ir6{$r`NH3=8Xm;XgM6}H-jH*gAMX#A83s5h{^bKQJc4+G?rX=3c=^oZ&;QBO?L@FE zXkWVns+Yn~y#L`D_s;I{cJ$B_{g(V(hjv%ieSZN*Z3G=Zq*KI4(C_jWM+Uf zU^aN?^{LKpYZ&B%P=isJj5v8wN8yr*0P z3g7j2cn*3F{d#?C&sa}Z9eK`sgCh;@DXh7B5?7#|&M&pwAkL2-&A&gpihFy^bIFq( ze!8+%J)j@cAM5d)=lrV1{s?tLaZRjVA3PiQiWsud{Hs~fns>j{Y)>rMQ2)FCdSp8l z-oXKRG^#QG=tGNg-Rv8GIzRvVjc4cnZu{rvzk73L_R-frjEA;5DaY@9bi*F=zqq*P z^>3bj%B3Ve8e#K?_p!TC&rF*#HE?t*Ho9}t|BZqm0$9Wq1duey| z^l^;aPq^fst-1eW7hXA5+=z4F{a#qq?;UQRp8ekwJfEJS=YGa+uKjt<^4M=L-_yRH zv72+BUgv-sad_^l5!yLhpSh%$%rj*^>@dt=%ou4Mabm8)_^zq}@}|A^`1DWh*co!O z+TOD*rY(utOAo&K%S#Wx@=J3+_{RI^UjOswc!#d=mRmh+FXil`8_&(Z`IW`lAO7*L zFRB-oVcp(84%=}YR+ye=Ew>EaH!bj``enVfnNcx-Czm)-Z@S~_mOg9OH{*S0w$u?D z&U_k2^&Nej=j1%^?m3|o*Sn_)*ugonU)~PopZk~f`#-`h{4t)A8es7OJows>_AaQaJ5TC<+_Q`C_(iJ|M^0_NymC&Tes$CrX2#CVd>j>=mZ7&+?;f&e&wmh*S@%im-y4|Pl5OI_RHtPJPiNeSa=33(EsIu(&bjpR3kiHUrIva1Iak$eUmJ@a*G%^D7I* zfct;>E3@DK=KIa4Khl201MRw$&&u`t?I7Jt&)j*p$8^K~!DBP#sP-AHrpsAq1`*Fi zE$Uq8#hv#jzw@UDUjNdyy|9CW-qR7>$$7CGUM=_J^@umRn~$4mnBRppA0P9(QDeFn z`2(rJ^)R#q)$QeLF@6Ci6Rz0)vZ2+ML-81JCGC_KL)xzqr|$}!_j+DPdVm|vJ?o{$ zjE`S}Gh3bF?}9JW?HB)@ZNFYvc9%Bg({uX7bN+7g0Q*v$54C*zG~4^T*LiqGkF?J- zX}4ze{(kv>pFMs1@_>eQ9;i;lM~mN3P8)h*&tM6zbn3}3{J}=pRUVl5db{34W?`_4 zF|V}C<(|FSJL8PDNBzRtMSa}Dqc8p9qTQ3lf_e9U&O78M#XI>6CuX1g*{{#rAu*pv zRx@7pPdZrfQGAB!jQj)d6ccDPUzNLjUUOn+N&X&MWO@reVE@H0Y5@nLS1KaHlN|S5Gb??c~eE98felZ{~pttdZ?&1r?@wbQGewpVt%`47d z_wTpbKY%l^p`OE+y2SV09ybO0fpxy2Fg;&mha!w?LQJ24 zcOPgUQ@vh)Pv^zE#8JDD1~6~s;;5esuD9@k<}Tt^o_X**JQ#7Hx>Nie9tM}4B3_ibLC;5p(W?Bc|_^Lf_-#1!6r7XBbTV65jnw&*oVIn~$$^ zX&Khj3}_+#P5dMGK3;({VFu&9>ML%fIma!#4M!VZbn2h0^=0mN{GhnaYn~r%t{oZp z2xdU}x6Q^22!rRDa0*7Urk0YI><4+}QaiXOX>tz2^!C^1ivbfj5eN1E2mN|K&(Qt+ zfe+*fX%^Bxm`SlP&Xk{P+%Ng|!r0rPk7<^*=Kh<_uhw_p^6u>4dhWJefOj5!_+59M zjq9TZxwL9;{AL`v<#Djoek@v#%P@p|4llb)VFPI(;M46V za&OzYvCe~D&D8UN5w`;?UZ=Y~Y7JbPcoO#FoP}G!E}XACkei}mh{JZe|xA_Y_Q46Fea{pJ;_wfZfPEWADgKKo#ZrQuy-p+q|{<9ltN6huj zN9-%$fr&4q8SL3oD zau3>nnx9F#%4WSQeAWeirptDno!{fFDDPyOIKFYo1fFxk8EtUP}`v>MAh zRIl-qUeNRBduKnSSXbZU{NoHRoYfn|0nb|t_Z~(M8^mFoyJM!3|3N)pabYnp9(BOn zTYPclChu1L!_yk>v)z0Jo;dWS{Ep)OzF5UljYfifV2cDeS-p>=@VCP1zKcwd0t1oCDa63DOMqmCJ zz7lyg#6xrraJ1nEutPJ21;1YQ47&d`cguI_>Un6s{~k{KoiK6p%8h?~b#+ERYBvH7 zi#o13rI~Fyu6A`^u7@3cW|)TD20sk*xC-OFX6~E6RGI_v`q-?q(riYo;2pu2GER(l z(*DT>JzYENXqQf^?M@7@O?hBOT+C}E--FKnn){l@^{VH4yPs2Ce^)NQi{IBy#k+C* za4m0(1-Hx>`3S%h`2zWj@sjcpxYON_kKnWO^}n)!PdWK;?OPMwv+jm@RQpJr;rvix z0sI@PE8Wv}%ujjV?PBSjwQoI-rMw!<=6N&9(VlG_jQH4QHfksO1Lrqy8d_<%Si460 zetf#qp0xLm*IN5h&9*Nca_6Vz`)L}NW_;mHae5bh;9fJ;EV9PVtaLc9GY9O zA~>FV3(%X8h7Hob=~KJ&{%(B%uD#l;dSEBbZ~d^?cv&B|>E~WHL!R|HXj#ht ze4{!)>2~>4n;Ff?=L=@}r<(6O3uX+*X){jTkXzNb7w6TY?INHtS*94#rl)K{+W<6m$7^bnaIc_#3_?4z1(0ee|in{db?(^SA%*{GK0tXL;X)zkG2@4K4n@uqf^g zKEHfEdNy}4om0Di%#NycczLS_>I>6(_iMdSTynU``n5P`xDxT%;H9{v=6=sFcYJdgxlD_ZQjq1v{rfPtE(c5W*=RxDn&)!{Fv~OuC4X$&ZmyKgTJ2fEn|^*=k5Vd3T>SXYoF~?0%Y_xFPVPYwjsNDDKsj^M}o2 z+{2enY}1_@ew|r(Zw!&3*9U{X^$$cHVvz ze~wQ@o((H<;PJfj^_pk%*QqYwr^Y%kVz*t`_#fTlYJ#c3RofgM9L22RrGT#j7s?}9 zuBUI&lZy%U8k_O5nqTMNKdGMB?|Z~?iRaqPw!EJQlevQVPdm);{mpUm8W_A4{~niw zpOO5}YdcIIKJWgQtMn^&^}r193-C$9$>WwapTx7pNxAXXM-I0SH$T2GZgJ$5;jP8T zX(o(YUV~xi^CAz*b$S*eNsD^$MAB3Qj&K2%?HSUul<>3u(V<$rnV(PzH4Up|Thl2`xaKdfJ~Z@3prt=oyb=}zN#y_(nDMmtC3x0NODdds~Zp1e3> zH}o<%(E1p6geLTq8Bu(P`pS5bV-F9!XG1PmH>bN;X}7(v6TSN*zIarfw09_P8awB! z33$%JO$RS>%)-l?>PxXx?yAphMtIy@aMA32(F}jZd*Qde@?4&)ck{DQe|q+20ju5@ zt-Bs1JmWfCp;;roJ)EmuXmqByG&A-{P4kYKXt(;nMh-6zjc+Qx2 z9;HFGOF?|_=lC1hfn|QMLq~XrmiVrCd7r*b4ffI%GtdQod{g$o9aO*j`Nf^I{CSDv z<;Ww;a$xn{Vex+Mtv{Sw)ceo7|FhKqu)x`efAPX0IDa$0XYkhd(XH&GS!s{?fo9ff zGC8Teho=udy7B7M54Nv7!|U*ndTq`OYANg)e|0H5O1}|4%^&T!nf<`hcl&)FfpJ&p z7^@Yl5zG0_s-2T&M8(j-4;XwrpF^Lf&)eWTE;hPDGig0>0eFXPUcrGk!!l1&Z^}12 zX;sp&iXGJgc&p(sdBf*%o7VJXTGO!cjnUWr7cB>FTlZ&o#zp&i_V`jdyf9Py+wyPT z|N6Br?K2ZPAP!AB6Zr+ty|w<8DS7>n`86E!;tV|Th}a)CF}#4xl?cD;=nC%uh1$b~CvnKb0|CIe@4j_|#YAKk$5xDuBk-G@FfFQGhP=H1^B->U=t z|1mEd9Fus@7x*2hI|d)1y#s0_|4&|$gWL~yDo%X;vAf-WQ)iydzm`|ptM0rz>RD7{ z=q+F`c%iVRwEx}-pHDrf?{%3L^LqP#|Dk<`>UTeLGjF?ej+V>w2aDrV9RO$K(ab;9 zpQXLnnm5Ne@@W2RM;?9P#uBapuHw4c!x`_$&zlbgo~8bGzTA#8F#%uQYu*|Mc6qoLY=i^Vz?l_6eh^r<)S@!hQ4nZ}&s{ z7vpI4?(*zUf9vdy{7uW1zQ7Fc#j|;dI8@(d5Y`NzL=fPUAx ze{oSC;=P|-gF`Lg8df_`J^YIor~Mss&h3)9)@HK_b5C>Qd_GTJ<9&7u2lP%DAbx*6 z5KMsXOs_S1hWwr6fqEhJ8m=7u;L4>VaclJe`mYTdkmYUM_U76`yUZ4N#l3{< zo{sf+T-f4DI}Y=aY*sb2v)*I7s+Z#w$=Q0jJZl!rkLZ5eU##YH4)PzRBVX}ZK79b@ zzh7>cR0p0^X4bMGQks~{&7l-oK{29{?j;K+B}pO2wm!^uiv z9v_PzKK3bz2VrQ<>GWi{C%k3Eq^&SW=gYkNz5A2hIV`&;$> zLoXX{7k9@jWG(->GzQs9BQQ(!1_A*FNxMdwp7u13NUoPQO6AB40M!%fByf+2955 z&XnBC=ALQ7@&|0UkF&9xquSx3$JgJAXU)FEY#I}~HT98M1C6jbq&B(oe22u-1>DHIdYUP8hu}VNP8ioNes>xc_>rkcUwdKtwZB|A(k#hL zX$Jm(=(TUZ{LKAZAKe4b8(;VT`nR5b?b}PVtBdCT8wY;)$3wqrE_lYS!_$+V^^9IW z?Jdpi=&j_Xm3EySQ3K53)GVZ9ady)jhQWm|tNouJyJO8N`NK9h$&Wp6eEKPSLU6ut zs^lec6b?y8Xr4n)>m4oRb31ya4}5SN*6cp7^RWH|UHp2S(`L~3t5KV2%l*|H>Vsq5 ze>FmTfmXx=JE}i0v`X!Kns*--$C=Kzj2>0bpw_Y@ir;>m-!N5uC!NFQq%$`Bi}Z+x z;{Cx}CY-eiSjm(;lHNId{jj|q)Bo_B_?y&ZcS^RRBN(F}LYs{5?! zk#;KOSsSlP-KKWhGW%AG$4`J?*j>r*_46y$>&yCqEA|{;;q~5L(e3uY;8Wj$zvq|B zJGTA_fBY!?i5I4L7KW0C5&jfR9nQF0AHvFb{p*YJTDvYThfSqD8QL{_{<%t<}fV%c1O~q>Q zcG~-zt_Fy=6_(GFFHZZU*~wwgaY;?EP>%}RIpWR_|0(&ux-DP%CGX#vD0hp+?cc>w z3}^LEb$Rs(te@AAJ08cce7^zr>wbDpt2}3%<72Plv+nL(5l?Tc-EVpKcVNBM0qQ>7 ztah2L6enn()XDC-JHL@n*&3Xrn#12^CW;%3ladBLpYEHU?~dLeZR@$P!uWW;*F4Vs zET5`8N`^l^ucDdeT(}JrG$#l3?g!PQ2Vei@^3;RBczzZRxBwgQ3|GtyKKAtA-MRqJ zJL~@cPkSDIYx#iM;4ogvVOq5VYW{tCFWR3~o|h-Y)uViAUs`al+gSo@F-Hqa<68uC zU!Y|VV^}s@SQ4Z0b6$$0F!sjh<&pNl`B6`ng9a{`b|b&dd^pSZH{ZrPz31-Bdl%xuhQ+o!so6+;1Dq*%3tk`Yezkje zFH9~hH%{BwsiGf?*Q6dxgSK*M-tRfm{ZwfO@L+K))AG#)aAstTq!)AKn z+GbU16~9+cU_*gVg39puE`8uWV*k}?zdcQUmBeF$}v08@eIDSJflxmW9j+L%&Q~ylf#qPpIao*5!1v$8V5MvZoD1-+q3R{xj8H?Kfe4mc5xJb80m%N{s-#( z`)?gyz5`2p0Gl#fTD}v%zzk8ZI(9v@^JW)!$jdmb%+Mavd!D~`r2DUypK(W={c_sS zALF3tWAQed4KxF7J{0#?9gs&SKeLPC!mG2eziGZN!wXVh(tWRQY&YK=jAB90w&q-@ z6USb_=GxWpSLB~_uxtIc{X;Y_Vz>HcHC|mjaXJ+Ep}s`^=-taR!}B10Njp%kxtHl@ zZvFiSXYTrSUb1%|e|Y-IlN0a0Yya8Ja<~}QtVPa}A9ydrP3lMCQTo#MUcedL`8cBa zL8?PujFX-3`~&snJu|#;z59=!J@Q0P6@TB(pwsUD#`QFrc?`gAZjUohC+yvMf2&*O zlsE9MciP29w|ol*c*9v)le>@LgHETV5g*&J7gjQQa5)TbbMuIq)5IHJ{NkP;Y+rp! z-M`O$j7v41eg7}MHSO6m;s6fT@9|Rk__+IeqA>00a+uz=8lT?sSlH8|x@XMqs-^80 zx}2AgpL5i!p8a8b_CxC8L$Ip+<7UP?P>;eX@CDN{w@1$XgQ570=6LZ=JySY77*ZOj zxNYWl@hgwUb%0?EFIL*?GrSkh&|a_Hed8D2|MtW8zBkW9yOQXjcuI{k9rkCJ+vq_z zX#31Q)lqS_%0FYTj-SPR!0bFdTU+~}qc#n* zt5%&9119iO_L&RrfAVLaJm@(cg8$9f5wiT&AOG4CFWMt&s3~>R0ln6KeJ@T{OHLc)NM8 z)phP^_r)D_N96kMah(5Y@$-=1pXR4oviv}!W|wg@$oRHu7zycYAf%%^>K zw_@|Wd_c|ie*|MHN8M}BhwuL*bG>5i*cAk;OGmsz8*uB%yHAL{Ct#|0uW?vm{KY2o ziaT$v{`76N&bBRxAfzglwI zduabcbC-jEfBEW!|G!@x*o&VZ7PwE|w!4S+(|OY;;kSN5Z@Yfbvz@_hS~Dxr|GKa7 zOJ7`9pKosRMcQm`B&V#^>&r9ZFaK8kfI0})%*)uhg=MBMgL5>yS9>-Gh({D2UA;s< zH0s87={Pq%%X)NQ;>6HE=U?nOt>0CfK6&jY7ve^~tvl~x zd1(0B;cJ*7s14yk{Q7wIj(3Uc8y_H^Z=bQbj^`WRH0$|H_pHR({c6?&uv7icXD8hI zeUHC*ZC^c5vyHeQo(+GAe{o7}k1M#?jM#kmbi1b}d@s1EJ%pEjb`Q(3(OY>6Pp*cUxVmcgLlstsjJkupJ_54b<@KUb7cKXn*#~*#yZL^_m z9NX)-9@oTxT~BxS&ik0F)`sudu>w!e(^uUphTF|T)53?sxo_V51UF#JoMHcTEBV8> zXY%Z2+|2yD(sg(C+nY11Uu^F>e5g4PuZE#rva8)JQT|_cHee6C__$b#3oJMBDEBjz z$J2ffFK%bXy%GP+)xxFmQ4Utq;>mVS^D%F398WIqjJWPsow;_crI9Fy?CzO=btSDr ze8YA)dH*;d&mF^$7lZ7yOmE~&$UW*xJRw{toV&r#@9y7!>(_q%t{i<=Jh(UbcORO$ zTOA%}7=A|!f=hSx*YbxMx@ga#K6Mrc;fVfU{2DVoJQjSkm9%>=?dV(Y@uPq8*j^vc z_r9FpeENxgwR+%wT%T$ySPMV?)mv&U{$IR-X${r(dMEw8*+w{b+>5+E@p-P7``s_S z;@K(K=)Nbv`zP_qCz{2HrS<0NqG#&Gz3ZvBPJd;e8sVV(XKr_PHXXH{%m>BaNqGJw zT;KrC)!H#A+(BBt(W8k0)!cAS9QEeNaH@7W=6#ND==0+J@YTZi_gwQ! zy@lU(3ns;L>EvB_tomR*oU8cGJ3;NhKR3(=4pNSjhny304EL}ZqQArU4-d|p7|sqy zj~mas_vjkm+xXKnBL?6|r9H34!UagP*cqK1+*G{u`XTR$SO4Hx<09fB@E*!r98b&_ zP05w>Q|;NpLM>(R&Gb&IAU?}2n~H}fKaZRmM6#3c6-7VA#Vc~9{yx=Zp@ znyBN~o%ii>6i=GY<86Iq-ZZ!6{vCZOj={yTBQI{S*c`qyr(T>={~T0n!zcJg+a>0m zHEUT2w+-JjAN2i4KUNGXC)6W1yUjzcy{}X1(6oH`3}@%$vKe*K0rTj+Fr^9cMg51t2xy) z@jLNm=w?1>Z_EdO={6i;;A-LP>FE9Y?QrMLV!6rZT*Mb$hK(=7=6CN$URQjV<>_jZ z{P5j}lb1dJ8~M<~3-9aopNK6#_Iw|7Zp{zwnlH7-FMglC_T=ypaPOPb@@N>mtW)(W z-jg`@lKBm+!>-ouK0eZ>^96f8dqgifore^zf2&KyrIc|6Zz!o|a`P!K!wri-fePI(`u&j1f zW5j(pyEJ;=c$&><^SQGV!=H`kRj(EvxG7fo+;XFSTs<;deX72i@|+HPhKJ+H;SyDs z9@d}ERKFBE^xNW<&k{e^d4b*MF^(_RTuGj6U)fgN$>IVY;a5L$5V!9T4S{-p6<6%+ zw7ccrw|@%Hr=5g+%+j!{>*G1cd5LEmS8xfhd&54mtKWU~pWb}!(topqqkc;dF!)R2 z*j1kqH(lSmL61jw(u|en|FSvAR=;+4^ss!=aUb$e?%ccgcg^{o+qw4B@mPkLt$%(& zeyh$Mxw!X=w-moCK9uioCk3As&r{x0fBN#g(+=qm#Q*jwtX|4)n@vA-a zJxKRF<$J-8KRb>8x8HxSA2s9KG#kBes5*Aki$~L}=->Q%HBi`owW408-W%4ls?MXy zT^M^G@_<|ugZ=*eKC36;N<%mD&RNS-GL0FXiCD2Mzov@_OTHEN%seIktj?9*v~##J z^8UaY=pW+LRlll@7UUkY1^!2QDw?6f4|m!@)g0OPyzP6olLnvXr8tT4`$i9sZwzZz z-yZd@+L35yWZ%QHUJPq?56A3F&D`_Nqdwj>-Pt-G^O?LN1~+2hB>8pJV>g4Kg|6=N z9>OT+`K(UkcOTAQdCVkM=$}4#Wj>v6obS9=$8sGIIj%OulLuxo1op?ua3yu=3x7q%n}x0(dU{?H3uHE**N{aul&&5FMW}I zpjn03-2RPrx)0nstv}q5w}d}Gb|1s%x4oY~cD{e{pWdW% zz1}`g{et<0e0;&#<-=sQl*bD%i8FanT;m13MJtwOx7`st&6Z(Ix8DYefe4}x@^?j|jge2Wu!6@HqRYISy8&a@)!4H^3Z%ORaZF**I)QZY0> z<JtEFd){Dw#2h_Af^P_HpBjcmu(Yb$1dWc!?qnVWF(6iJxcK2cN zJ%4k$8+z<~_OE*Od7067J+Ib$G5sfQsk<)@xM$^QSdnvS&x5bwr=3TD+?|(2vvcjiW&Jbc!Mz9pP^}o0K>G8M=t2TrJd$&G5z=(FHgMo?bUFve3%d9anl?jOjpfG1GYIEE~9SUFlX8D zOx4Ee1y+XESqyN_<%bRLV&yDdPrc5l2fWMTturHksrUGfJfH9Gjp|x_)63~P-7$ZL zXA@6t`5O;|Zg_W3+TakUUG#IOv0Bs@3?E%JLAYRhwLB;1AjL-t92Iiq36_XFp1OcYRDfhK2cn|a^a@CP+vnY74}#@ zU!T+8A8~(ZfAB>0&ffphn}7KJde`<6q?Z|(F|Mw;FbvO}($9!{9@i)?2JcMIz*)Uv z7uhy1yW96S|H&O+H`N1I_!t(S_G6n7{TFK8(EUKgCD!Bh9t% zR0kJZ!Pcs0251a_6@xsL^b?jbR>8Ehf_TfbwgojL4@Ay1% z=+fD=E7pv9;|P2d&QBwq2kF2X%yN!>VCcZzo8~~_OltoZFAu*$@!olJ_vPrkPSk1M zyL0*6W_itB-AdyVegNm5&%Y#n1I$nEP{Yctu;LqLdF?|E7q}`$%iUt@2Y&l%F%=&# zzq;K%mB)eSsh0N$tm*{tKzh8gd|@(-`hE&2Q8nz3sIfB3>-by5D0 z2kSr8Flj=aoqB#hbDnP(SJEGi-YbmGGno<_`Nh?b(IA|^5=Up&zq^AMr}a_(KOF^* zg1K5X{gS#a9A?gJdrlpY_d3jdCGPDl*g6l?)A<&+_SsdN#AiY0q{p96+ymO5c)y^oVuEfN(1@3qB(b=5{BCMIHm{9M znxj+gELW#)m|ZH_J6v{8+TRo|o=;&uap{DrXJ*{{=JkUcUcC47#QQiEH>tk6oH?-DcB@@F zKKq}(Xx@$!sRo}?bD0yvj$Xm3f=fBSW^u2i1)hd|<(o2gs*B%)pQ}y_U&&K)Q4F(l z>*O{J$S#5t?*Ex^iLlml=|j!>+s8aFwudP-uXQ(0hGF$H;0>-H(J!0(h*3u`j$YF& zvwN90*X|t+7v0^3d$pR|yKsM2ui=q7>u``f!awlYO@F6Y3j27D#w4D(oK#OMmgKE} zqjRrEYiF^Z0=5U^jbm1Am)_U=rb{*_wofz;f839MhsTS6HlnQ-&>dk5lgb$huhj~0C=tV;blj|;qDUb_)LK@92{;UdFp&1&mkI$xfFeiTOp zcG6tf9X7)ozDUib)x=>AxN&*t*uRSJ)$YJ+&6;seZpIgttCq!_(Zj2o)bnwUkFTlm zuetZz?(4OF{pd5(+Yhh&_t$U_Hq;VpyzS1l(=3k@GtKIU;!i!0bI;Sm>~-{dG}Ul` zJV2X=^=z+HgQ$ImXPerwS>cTPHph2wnhs*p=Re~2FN(RtUsaB~>ReWLo^qG_%z3^x zA5KFIujQvk!{WWH!A!!-58LTDqwZYfr@w|X*q-h=GnPXSFa6JZ`F$Oz-_Wb6{os_V zFP;lu7`+;AqTXRU1DxlD=AZfe__@QZ;u!97^23eA*ZLE+N6+{weCDdN*Lk_(jD>@k zx7)YzOCP+Q&dvtak^=<#%#wT4IWVBk$V z{qY-5e&*A8{R~eQSi~(jz&-vWZ;RLW^cz?8L*Ah}pZ|^+#Xo`Guzl0^$Eg3)WE_^i zhbOe$PIp76O0SOR9FKTt3B&%~Z!z#}9I~OeQ%}olKR>w>2ogc<=0CSeO$f%e6e{>Y|S4f zUz{T_tVKOkb-tcKt*@p~TZH}S{nyXwbDN89<@GeU+3DBhLwPfNY)MQ^|1mJk`o(l4 z^2p_U#q1WoPJ41iPJlbZ3}NTRfzcbqCsR9__0{|5J(w@e*5l9o%=NHb;B@QD&F$RB zInOW5J4P3Q+kE@=so#A2(YrqUz$_^}eSWFx zfi2IWp6$hR;_+pBh6m50SX&)h@0rJhx+*;ShVQ)-<|xk5i?3hKgJ|r#u)oh|zZ0Lx z-stvo;AQ7kkuOMl+rltc$}M8^Nj2V4ae;1dgEr^Pm-p!b+)um;Gb!g>epA2co!zrA zr9<9PHFq(pbm9!)Q9pu zAJGrNC_i-9-Mh{gX2Wi#d7c8Z>gXAHZQe7&FQDJg2e{qtC;dB3uDF(e#+q79->XOG zH!H_f4|m>*zuo`v)q7%$__CtUSXF17;AgOW!+De^&R)ZVP)jurJ*SpBZ8myl>}7I> zZkWkz!>PB`YUM{bU>ui|eGQy4%&L2@&TTG{Rv^CLm`8@E$fdj3yzVy?1uZasSnMIHeUsE zAop{4%3k2{OE=0F9Z#YAp09oWb~oIE>t=%2;;s*Wv(JrMV1w3nE*>{M@`B&LoNrHY zQ{IPNolk33?+Ft?&wO=ir*$a#Xa2&JJU6NiE$yP7i{o z`*iwHXJAeYuQsiY@wxOg@(6r%+KlAjJ2khnXy+@=EgpKk_+(rFIO#OZvUj1@ePvcW zDfgS%T(EP+y&X81nJSHld!t9=vW=dP%pYi z>Jt4O4|l)LBV_E>)uXJbrLV@tE(V0Lc@{m-^24^-=N%fRp|kO9@=6{4b?%M2?LzM> z&3fMI`5wd7&eN=KUgw|Q8NE6@P;ma^xQf4dgj_XKEcg5Q-NSSR@rvmDo6Gt67Ulo; zO6H%xAQsH4L66Y&9ZJt1)-rIu&u_xxPfxu0)zb(1Cmkfs!}?Tr9uHa!;Pvo@5A}@g zn~?wI<>L3qr(*Iuvj??@xu!EGmlV6MnmwFLckHY-Cpd@SN#86lz*pU8F|oSTj6B}+ z`pRZ!soq|XZ^jDief1@I0j{Pt2s4Jy))Tcu4uDj>^EO>;yUEP8)VlO0d8Ejvi?F!%iiX?PM>elCliVl<@Op^1 zi@!%l((J=KpEaA&*XRL`)3w>L0;7T(z@{#={{^;jQf@PgQZvOBI_O+`-Y_owOa0UA zh{yJp>M0L7W7GD4&Ze=l_v4hkKWo)b>PB&j9_IOckUd+tnYuT;p!zEx>*lTe*u&A@ zzx?L!{qwXCamDb0)L7;+zDGOlu9yK-M_lcE!wGMj$ER()RUg!>U9C7cD8(Idx}FjT zXJPossQb6g-p3wTce%TN{Xd%-s0H#2y3&~!3pTrNen#<{H&Om6zjUG)e_b5{Q#`Q% zD>wUDj~Cn7nucMz?;nCQ^9uR=`V>9n-tT|&_x8ND{rh{&Mfa%zXW#LZocH*VO~@ros%(mEw@_BG{PH@5xuV(4IdWr{`^NyxJ4a-t$ajt2Xz1)q(0) zxik-r_|SQvY*f>y!GzTwz9FfH#_n0Y;bFL0{%7apqwBEg_Uq(J z5a#N6=r{Qn;XdC^3*qkG9KCOv=i;>3EBBkD*(E{Cudc>>xX^o051hXatEStfXJ4Q< z#h<8WOYd7vA;$FF^?Tj>X2RqCs~ty9uAWMpwFCoLYX0%}D_@>^a(a9C&3SJ5HMEN_ zzXE>6XNqIpZG4A3+&1v?R&Y}m244r4&wPILWNM81cARB?zi2lZ@uKV9 z7S)?`b}>(Tr-z*v`1;w&W*_Q+{9@En=`=@OwIq(tx67gT@B0q?Dva9s=CfhHYW@uC z$IEHBjhlJQ9H2ef{~yOZ|7f0ov*wEJeVCNT()1n7+YlBw)%W&}mOZm2GhFzA_ln2h zd4&}ZucB~R^{g5?4oCQkT134Lhgjn?xJ9>jrRP{rHEKh#vi#t#=I2$;NLw>%dGYI7 zc#U|}yxkm8tpY<-$6tY6-88Gam+o)y1kLpI@He~vVKqHd=RFPfm>H@QUp4!Wr#_er52R@IH8D9PbPr7FVZm!+1x2F z`@MRYZ_<(1zA-ob-T&p;!?dM`Xh!gK|A1%5r=P(e$JJk%q8~e;9ylOo3=F_KD=u_) znCboq4A1hk?_!*JpISxF2CMEK!J_%O$rtzq>(lsHlemL>&20AZ?4A%u z4vIfRW2Agdxtj!%HxcD|WwZt3i3My8rDU$?HIG^uzc6@*Ujja`$$z)4Zs@ zXIG!0UK6iJKkYuK8_J1%{CV)nmF9SQ$>(0la`A+@rV? zYTj~M&mf7BR(4*W%HAh@bVLR`h-*aOzysVAD=Ienf=al zdegn?DPCvGah;~sr~Ax`^PQS9FU|vO!at|HgL(IG*}Uo0e|rA2`LOzaX2keZ;(Gd^ z_%7;QIpu6|LG8s8qB^u^)2uyz@_~8!oC7n+uOZE;v*=k|S2OMIFKB;}=iJ;9H*(Re zXhS}%FSE1bM3~gAH-GNeCv&UQD2l;t=(J!43Yue8f!mjdv_0<3K?~mJC{9Ak43n9;>1*aWp zr`h^Jdhz}L&+X^;-~IO=+-Jx6p4Yzd**%ZG_8ETCtNZOi-A{YA7Y<0jyUKSp{+Peh ze)NG|@9u$?58WkR*=e`rRi1;Fy8q4+p8Ue5d5L?IZbqFKW~fe4qinR7VgKWgetm+j z>yWz?9-N0?TE}|AMY%N`Af7Gk=jiq3P3Ch~;6izw=)V@W`I-(dMzhhI@@9Jo^kVUE zy&Ll{F{1a=or}X07Om%Z#(9Cn<&i(lCeEszPu`5D8c#bf%YiML|A}j6aCWf`@1T6x z_2Q!*fkVH519$Z7B0t1=_|l<=tKZu9@btI#xs#J}%B;_jR$S~)Q;w^nu6N(@o7!^@ zBQY!R-#RB@Z@aUo=26XL+i`RutXZ7PEBE;DjH~b2)F1Jf`~2vc-IqMA@L1zKiW#F{ z>GKYbj=vLL5f{RJS5H<~wx{BpJm&i}&%$$GfAMnXPyHI68lE!lKd#OYtJJ^FKf zYxP(BOYcwL?-`_%y(!P{;7x_iUG2Sy5%p+!1zcC3-l$IP-op!MR`pl$6mbaD>pTr! z;&pH={S!U;@Y!vrpBlnDpb-%>?UX;ZAui?vZx;Tc1wJoxG~KhbnmC^7M$cC~$j3Pz z`QiE>d2><>)Sr)?Fi-v6|N80nzwCMK+aKNYy?^_$J^$~&|E)d$*Z;ZdpD*tb4|qSm z{4_ku|Nl6@h|~MN|DB}+_x|Sj{eS!K>^G+)H-CRhzsfgaed6&qR`aGj?CsuumQi;lIbv<@2$!RUeS%7iM$J?&DvNtA0C0zM3 zKYQ5l7Z<9ny}Rmw1)QiO`jkocfA4FjzrEKCKg}c#TXXs}47lt3rOZ+CG;%La(@)>t+%C4YUV+A`_kC&hO6Gr+MVhiHPucYagX2ki}6Zt zd2Tn&vdvlYOcaOlTAzI6-47lt{p1sR@w;NjZO`4_DSdPtjaN73X$#XApn_0K=IsaDVXCVn2j0-m5>T3%3tr1hC{ z=F{+}=QmUR+yq{aeD~3P&Mw~H8Tx^h^bYv|9FkXfd70abUGmaq@#U>w`{VkjFy_2; z%R>v*!M##{oL8@%;X(PS{WKZ- z)P$W2JlIS1fbm++sVC%K_2`Qid6|ZN>rdO63l}f8wnuNwvrfPFn*NA>y1i2;)mRJh z0QgA70f7C%8qJ{8w)xn-xFP?+A6CTB{K{a6&U5uxvqE*jjz6o85Fgr8Jo=%y4 zxv!Qx_2%MN#=czl+IxdT@A7uyuO58u3VG)>JT)40kVV$%yJFPm#@yz%~j-5s6x=k!T*P-pBH2Ql#o6jP~uha6`(eCev zPaj_>|Ce?=v=^ZoKM(%m;)=dtQwN^aNb)8WAhZ%wZ!GB14uwfo|J1X=scydEe8@e&s-74cd$Cn*!zbZIo)*u&G(2#;_eHhV z+^BDsufZ_rjq|^w<8+@7%>s>+%szHoVhW z_A}XI{`{qlw|@TeIr#79z<;0HuxqPCQ+U+-g{paqO+1-_=)B?YK)j2w6rk`#Y zj!^Clckp!q?-)0<7&f>e{C@eqoU>DSL%%d?pzzOp_8wgS<2`@7b9Fc8-}=;^`+xaP z9Qdox?D>ChZ;iZP&F}8p_pthu{QlH;|7KNv@IOB7uEPgbpDFME-L03NffepoYaGgl z-rb)K$4PT8-{yIT7o7L{s#)R+4)ceO@QImghVbyuKd=B3&UbkRHggE}V$b|5qb7Uf zPe1cCkD904{ik__>=P4s1KHj8h2K6{{jUyAo0itwIcXNfH;*^IKCK-Lc8pa+^O>+C zz!<@J6Uy2KLD}2Cn#KYR<&ZzO@&BfVk&I8xtRsZ~@@W1v?T=y>0 zOjp}p9sOZ*r)E*>ad69Ht)c-7KPW(mn&T4SWFJMVp&u=xe-g`@7l$1LI!Jw?C|7_-Zw;uIG0T zw)C<)_<-?zah-UUudH5$r`*i%jxXJgp5um?k#6mF-rnMB-naSlhCysO>(}9fH^QiK z3eLf)+IwZ@ygSo}t;t{f+IHte;~whAXT<^iaGapQm+|+iv(z>56L2{4sKUqM^~;wd z-KUw#;e02}Ji`CtDtktsjn6;y0`Xi4F*55sX_1b?)cNX{0e=Cls1yPF+Z+4gm zZm#EY)!pC16Wqmr`5D8nZ+ec`>hshA{5)YQ>+Ne&BYx=TZ~t)dJ$F5yJH<(HSgycN z!$mBwghQ(lh7X^+-cFOe-f!w#htD}&>5kZOTital4A&XF{P(|ndGn2*`yCz^pF4;D zqOKD&`Eja^stITj%|T`})W8?K0W-;L7%%?|t#>d%pkmKhX1E z9JRm?zG2SyjnD1L8%iIq*ME86Yu{czpsvqLYTv*~zV(|Ec}9itH7DTzI>}FZ%C6ZX zzQ*23f7fDj9vq1Li(vqCcdxFhU+F~o$?;sr|C(>t*#d63ex)3CK2OzjTx0h*qooJ@EBj{FvG1%CbUfs@Ib?KZP@<+y=*yXPrc>SZ_+-C>zK5^h+vw$@5 zctTn<+ zEXPdg`}c(%IcxFJ%kkl>>F9jV)x6(lJ3r2hnZ7sWY0-=VQJV4-FT! z-F|AsQv&qu94`Y8CI z`hUyW5Chu*a;91Rz6Y27V$b(p+1X>q!5&`QPs8rpZ@O3hZ6{n@-}Yv}+?UPsPUzq9 z`*^|Pp5UdNfJZG4A2>Xe8FzWMy)yhC(|IhVQD|53*kSXfRag$6F8gHR4(5x?vv7gp z(wGI?OKp$chssa8IxYK_^z?apA4;<|Fu>#L!Z0FU?))>B%IV=ng4j2TEM<4 zz1Z-IrpwF6tNk>%6YAj|_eig%Mur24_e;%t+}md9aUyUi(|ZifZMs|E7q&yQlYfM} zen76Dczx}g6W{x-zuIT^|BO2SfEo1E-~wOByU7_Bhtvv7Kb*7oFs)-Vqx?zRla+5} zTEw%}e`6-UY}U2m*>B*WUvA#)_sTV465^Qs4AqqCbJ~aFga7L1ZujH7Il%0HJm&9# zZ;NwzAA}v2_xyR<)YXgbme{fKLYk!N_AB;h=5cp94}|I`ICfs8`BvS3{EP25#0@;il#-%8i#&)x8B)8^l< zPLPx2xG~$w)1;ZlY##8=#_*SL&f+8GYdz-c)yB;gs+co*2dB3Nf3*y7zgS8ty%yaa6`qCL^a!xI3evij1 zjygLdSLv(Lh%bqG3qJec`}uQ=>WnqKvUbAn_7Q5kcn5HtV)(pxiQj%UEbp4S^%f7s z+mBa&>MlLXHFIfy?&N~Iv#3YXujnUeRNWWcw&pZ^Jlc1#?jFQbQh$0k?`XPUukMh# zF>m0$dN0jeic4l`@cGr1a(VeI{QeM*#Dw~5f3to&<|ZD#{H?t|c=8}4Ht|I>F+MBa~xFz3&HPOwU#OHY>&8XRgdm7HaN~_H0N8GKxxsevPoKbF) zV{Y>ze(?H#|6Ft9W=CNhbZVEHNtEwqo4Lqg{;tpQBz{GnU57`@`|$xz!VcQ0%G*Rf z+@uSptg!umjt>lRxFdfAQ12rQZL*-_8G&hXH+yUNt_I8S2SA=HpuB z2kQA&dxx`n)?&=)`_n<5#Fb3Dlomnk_8e&;hXz|*_4}G@*hgO7UJQ{7(nQQUvuV}y zoSvcUY4_BDG=lO%xYE$E@k-iT{;wDIUfN09Zq0V`%!et{{2%hpm)-fT^dbC6;@i;F z;GiDIo#UyH=0L3`Hs$Lgj`1s%Bk=5he+y6a>YG2^Z0Lj?n06H%UD%P&6#J-hRs zF0I+Bo^!+g?C0eHXDu%b^ICaeD{Yq8S6#FXt8CZB&d3KF_#$+*>iy+VEx{!b9%ekw14Uz zIJuh7+?&pfN8T|S>`xrTzTxs{S_1u%*ctzkuiEYQQN(GjPR3{Cp>mW?fVTRN zK2%&q@tY_SP?#+Z?I%2-xa~9rd zrzAd9GbUc9_L_a_fcerv9!C>)`RxDR>R;^>2PTSnzQ;Q?_)&Q#uTk0+JA&N(tB>CG z$(@Hk@$y}m-L{(Ga`mUP0{7yNl-G!#NglpoSIZrD@g5JIyX|jncJ%st-^c6irQ700 zo)~&Y8Y^B=p7*?%yQIe%dVyxy@=0D+`7Zd}=T%PWOv3sm)m9VEOS_T| znWId*-v^7ow8RJS{|*(G-T!p&i}j~4X!=uplH+54LHfg+<{dZFdGtPfmgaBq^9JwS zzo)T=1CM<}H`{ypy?^qtyRRKOeTRP@FWuF9yi4zxhjzEkLHLu)L)DS$vAaC@eq>(y zHcu{j|M^?6%~7ApJ@nDEitd=0-hCR}H1&P^MW@0q)anPrz{4sBM$&Exobz%9y_bF| z&H9U{ob$1#&F{;fD~@Bc)Oa)bY)#TYO{xDD)ikHlr^me;7)4qYv#W55ILh@TJ}W*v z%t!xQeIm!0aqs}wr{KZf9&v7+Z`H+<^X7H#{wF5vk%`0Z{;%ZO*^avQ(Jt~D8D7!& zkz4NE@J7+^wf`m0)*10f9^lU~%ilgob28Oj**i0PfW6^?ho7kcXUJowlA6NiRo z`5m5PTqnI3%pk44*(hHFed>*N9PoXuj=F=>bGzK{{)clvv9s`A{ebwF)*4=aVa&$G zpLY1QEBYo}pnae6$638{yn`{DpxF$&a*pHJrlVXDJDRETcUBv$RpX90vFo|jE<5qU zOeBxT3zypSn!X%Y`26sz&{G|B{}0huOygV8SiRaF*hzONZ)%@^g$MA9`5Kz39GC0X z3$AxJyHN3y*gPhwm1i)DvFOKYsn6J^Lfi=B_)hwy2iSv%wn0 ziNWtsZ=Z4|?Fv=je*XL47 znXq&FoW_2WS+m}>&y(`)VfRZv^U5h&hh;p+aF8{1g}QHj3&)M#<)v*HNVsG>Xkj2H z#XLFcl#{}Nqp)~pKRC{gL;(OOKs3C9AhFw=* z!w(kY-1Ge4<kYUH+=>5LD4)jLml%o&W^s_Xl+RiHtpXH9&d{=zCpLRkI zi}U|V7|-J9Q_k8SymApI$37CfiR2Sl=A`Mf-mTo^lV*<$>AggVD3< znLX=valy#(*yKNF#+)^MWHAd~U#`hdWCb2h%L7AIQ?<|i#rRF`K{$x~uP1;F;3KKK zR`ez(`6abG2mjG~oAW#mrB79h;ZK<*^79-TicS07SHC#LBcQKoyxwuPe0IJwaUb<| z_7wX&mz{@2v00Dn9;LZA_e=lWoLIe^#p)QdeO1_4p(k)LGfkb3-P$zeRq3WoX8XF z;K1;|ww0C?mu5LV^D-PpD_4sD zvtv&!EK;nT z@+O~w8)}Rl^+sBv+v-ZY<5&4OeDWrKo0=J&xT?(vTwy!!(`dVOkH95^Ee*irVLGximo zx#_;!3(@Y9Q9Is;3*4(7c=GO*2d}^Dg}3pg-i9l{_b$Lf^wwkU>}PQg;8*RirtLfl zQ!c-S!=2{Ye6}4W`PmLHl-_Ci%ri@~AJ-?1(vtdlmQH4Zm-b$H(Jb#{asA@xk2+k= zYc`+8YFaHgUp)YOKkS+E>GaIi{bo1#FDun??YD`~)V?tPp1#B#!jp%=GvCsF}HYln=#1`ja?)V()yO>}H^GE$PwJFvt1q@cI$6W(VgN&JTlb*TJO!f7rWA zpE>jdfB)X|dVtP<@G`VgHe@(T8{z^fW{B=4>4u zIdJ4MK4sn$ueZUesV0t>t=2s|TP+`_fAsRNo}3B;^clvE1T&;*SOV_E*e{XZ;jr4L zIxO#!Jhv~KquC>1hCVnS|36Rn7aaFprVBnd+~g`Zx#7k)zH)7qPo32{98EZa44M#S zKw%=nC=i4}o}`K0kY-s-4SB~`gM(zHd|iA9VsD3Iw1hzWv0aL_P=hI2H#t24E_ z(Uoe?Y5+kpd^SsaVyqT}0-UvV4%!I#-x^_p6 zb0D7W>d&*sT@4e?G(8?)I-K6a8&5rXFEPL!KfcyGyMO(WSN3l{+EV|&Vt2-z?=Coi zy*f{hiv#276%KEGxPCzEucjQ|^?mUYpbv?*sBrq!WAJ^kOK;osY;ZnkK-KSNqEq3~ z_XfXHThlKGtAmRqCeG;>3ML zyv*FaIhfz)US+NxJSer3UMu%Qo=gt{tMs{H7U_RrHfEUKmt1b%g(t3Of}IpzVXykc z{yBTO^!dS6+}*M-*}bmk?*E=YqWeE<9vM!;v_3nU@H(E-Z1zX#b#OuGg)Z?ETDTN$ zX81~{X){jdy^C39wtO!1tZML4yxJkNv_W-FpSUohKlI*9{4TzHi2-yGa5#SHxUq18 zCaixtUd$zz;NlhhDBKSHDm;7r=4+4cT>JChLmo+o<^_ASnd$vter11axXHm_;y*p) zJjLsDgkHV)@H$(C@8@$>eU@mz!ub!6zY@|02@#WjdG$w9E>n|(98i2>;c@K06_KmJ$sn@_&o!YNwj>ruFh!R-nF-2yFA4-7NDfKKA;@J+W)&=p(IdeoD)* zreNsF>&0s;m_6=P)w80FEIYECXg?0!!|#3fM-RN$*?8dATi<(7e{?c4fYiIC@9p~J z#kZ#?+=%oM&O`A@^gZaa;IH8-Wap>ZZ>gJcX~i6|=%RX_=S=*Ld58J4*|8PPdU$%C z`B{4+y8C+681iBx9Mx)Ot!5IrgW-OboR14Iix1oicOZNMSOu=YT>KeM++O>7_AkVH z@csErVpjIk`1@eBydcfddguUqU}@RS9G!T$&+$rYh6^kIC+EjUQx7o}&BzKYC;ff+ zY#@nJ%slf8Gr&S(bxKb%K^Ayj%DL%$>z8so9 zs`Q!8+_1QnSybKUO3d;1;_1lq(UZbk`tsa~dKYj^H^?yqKfw`31? zyo-lREDF~nJKbUX&Yu21cz?XLo?rI-qnj54=+=V?+iT~2(mY=ob)Wm(>t6M6ysE>y zjE*RJv(wJ>DS0xOmw$(q^OqARhJz<0o&-ls-0?F;QWH1_nJJn%@`>W>5YDape~`I` zc}CacMO@ANG8m1xynpm3!^gM&_}SxYPkiF|-Ny%yVStCXA8T!^$=3CAtMT44zcJs$ ze~cCdo(bECKY8XmW`LJk1!JFC$}Bm4P2qi|#w@!{Qva&6OV5~jAG|*pV7PKH`~`Z3 zv)R3bTjGqxYxC+%*^PDMXJ3Bcm;Z3}f&b?p-hSZM>pytl@W-78@a7+sL;Llpqsf8t zZ2X(;j5RNLdrse6c*Af++`;tXnP10;C-dJ0eezo~X4n_AW413IpE*nNdU@vV9$(Pt zi7&>(%D-2FS;V(6ajW>q`}@>v^!y8U=4AIc3?5%KcQm`>Z~~tjrXjH3uYUU0PhW`^ z8PETs9iSKS6Rw{P$arYwoJLmeu)DySA`Q30Vqw99}#$c2BkZ=rf zOvIxVxqD0e+jsttx?G;|?fhIdU?;Vb-=ijMWItrMMcZ({eRF_4JK?r(eYt;&|KApT zXIo6z)<0*5F>I^M&TDuwBlbTG{-&XJv%eiCQg%f8j+|xR3GWfTN87BXllr2>1YRX- z)YOIif8a#=nAG%USY>yp-@})5G5b;a@Wda!@zbS;oS}#GjSs6!AO6h`TPK4-cjv-# zrCr$0ZFa#||JBZi%qPw3H^jM}U_S14V()?3=C1o%W}NCOHNaTrmpgE~qu_T3k9mFQ z>EL+BzCRd8@f&RGO~d!h3=NKj&k)}Ly=HL5fIEt z$D^mueeI#_c(L0dGq|dGSG=FQoch)9bS6vh{&CA^_%XTr zYqj2EHNl$iEgt8%1hD<|TKN9($)V(NJpP=&(_+A>`!T>C3UT<-xy+`*ErQ$5gm;y_ zXgH_wJz2=?D6+y2PSyyAZBjL8eUU(m?Ee~&h=1=bVJ-ew3!ZE{vv{UR# zGdoVz|LtoZ{dPysxvf9g)*Gxv8zP68nRpiN2plQ=E9Z23#z~>&OftbSM{!$ z*-mB%e6{dmy5YM}vjR8@WtpHY1o{9S#nF8Ws< zp5@QY$&F3E4m=*kUvr`80~dzei^S6reNXOKyr}xK$LIQYzW?Bj^|#(#k=k|A@dVec)vkjyVzzUOFu z^raQw5w6Hs_QRDqNKHKwEV-BeQ2g<8|Dy$qrom3XtJymqpWXDw@qA0Jh7I68U2XKs z&F{atzVg1qAAaY7Uv7S<=zHGVBKV&@V%p9|q*Ry=p{h!0{*&JRezbCmpJVV|?FZS^8H?N3)z=ad;_e0nJ z?h-$dnY{NNv&=r84SC-u#DoX!vVPbr{Z-0t~~_-gPKNlj$;mVZX8qMww{FRu2; zU8(1L`B0zKi}s7#@sEcoIKK;H*;nd3H;3a}=X;|k#|NarQRk`I+nvmb__IetyeY5p zl%);F>GL`0NypZCLf^zfuFt_ul#O{E7Hp-1lS?kHWEu7k#*?1@lSGy%Ft-=W&pF$d2coaA2Kp za|U?%SUAYE(Tj4lebwOrs+afmEBp8|yLyN8|J(3@-5V|UpWa8TaGu0mIFo*@@Ak|_ zPxxn^;eb0c>irhaJGp&Ytd7i_u`rw*8w}Wd zuNU91sx;)_E=6d4vJMpW@{)>uUW>8HTjHuUl7fy+MU@9=F1w;PXTjt97y;_i!C@OOKO=u5+al=JK6 z3$!Ma)4~6P|2dO6yV13W&$33Vv3q;;iQ{+w><{k#dZuUJ9{bhA2|ZHcu)A*td8Hj6 zs$N(}e4D-*Ya!*WdFLQjgUNHkes^cjs96R;##N+jdQ-_dS&V z_i

)HCk8*?fs_Fu0lQf}aRZw(AZYWRG;=NqqkENB3jFu375-jSGFdaEP`)n|@Qx z>Dlp%4Hk-fdOEXtbqeh<{=vkR>;hQ!_eUqdr!xA0)CKl==m#=)a+jvzcBvsoU}nSW z`0k!>cPBrKuA=8?ZsU|YbONp&E>L`9%I*%Ixt88Hm=Ii8-4|}y#CrT&+~>Q8AOA%7 zc*pRTd%hQ*J3Jokz=YXt`#sy)O$g7}zW$|0j<0?G!^h$6iIuzI!IZwpE|b(}=8Dtq ze;v+I^?gmN+h~OrV3;tq=(0-Ao(TpIKOd7*7KiT7iicp?#e-D61Jf*eNOMlTiv6`> zOU0}B+xjzR0TbD2W{3N?PTp93=YbpVtUeHJZ(i!+694q=!T1UnCp+HU_x|X3+_8RM z((?B>-b#A=$@JFh#fhqZc_cdi+Z!`#@ze;fpMb$dCy=>g@FKNBqr%^`cI{gq3I9JF z?r3xp!&6t~oOC_X;O^0*=;P$s;Ar;S@G9`C`|QyL+ZWRAiRVH-lUYJM*?0)essrZY zDIA_=JhA(|@SWU!+9dJM%;HKHH{wArwl;kSVk*C|t70TCEF6Gv4dPujt+vTru9mr@ zK0i2MJQr8>3LC+9<=VrWqy0zWwD@xy_{mKk_1TvRSF~5~O}h|@dF#*@x0+s_U^hJOw}ad&F)H(&hzi2fjbWzi4) z^A|eVbBTXH*K&5s{6anr?=3U7)L_9rI_W=PQaS6{!Ixe0NAdGf({HCY3g6aQsmtMJ zEcrZYCY;q<&kWwZ@u`m;@lrg}A0OE;LHNW9a7tB(3v!!W$~DW#|A z38($&rH%g77W!y=lbjXYKK!$ha6IYL>v(8tzsiz2W9#NKe_V38+2%bl?67DTY5P2D znvcbJRl#S@#^)uT5!=^Z?!Bi!JPI!0ToPi zy5HQ&96^1^k1ZVD`Skp1|M|=b!Z(gKDDxrb>Dd*t{I%O(ePS6F$twl+jZ4t2tN7ex z2TgWw@QDkSD+ii&`Cj#Q?m;;JnQIP&x9@D6@>$?Bi+Z#-%m8Q=->FA4=ygGDaDf(a zPCSa9aLOEGD)Z6&UD1bSUj@GIVjae&9)YKf@x_{ZCOWmY9wafh>fh_~degk2jU&_% z2iC&xa7GXCeGcMVr!H7`-d28ZM~(9yUa)f;y`%TpSq_#QK2z6=kY53QRc8OAa`3GF zIGzFJ93)peJI;^y63%@zI`k~zc*hGztr9MH>GyHjR{S|}BiwNR{(PygJE_Y(t9Wa- z6ED3oa}7T#*m-KgYVaf9^@FU9KP3zk2BHoDiZa)3wUH{zG>u;#rqCJBT*l8qwnVrS&Zk4uu*Dm=Z@$*ps zlzo!>i5c$Cp8FqdTXs_|CGW%EXu$Yuz1avx+#fzZtzAD(=Wu*c^uVwtv)ef{6SFM$ zHNB@AKl5-tL~t{o-5tIhZdv)P?!kaQpo&MFeTr4PkO!izRFn1MwfFOhACON|TNG_3 zygI(gqc|t^n{Pk4M6=e(%;Hzi{m0|$pZ%j_ysNv}hnweMwz*WW`Ev{Qr`WNP{kyc3 za>nL+FMr_h`s^b|&d+AzX1MU4hdo>TiFhgDhXwnq>j&(4YtPcH)y=ERufqlEa)TJ^ zZtE>Gm&r^{eWaFI=+Dkk^ZEym{^GkQ^Z(ru`dC_bTD;(J>YD7xjz5`M9j+{`o8JBu z%pkh5)T9G=+=Ia%)F72$2Ze*)`KJ4Y^V6A& z@evs^Tj~1mnZNmc?q~EF6HQ!yS~waryr}r$-7)lyIjutjB`UT zSa73wte7o7N_U0!jcCDOG-BkEQ z&SSh5GS8tSgg=D4L@S=$ni|}lNxhNJoSwf4mu%4swQjui__7_<>*2BUq&whCx#z6& ztQ?EqZQ>LBGhRD(MetS1d(m%3pO^26Pt4^~OQ$c8tLO}A_U-$^D^d$Jc?H;S{Y*PC zF#C6AqpNlIGh3n~j}Kh<-g9tzF{3h3_*Ll%#0$8vx*;6pIT)LrT)~axZ1qy%DyrEo z4yq5sWyv1k5odhJnHUrYqT9k>hi%!3q_3P6hw3?heqY`F$bQ92eof3t9TY#W^clgn zQs1T)+LhCfZa@9>5!{i6Z>FOTF~7>rEc#uVb>C@tpxFy}kQaSSJk+;?8DwS>JV0F> zU)6RnS>JKLxS8BzK38}rbW@kZHL1AwHSuXWF(CQ__g&v;t}H)#=CG~_`@VUaz-iTc z19Dw&dWhu9atG}G%DoG3{pJfl9lT!ud1k_=-IK(D6aHDWq~Til?y?8CLNnUBe&r8W zZ+y9L_uxza^MThr`|$4J`|RU+<0$*gGhH8e7=XQ8JWTLklk0uHE%pDQIp_ZG>_&lQ zXSc*EEIT?t-`P@X^_tI9(+d=Q4@a~vCf5_AoQKh1{O&2;7{521H?deM-ckUqx>rzL*5hx ziQBLK_{7bt>ko(j?md**RL)Uq#LS?Y#@{J+!;zpy-?I zPs|JjHn8$9&+w>*1A6V@K;FClN1r`b8y$xqnw{D{cXV*>fgI#6%RxioA!G)iC#=Pz z$MbHbC$LATrrsHHC;Ov8@*VlTI9WW3g5~k%=so(%k51;!`ukzYxO}|Mea^(jXf$fM zCu+YzeL%mOuix`HnYy2^`TOa6Pr$Q)+%* zRWR+n_v#-wQp@e({OD27EbGTI2V9oR;$0uDH}8RkjvZv-W&P1j%1;1~anwn>&~4{vNeqkG@Y`EGA|ii#u1&kN!CPs>9mfpZryA`(d7{ zCyrVh(f-2z@!sCTMGgOvPpj`>Q_R1cS&uVtd~K#T=imT$c`rU)zAyD#^e?=N$IfoS zB(`aN_Hy^%`_G?0zV*@3V>7^G{mrhkvf-?#7kCEXA(j3(UKwT`-dk{q%=e?yXx@2l zt;8tx$w2%&O8#hMHm2W6FTi^cA8F8hW4N3veuC~K9farMS>@M!zxBlW_(k!I&JOgG ze0)y0>nEMRUO5^@eX$33?)^7cS5Msj`dVtB-ndVvsVt|>^+<>|}Ug2;scYC4eB`dgkl{;(CWiNUBKxqCd@t+nu($j}$*1*S{ z8H5}3o6+gv=k?4}G)!L{zWIY^D!i&P8%(|o?=ya#`E2omlv5YVtS9#;`M?>qgIu+OR=9fiugA>G5rHuH)&C!}-#-neblnwEWDo<;t>pdg-@A%i-Z<9v9EC z)O>QboL|uop3lyDHCDqe1KOVSfblPJmNxX+!IA88Iv2lu9(jK5ne2ACtj1VWD=kdx z72|V~+~It?=lC745SWd-ROYj4#Wzb{jb1vOf;_YExBLJ3jqk+gu0LKv@E^58baQiX zwdRr;VdvIIzq*d2wvHzx{>j!V)O#*@J9O#?WKajhnJMy1~ADjxpB|A zk00f(KeO!_rH?5*U^QMVHK22#r{weW_EfxJX*Z%X z@qeBC)!23qEOfxmqx8$+t5%))CcJM=kF%BU|Js*&kG+m^?^Dk^3p;vQS`Tw%ItAR_ zHT6!O!)m-hf^)zJkMNlf!pja-r(Ca9hiC-eYjAUH|#U`;Pm_Su$My7(v8!9LYXQ!9#oI9mH{!h9CT-bsrjf-7%1(eqwYFT16B=ErJW+DJe5p?5yCq()sxfI; zX;bZVcF%BRiceki(qfliH(y9>gV7`w`z(3y;=SkRjK;ffL*2dMd(6(iyEJ}B+5M${ zSksd%XLmC#`}Xy7AG&+<%;P+4MzV+145+#`uw;e5)HY^R$xc=RrKE)3o8I#c&u9Z7*J_K3}}z(fi~iJ?i`h zZOZ212QTren2#1^_s(N8JK^@@`0a<=8V^67^;>ZNE&cGec$s@%;*_(qb=iz zp5m)8XcjO;dsR*REu84{pW4J#-1^Prz>a%=U_QB@on_HX!vi+r3l;uB>K=G*<}z?t z_zbKBR|1NbIS4?bOIdB4*~=WdHv(RCN!VEswFs4_Fcr=Ez$BYsUa^NxW#lV(Mq zyEn?b3CY!&A(@3Z6vSv&FMQj^uZEpI>dx z;*L2xxNqtPy-K`T@p{jvcdv`3;gV;*UXQ5Chy@@(5YEOnUOeK^z$cm?5XG{RL= zuf#iQPK|_%qPK3r0-|;K|93Ipnh9OLlQ_3!B?#maKO zJm2E^U9hy&SnkmPU(4_j`t|>V zX6Sk+cl5dZs;2n*pAU|=7aTx*+7wfR3#9Kadq33fnaxEnU-n6PFJgXoH|M|AjNQ3* zxS#GZ-)H|lj8ihq_a(fN{CD;l#m}`T=h^w{m8bBd^z!io%wEFGDAk%ib1l2df@`Pl zcV^OK@jpKwJ%{=*=dM|m6U*nnKmY5!e(vvj4`2NIe)nxiKCNc1k~roL?CM{NU$Jb8F-N)qq zaB`!oO&-Rno}yErKjUHH`zw45J`YtrWGiP#%%6^zh#XQ8>&3dlx1aT$$D1QQgwgnA zZw3t9{ySV8ebULqO|{d2dS^KNqTK!b4CisgOmx(Jx36$9JkjtG3irTwyC!a>{&n}K z=rAYspi{on#q2FeO)@^7#u&tJ?DkG+S{a2SIrszZ2VRq(j3cs*-p`8JPSdll zls&}t?`IEjo;ln~T>>|NmBI6~8zS$`KBFmqD)g(Fd#1ORe|Gr49N_gI_#WaD7vBG} z_|m55n~fg`tUelpaN9=B^5V&mST3GL1IMd0erfKPb5Z)U%z@yvgW_jZ&!LxSidEy= zH~U8qQ^VwLhsz?L*QiF`^55panutD|a{lo%u;mc+>;p23G`cTdeELJ_sCu)bP>$Wd0nEZ*)y3%|(05EPzhf*^3`u<+oq_ ztNPLKcW3EBTKD5iW>Bj*rX8_<6@KZ?k8kR|GP8`%A-mq=%`CqzW=~D_ndXeehas~` z^&5RK9|F%Chmqf&e%9S;Wp-TZZn`YBTxRLZz65bjoXbs zq0dZzo&IvwuQ|)%4`c8cbWyzoYisi$|52P1(UL7OdM@x$8Xa^Rn58 zj|RhD##`&q&@bs5{k+r?X3_W?-cRu&vPY-FgQJ=n&J3$lxO_wBcT0`TCotMhpFi`0 z)G?VO#q)7Hyg1sjaAf$!Ov=ld`z_+VI7@%_mleCG`_-}o?tgH-%<`+^OR43;gDw4J znFr9j;7g?LluzXzy@1)Fdrl8HxkZ=0fBT7WS?hY3Iap)#=<{|HUMzdg{r8soe;byM zU)%^DkvzAp-_IW7Rp&MySZmJwx_&YEHm^LI?C>vFv+t$e7oHY=i2t7HclWdFgkI1urZw`>awo!n3pIE4$Ic z`H0R(P0i~r8c%x<^crw!*qi!Mzh6=J58ry>CnLH0*9ZQxeY1aQoi=KlJ}-BFTkjPf zf4svt?1b99^~$5$=0V%O>vgs1CjW=diFs{2mnE1;`kiRk*7-+v@X76ztLS53 zcWO1*-mn-D|0?(_3^RVFcwb^zQ%xE_f%Lf3`noFZQym6S^Y4l6L-Kg`nAhFc%#|we z|J?tR>Ymd$9cG>F)D+oa7Ve#Vibs`Q=(M=bW4v7QXPbCND~BIhS-bY(Z>)(kw4nUs zJ~p?i-t+JCw8*~WGjc!Nvdp3MH}PV~-w7k(3qgydjt$2!@wA*RzQLt-&mE4(HSY|0 zzvWJZ$697X;z{yDW}ulR1ebx?xOeo_>5Jjg@Jn0(+%i0|-P~Ev$ZVLNE@w7c0Un2* zwb@r?**tnpPUqKswWbal2$q%l!)G;zx7+c}3D4tvd_D?qMO`P3(V|b_rf06Hrtovs z2*I1CT4LUE`tIO9?t1ho8}9gunq$fPUQvIvae~(MfSd8Mp&bt7@Av zg9{dtXI{=)ICw{cZ?@qy4CyU)%>S;NLz?zy~kX-<5b%l*&%*L>KoCH6PN zH>W=s^W9#OUl+yu>_X(vB9GQmKizm{y{?vO-*|Lsg?H*&un+z!uvU5tSWv+_c>2RR zc5b}fw|6x6k)7h1&=}Z>f1;STDaS>B7>?8uUQDTRosHncv+09<=F;1^9|L;sp74*u zw=vg>x0F}$C6&*g3D+<)>Y_RHdxp&hqXP|&A8)%F&T!SdxE78E4pZWPKhL5eGmv5U zU_SdOJfO>UODrQnrb^8Kr;{9#tbf%JHG2wq%`?ppls)&RT<)OTfv zxZY)@XwmBLMAsg_ZQLYYdsAWgt=RA?QkHvGf?w$ zdELC4PYY~L%uD`@S9&|=Nl%H_iucCj)n|aw$*b{~*SGtb*iQOQOdb~VpIYPlu?Yj}{N@{<%p8k$;OvsK8NCv{D}C@8JAi0B#4^s5l9Zx-z{3`}b?!-4n4A@UhD)pfmJsdxC zx?w!7;JT-STl>2*&zn^P1#3*c(9^sB@p~~7PR*8=b5FMyoZPZ{kh_GjjxRpbRI`=>g}3%FodVs16LZ*8&q(;r{Q4D%#ig+;gW<`7(7`$ zIlg5U0mq%$65n9F^PTLearQdNNpe#M?;xMM%%9*G@J#&lvtwd>yv*^*d7uP45C`hc zKs;cpa_+EL*7b(QXH1My55fo*o&7S$%6`J){~O+b-a0*jI*dMq&R2|p;Y`$Xr^C$% z7L`2c4y~ki61Q?k#TK*<}Wy z{^D=Ba`fil3Qk{o{>)h7DU&?nj^G@HgBH*AnMTuh(56#Z@_VzJgvYP_(E3rkOQ!vd zw)%frFSy2sXxUz}*?5YJ11;xZm9D)zw>zVj`qUfk?8!)vEyrg+LAU_n<(Hj-u>TEr zjh9a|v6#l^qJN(XzLr@VKfij}=^D;lW|yf^606+fqSYyWB8|5*&l$;mR}-gitmhm= z+biC*^8M?ZazBbsqx>C=hsWk*_L1+#i`l$1UY+ayj`j3J11#nfl3neU4UYJ&M_8H!(`{5!%YB0g;KU@P3S%ocsOVr*tOyd>Ug&^kBpJSO{( ze)L@B&bNoN2WnQ0Tnpz;4pXDUVZ;(OWH?>nvcZNM!{#s917)`atmradUh}uickb7X z?NY0swJ(F_DLvACPGYzT#UDQN6Wju4RICs;Jf9K+qP-C}r^V0gHnFq0ZkGGP;f=m8 z-8=kX?fBXUE5|qbUc3h%xu-5YNKA(9?ZRlb^nPnFKzSRlyzKwe+b$G6_lUm7?CXnV zuHoN%_`1K}?yUFG*gv4Ac>r(TKFm5^dlkk}8IFIi^Ok*B;X(H3*WyjM>U*<) z=$Ur*l(qDxv(cuMJ5hX<w|{zGYRc?Ot%x!BidSY~2{rvlUEG+4BZR~1jN56A z6DcpGj$IF?oU`TUn8_vI!#S_S3ot%AW3VZnW$GWfGdvw}8Slfc1m}O%pIOT6NAFVc zT_slsCm2CO$65_<>2@%K6O@^E6Y1%^Ev?x8%^;-8Tj z0nhL3Mwkl5!x!{|UVbv?;RsjhP`n8~Z61olrzZ&ZsQ&USCh{3p;ve8F*>kiIfA!3r z)M@ASL(fO6!SiztmrAZ#yc|7M_Hl*(g_CLL>Rj}ea>)J zhP7L7KUFs$h6BR^c>MdjoxNy!egEO_Ub>WAh}%6ic(m~n-IqBrpQz|cGDCIWXT87V zdox}55M7x&q4viC<9F_JiC=J*{CB*>%UqmYHFG`j)WyAf z7(XdHEcHk8&h4aqFVBVV5}iC<>r1>BUe+rWJzaiJczSki(I;I|*DhY^^*rKfJ%qzB zYLD@>e7+pq$UW@b`S|i$aEy40-Fa+o6E7uxjC>(7gPd9yCsydc+wq3ei)LqC%e@|j zhmNME5L?0>@qJdr$?SzPn^MQ-u6U+ZF(TT+GH=d#bEa1OogJ|!xy3%5+Jqq6BtQ8(`<^tXN zEq?CtSg|wKY%-nz)3iXXc!cn%3KwC8|Jah8)uIoYy?OQV*6puXgDixbevgQez_>$pZgi_$ErA8&pwC)IMlA+ zhfi?1DTjwItVgCbplkD8_0z=l`o0GAQE)CkRby9L;<{LTx#dnSr4C4+$4@h}JKpmR zev`BNJZSk(#iy@&AWq}0E!bDVgTL%6qrb4T6NbejbV{tcn4LoD&7utoKL{68ork*| zy{7ME+8in#N6FK}zAy71&vz#Mw|tHl5^jrpjUVa^49;WKOTU1Vl$$L`f&CS^~T8ceL4+LX5r?|l3V$7=rL>mNGDueW}r9y@gR z_rqlr8xF;Q_&sMI9}UB~_@>))WtZGr^LR}Bt**d1uU6D574^;>KZ<#|e$IWLkH$Wp zx2chMRm|~PnC!!K4evFY+aCAdF3nlHFlOBSMtUe(a`hBE-}9iYy_%Rfnmg$Zx9$wQ z+L3?L!;4)PgX6FHHM#%dMmz}3rGw$)Xg9o?IUCL7?9_>}XaW zoIKzjX0{1CNQ|GlQY#v^DRVx1KiqXYAm&z_kLbIR3wvtLyZl~{#B3hW^}XQmevi51w_sN87GFg* zQD&w6JZ<{$M1m#pua#5ju}eS2Um@Rz{GXnpc!%%`<~2WwqcnbW{gL{i-4o)=44*!G zckk;E^S$|=*I;F-m*d%EW^*ok3G11;`TL7sg)_^O2 zUnRD~g53#tG)@Q)q13UzzltaR)+B!qJ={Wf4{>shIFKEbH9oIp*K7R7#EW1EJ>m1I zhkJ8xg7>&r)B3F@E>=r^jb^j!MV$K494_xay_Gz)mKjBQ+2Fp;BL4z?>Df}VESY;R zmHel6g>wW4+rIsgnFBk}jt@Tg?D4yOpE>5geawrWXXndD_H=~bx##=xs%)3O3I7Lv zElCFVIp;kMGoP7b>Jr+MN$3aaN%%tiz+eJ60^uRklRdi-FTvdLws@W1 zExae6JKt|!`0n<%!li=c)$kyO%@~G)F=kGceW7yEO5tCuk8?#cP)0yFW@GKX#Q_`SSjURw_*+~?0+Av(yO->ulubn&eo z-gc!1kXO~;a5M9_^fB`G{n>rI{$}>%utPupNG&V2%!>!F2J7cjJFi~D>o~`A(vG^k zd|$pRoT;W7ZLxUZWnPt@N-eJr(n|$n_jCE0sjZ3+BhTM>1jJ)I-0sxZd?e&)TB)v2u>V$jE+mKN+4$V? zk}R5u3cgPGgM;e-q0G;J^M$`^!vovA<8i(wcY+P4Z*msO+zHlHG-R-+?A>#&lh@zDzev8J?(SgKkIi#;f_P%5S~}&JTxOboz1n)gTo)dEwt|mrW_0z zw#T2HCrkEmheKy>7(TNaBzh^mV(~-9U%9Ya~AtF7H8D{sr8fpGgHBB*k-Xza#y=Odp^?A+?tdJ+aSw{5J!K%Wikn6VG{he#QuN?43 zJh=XcXG`us`sj1+{^UKi*pYuf!tKV9`0CnkKk+(V6pm?jtY4BVl6%VT88szMa&nWKr5#8o*D8?{7>S6B;STtr1!=v?&@^vI9mAo>X~?FZuq<1k8l7}@5{;J zhgwXXl^w6=#ei`>3hFBLFWezBU3@?u20Xyb`Pb-v*2DYr&rKYGZ5p8+{`p%lf{t3W zdh;jGj~xB==b~FGJCEfDaUA!CwlT9Y{b1dBEpa6^WPI{}^U0ziIKac;t#LWEQ#V%U zo=v@3jRs6_7SEo{dI!vd;%6}o2ME?N=vfaZ=ci_)TcH~WuGoOT&<^5p2mAGW58*&+ zi#a(zvxcS~#H<%r*^Zzl|DViW+=k!iB z_r!jt_9)6)m@;WS=0x1`5obvFPX!w;^O4H*iEcY{*Z%l z@_e4+r;7(>iKa?AqJ^muD(F&Z&4gxhq!V zKDL+Ox6x|j>pI`@wYR&$*{=GGg~R9`4n?DI=d~Z6=CyM&`Muoj_F2B<_T$Qt-dj7| zq}<=&`f~OCzG-1py(;TQV>uio@W|{sk7*Nsa!mh)UGl!3MbeAUl zz%GP)x1V_Kt~vKze9JxYNxf#*K{&8eW>;z%pJN)=tr@;z!L`n|i>FoDq5i2imZPsz zyEvb?)Gz?Jo$m!^czL3Qr?rZsu@N3m_&f4OJ9wbELpR6q=uPaEM{|br=d+Ik_XM|K z<_wN5-d`7cT+022Bdo#!H_QF6Ke?SfAU@Ly{AyV($}_aizviXk8}B?-feX~Ks{l3$ z1Ae366}kV(RoP|eyv9o```wPir-^4> zzk8QCaLspCa~7ljYX)n@C)|Tc9qM_rOJfICwdekC2d8qL&Fl5|<`Ck%S#L9#e$GQH zdZL@p{21s`nf(-SAT6h1ARDOne}G|7sew zoqi{M=I?o_>*HbLcA(3T>V|kO9e9SR^UM57%rL9bKj6HE^YS~pFx_$d19yNP-<^%_ zN)F=xc6A|pH%`*io{Z<495pOAnxCC*r+@UG^;dS~W@f>6CAeiU6+hqH`-<4wY~#K! z!;zvdSTcK}m1_0|>-Ie2cipE?(hEd0;9h#k!%gQ@Ego-H^@u%vaLsUGeV_K)HJ*)c z>q_P#$(L$`O8R&+#7gF#_Cz-`e}+3}cP-w-g|*vHd}UeBIV<0U>mN>ORsTPl86d5| zXmXBw9dCc{WlY>Rw~;f%Lf+*|@xG7FJfAW9)9jvdKL6~~n>ejI>g64NvHQg@`kBfu zjpUwZz9qN76L>emxO{KkXZmJ)Cir6MgEOm5-Lj;9S;9>*d$_oq+2!G9H?r$5v8J25 z_4l6llD}&khc_Ipb+t!3^|v#aIZfSrO|DC=R8cF%E81t6D|yMCZt?$Xhs%|jt}_!( zNBj_0|M>#m=gec#zLlRTpD(%7;jz%N*ZEeSAIZM*%(QNO z^Y7iL_uZo*EVE>>Is88Qp3I)iXYc{cR+i-0cthlS8jKHiJS%Cr`pdmH?}fL<=YP5E z`*^G#9-kc?pE)$w+n4kA)xrDvvG@pNFDq;>9v!?9XuR(6=S_SGM(Q=I#;U>@Qd{NR zByXtu%xW)pIkvgm-alME-WBF}c4p$8_PGc2IQ}1?1YH=5dmA1l94^YqNk5|0bt+I+U?t<-SAn1Ur$c}e#1?df{l z>W{>PIz5BC-VBF`{!I|_8N_Gyt>+E>^?uA4Eu6@j_7rYRwubb zUR{AhnGKg2ksiv<(vfe^;zp0c1Bacr+>tu3iD{VpwEtIy83ywUE}@QzH;{b6w@ZDe zkBmR##czCcm>SpIp&8c66 zYna(Y?>?Kkw%RpkJ~5!JH?Grf48_w{uPmOo@hqlnsA1NkW$@jU-Qdntuq%Gi z^ei~-{$D$_t#ew3MFt0`$vI8f!-`&Hn}+a+m)N0QxZ7rmTQEj7kKJLxQ|#CiYs0Os zMYEya>W^O=kBV@8`*1)>tDLZHiU!PyF zbG`0-$3HN8I`vjK0~0ubVteAOSWvz5g|$&JzfydK5{su6@FJJ=mF`das;&;B=(XXm z@evzVYua5{c%1rRoXdqPeesYon=#{VXCH%I2j*6^XgqfKI|Kup?1O{Bx#x=Z*X%z& zve_}y!-GHG$@+!D=YZ|PW$bd&6A!)jUn>LG{`T_&*ET*qY+g7G16+~s6N}eyFV_C~ zjiDv8_ImV%;SH)OU@rE_(j&S5iD%)D&iY=Pu+nz=I^0G5fX~`=_nXN-ycZ`b@hFIw zQ07E+^|iWkZh+U;X+3?p`{DAZ2NFA-p)%W1`|zZE>vC`o9`kebX;XL?&2T89*--aS zEC++;`=YO&N?we%7vE?eMl)yc*<5x3Z}DA#&tAk2n_1Dn&`7k4pO-!X$Avc`EuH)n z&J}zgZ}u$j51t+BHs>1-$H!0%AJUs;9-i~pjP5=$D)pS76MvVw`cK{1T!(w^Tz}+c z9Pb&uAzbAA)!As3=%Yq&f3B-nknht^)XYsQ{$F;o48RRCcUAjku21{M-$))0wwAeT zI9SW>YWQY&2jg2sGiEoOe76TX+m%OmaH!}dqT3A)ACCV*w3}uI`7XMi13sg7LiiJ$oN zYJ%$T&7@Ngz$E+i2HDq>-Marazm9ivaC{!F7tF&ahqM3C*{q~*gZ+g&n0(5!D>bEi zOG7AU1v?oqJLd=W!hoF=L+@?;Y4zRjJ>I%@`Gd>my1{2NcUgwLHuZ1jF2yfK?!y;> zx25-&``v$MEb~G6-0u%=uoj(Z!N_xW@WaJuwE-`oEA(}E`!po+&gN0l?#Uh`bI9xw z9Q0>$7pB!|(ND{H3-#dOnNO#`P*bQa#?2t@WPj#zhvo(+hDSJE5p8*Pqv3xvaC4jT zbtdB(Qgb%UAkCY2*+jEeYRxXb9}FtIv%+=x*9y<*^E{JyL*_nakH+2l zlbdRsRo@LR06aB5&O9@{M>tJ5s8hje@fw;d{vLI!-T)uK-OoQ zWUsQlxHIu!3x8{uSMNUGx}EU95=-=Pur>eG(`N=HSLH0H#^8+uqtD(hy=Cx}%$Vhq z;1$s<1v|(t;?=y;$LR-B4`lyMr{tBTMzk!m(F~-<3s<1jZx?a8%^c;b5<^P83Xjm= zb^dLBb@bigIzFK}_EfM;xK4KK;^_QKKk|H37lGwZ8o78V|FFx}Pggz&(kCoj7$Q@g7!TjSr5`2kv6;A@c&rBjQH0QAR7=^Fk6~1WZOZLy1SK7lsr*R^Ef&88w zjl+1qm2i5^F5^?AzEERKxUW;G%Q9btBbbxN(<7KcIKtryWe?=LZ~VdXuior!Ut5Ed zbv{F5S9V3trWZ4Jh0DX^qZNv_i_Rq9w^#V)YOD#Ky=OLXxwoR%^SR{bc(Ixdh5s-U zos~Wr|2P^l?`^>Q4hNx6e#*SrS@B*A)~6%%@(#b!MSR!zXy6NoUFNRE_jA~L3@+|GpZD4MxbrHM8^ooF>||RtbBo{2 zu9>twa^Gyr_rcpz=eNY4r5jJKHV>Zqo6*$Q1y?kKwv(j~|7hF;FaQMmHAx-T5nfbeBt=eYLVA_oX*W4$1rofA{$nx`FsfIk(xNdSP9i zgx8!MiCz6(INt6I-9P@pvbp7&yJ4<1&#$U($JGnF@Y~&J4&hkl+1V?l$C${D z#iscYpC_2V-qow{D#A}2l55h>g=5l6KWW$ZnjS#!=9!yU={3Uz$n0-ZEx#@<;O2MZ zZ)(QE|8b_&^ebY-k~$z-kfnTI!F0rr>@l2G^G@@;slpAa*==mMc|CZcoR>LKJPr$| zAJ)14*vbihrjIk%Ko(ve~lhDSU#*?lHGcZ%h zu21^{&a}l}{zPK2nA*Da%=c0|#RDc-ZDz)!sWJ3aqrPkRFuYA1dwLS}Lf%t%mYW&i z*~O;$Ou?Y!y;?ZVzIT{fv+$l%o0%t9)R2SO;S-NZJ48>&qo+Mz-!tC_K48V4g9m^b zNc9B;Cu;{k9GHf=gr`02 zmD;TxK5lZoyyCvg`|3JpEMBm1UAcJxU>wkD<)$DTn=A&PZRz2}FbD&LsH$Nblz8}9qIbC((5%6*OdramBZ{|&YOy1p@eS9)ak=WOfl zg(p`M1I()U@#7WqWepx+mXjUBZ5V+XwK5$)G_TQU3-MmVeVf+PR)U4$4tWmp7JqcL z6%N$v8}EK#asQY9?q&SFnWMuGUD^BP2Ugave`skVJ|pVS@LKIn(~I)X6yM`VxgIY% zc__X?_!gO`!u^Z4PwIfhR{Z6zpZ%Kw|IBXN_{t5-Yt3_7E{rz4_tu5KJ$e0=pTGa+mw$RP^KfUAFLwop zu@W7~viO-jq3Uk??sEU-X}DSipLkgPTKb@10C|pL>Z*Dx`&XCc`<7XG{qToFwSW3v z-|Tzedm>t__{>C)4O5cKc|3;;n7-RNFI-gLQAgdj!CPfpj@iTC4_1=8HQL8ufYG5< z&9DjvBM$m*3kDUf2tHeCqQY^a9ThYAc>Dd~snXnxo1f)A&&cI<`0Mx{EOysC(SJ|w zir0zRJdqptmyLa#VjNHPz*BW`K#lgP_NrHU=A8LF-@3U><>u&5Ms9tn>-FH=n)Mfd zow}T^PZ^7TTFz>i1JYRN&BP=#x$J3nm+Wg71M1@8GVFQvcXLmzdglCZ^xWBuq=TkikRFF*SagE!9nmmzt7RNp_E_@6tjekn6MwTqgx zv6Z-*8FcypH9)km;;PxnIX(Rhj3PW>oFU(7coS;=vFyKu*-WXu)l__4(x1~;?Kl^7 z714s^ye%yAL!mYJ3XSr7sddH6@SZ#PE2}sAzlyieQvbK`p6BCR;WL?WOzsCi@bti3GqG(FG)W@yIjftpAAm{k2U*7vu|)z zUp$KY5q?}|-7vUt1;;n=_O^IanCG{1=fjO!5}R9cY%{&Q+#j7^Vg^q01kFID>|98$ z3*RBq2uv>Gdsp9#=|l%N$)cZpR~8Yc`u&)=a$9ab+as-A-ruq?ZI62Xf3;? z)~JD7 z`eDCkQt%o%s;O?y*@_-6{Zl+2^#J-R~+&tYb=! zI8%`e%sv`ETljkTy58ebu!nNSo_?qHPow{Rz^fO|9-p)kxqmi!MC{7@R-?~_XO^B+ z-9J-2ll1rM3!Gh^VQ`Xmuz7V;IKXh2@cv;DGx6liY$e)O{kS{fy*A~}CAiLNW^U#Q z;oyXqinonB&sSS7kba=M|Jv+C{n3fuf$nK7n)OmcWfo9sVfyqlu<~anSA$Rb`{bR4 z!C<*}{=&Y}Z+`ovy@lD=r7msQS6r#+G3&`AJRUo@zWULXVEMVXxu^1YygpX)iY~}| z)^9d=*QC#C@HakR3n!IEs3yOQ(UtBl)0t=C2+ybI$s94f*X+Fz2hOh0B?MDgDja4$ z{&WOui8Jm*Fp~~Wi@p?Rnsy}~F3xD~>M$Na{M>5UA?;pfP72G9zKVt?93WiaZtqe_ z3=J1s{a(&*E%V=KIbgZNV#ui4uIwB3jGOKZti+D0&wed4#-;ES&r~={r(s07|0lC&!#VEDt{qyT@W#W*?ufBVv=r^sKH>iI z3&D*|4`yf6B|B#AE(y;G=3t)n{8BXGS{>mde{<#}Z4n7_6 z=vWUvE?292;#*cxhhND3+y3V-{OM7=TkRma%U^8|CTBh*_v6Zz=Q~D2@7#(R&iKr_ zo;+AtG@QICuFk4$GA~jO1j8SXRzBEj`rF`pxB?T=cCV|e-7VV6iTv#JQtEBoE-uW=n6-#0zS|onSCmX2l(6nRdb7BTl9M^SlL`*~`i$Ae&dRQMc#3(fc~5*Yy(VbyxYDY-I-_ z9Lny*#ul%md-jkX-x>boJzmATsSP~0U_<5|_OoRd6Ay>vWxN&V`Stj%+1K!<+BADQ zuE0BZViaE8`OU-$XEXgqxTT%MrT775=HJb4F#60E)ALTzn`Q46jh)<4*=HArD(R85RUHQ|+Fz?_$zPtVSkS+m$v>Q~PZx1hd}9PL@A z4hz5EKO5O?v(^1~zg9eyc?ZPPuW~jX)2U(OA7ZBj->`}u^6|&ldpe8!zSX1QQQ@%U zEIKQd|XY9*)MkY#*2M-Gh6lCw&l6h`D^}Pa@{U`3l>!LfSbSl%%2|9 zn;qYL^6Bt=)#lM+7oD7Zyl7^1kq=&c*v7NNXr1Rx3->yH`)04rm2giyn`qfq)mmmt z!IbTip|L5sG`u0&F?Fq+liDb=t%=MR-3Pfoo~3YZ^_9N zyNB6fy>;tLkM7~%?D>Com=$lA;5>Q>d{WvTGltBel4~-@}ofBt|KV|o|;Ca}CaaR2O{HHx%-UDYY^C);dbpQ^^ zjM-je69&2k`%HdWh3CN%v+KSduY&FSbHZQ>*(u}9q<4rOB_3Yp(&kdhUuI0Do(&dT z@X?v2;91=|DKjeEuW$>pPszTgUcKpQJ?cpwRj2;t4W41JQZc*gZo&)jLB@Ess|TZ{ z;Tf><+gCr9`Q1uzz|8hiv%25Y=GSJ{M=g*M5lp4U@%zcDO@JXF}I(7E4T>lJ*g#RtCINNlv z^XfR?gBq)F)G8~@aD~!$q-Ibf*D~L8_SBa&CXI#Y>1)x22Iq7CAH4b6PajPEZ)VjS zo?v$Jc|XJ6TjqP=+eD`i_gC*Oz^mcExWTw&QzJ0K>{6uv&HhF+{P2!aliK;CH*4Q{ zZD5VR{)YMSw%TcrH{WjdkGuPOW&_)>+f8?WGc%fCHi@HRdS-iTYLDF;&pdv7@Uh3T zn`d9F%pJ(tQ;&ul-Plmu%2y5j`^>gp+@AB5+2|vj-4*zqn0RqroP^c4b56XHJMCz; z7ulIk4_xAa|2F%IhJr3CPx<+688y~vZ<&Putz2REwlrEnwY0h{*o;67yL zVg3-kS9D*gz0BxaaJjagFTLQjS4H2YXMp|Kbs}HLA)c?k+Id}utz>U`_&0izX1x5j zqFKRX-IiZd^T-L8!rdr;7YupCISM`&e5m+nsM+i%|3)o1`+I+IdF%Qk7mkiTGRYg| zrF%3}`|#+s;DpXZc3Hun^^bUF?sf3cjnp5WQ+O!xxk&9Ub}s6J#&|897aQi>{{=O{ zOnldZlf-Y%uk+y#Hyf6nSXOipsddaV#X3FVQaEzc{@!Y8U-3D7wo===FT-%pVP~uG zN3x^%_IJN|lK=f_oVuRhUi|*)cu+OIsRwvD6k0g)r?%s(_7{Pkx2AT25;}tPEyWhhB$!sn&=U`Cwv_`v-Jy(tF zN5Uo7zfUb@kA&Q;o`VIdGYXdCy_kWhakAIzJ}z7Gy1n1({^h*HaNip)DqK}v&`$1y zL&qN~y?^QdGxrlS!W++QIzC(RZ>0><0J-ncjEw=Y*xztWUsKU(Jhuv6UCcr(KA!m*Lt#+G^UheN)d`=7n6>VQ2p z?SB4UtlKn$+3@e1_wlayvv=SwnKP{G{r9eoeE8n&=bkvwf2?_C>BZBRy4M%Py~)h$ zf@_&!!Qs!SGb?Y!bIE>W-s}9@{9587&x>z_ug$Xw=ZudMoNw2k4bER;fb$#OvHhuU zM*j&{razLG#p>+!_vm?TDpT)_o z^M4w}*C>14!nexLG*1&}ro5uzRO`(=zb-arFN6FNFCN~G&r~+>bauqWcxz{0MrOEW z_Uj(NJw11|p&BuMay&xpoA|`*#Y-l5aEX17&F$TM^rd*nhy!zb;==mD$9~+p{^UE^ zU)XkcVWH#kjm@6xc<#bN5)1i)#LokcAJvxl1c_wrJHUBU1Aagx)m+p>Tp7uOxW_rE) zaN9@Zry7s2rJG;vkKb5og^oYBAz$q#Kj9PX!>8jVyMuqSoxfA;PM=hAKR)ytoMsu9 zaF+L2(<@rh%yEMIR$(cn|2Crw1~}@T7v7ThpB_^VzF@D#8gwQFkJ3jpvTHZE z!-jezbHL=Uju$_IV7c?D&9bv3egH*(;J#-kbvSObzSm~He?Bi_!MEZyRAz$kR-T4@ z4&mnf;L1F~PMtyh>Ih6>*!MAlqd6Q-8Jr+^OuUSu86Bn%&d$hib&D?0-I!Jn=j^I0 zaKiXKX71u8$HFhOuN}7O+3nfGxep`V^bEtNJcI#c7t5~RYD-+$@*QpkQ%MeV_gCY^ zPp`R|x>v8TFP3lld(^#fw8pu_dh_aW_rK(y%&g^f^MEm4cjK#So%H<92t2EtUtCnr za8v)gXC}L+R@kQ%jNZyTkB2ZEI&sl=8y|Rj*=CJ~Ob(-4;AyD0j&{53iH{eWdzhUT z(bd52)JT4xTBuM*b+F%p&TieD zbHmSyC*2wi{5npESw9|5Jl^cEj*p8w6n#(T2I@uH&jocO&A(cv#JkMbaFNP9AUw0o zH1L?Bi}aGSKlzQ$yN`db{fkG}R^EN|FL0ggP~g3w-hhE*FUpi&g@(#}6~>SmaX1d~ zk>f3DH_DlC(&tM5lwMu!pSi!9KwTV7hJ8MnafE~6PG`@-AaA5WwKhE&oH*Ef16Cpq zz{5x6ooKX%Jm0?bo|!v`zXhMm9_5kb{Oo@(_n)VN=S_Eot9|zK8|FdT`Jy&DV^-jN zWT&Vzpny>Z=aRLw(IAy$SXQfi*e?9ANs;fvGq zm_A4SSNcERQ2GJ=W^`fVr=7u-^V??8|HeIw9~4}4G4oUSes_PB``&inqYcWeB{PNi zWLG`cTAr=*SxFy&A5_)f zKXRaFI;8*K)hljiwx8JWuXE3@c?RL7t@CEhPOfk_c4@aa{LGH$ZWcXZZXsr5-$!&( z@Fm=cQbUQi(VTamgW6kNoEjuOkMDwpj|VcH6@Jx4wZeRv>6Ka+mY7;y%}`G-ZO)wC z;_)@*X>3O!?L>6Z&SvR9^*weLo{fGW&)PguEf|hWe1)d;4oy3w?aB>CrJfzeu?{X5 zoOPHdL`9tjQ^ixj%km7%GfUl{9pvz{Z838l#^-|K;~~2A-bXr}U;L+Ut?38sw`=q3 zxgv(c-1XFY`P2a`o?$$RR>D2hCxs7~xk<3U@Ceq@KZU=S*nq{?qkMDth67Bf{4+;BFVA0Xj!q3!Y zIDD|=wcP*kWwJw1E^6UZ*2BX|{t0fEzMiIs@9-pyDxTKSeiiILe3sd8hV-9ndaHH! zev^(c`Dy#w%f0(@)`6P;Pz>1f&(x_Kumn0Ie6=>c(bTh<2hq0U;lDMXeOTFjGYVsz zHH(~vXJwaq_>>*B=dAC&8f|d;aQR5z*Nk6B{JNUKJ~F?~-N_wL|E<#+@7?+2XL$aN z)3VQm=T>H8FeLi3;tiF4GI(H9T$s*1m$xzlq6ac>^xyE)=shZWu7a`VOh;!HjZ*r2 z{Ym=N!Q>@7kNWfg(Jb}QkoLo9aEkRT`q}V%N<861BhD1xs?3Ds3D^;QJX+#KI2Jvb z*L1WIunWJAx9)qA*S2x@lZKWcx80?ukk{gTf(!LT9zxK6~^^5 z-}X7w2k`%b$;TsYIQvA!#c2HHR`;0qx?Zi8{LjNGSZTi*>VW*iBXqoG21>hY9*`Od zHk*5F(1YoGkltT`b~06%iGPS{=93+HqBe(lQUD-v#Acmw*Z=mEr$iNYZ; zZ^e-g_Hx0@_Hz1AyXo3(y}j?g#NeWN)K~eev>e&%R`gfqTDXxgvOZdw>^kkCQ|Jk2 zQcM`oe}=c69R+&K#qd)G^-v??l%IPx`$1^^)!jG;=`o$Zf>C*9_O?BfXGT|UXZO`9 z_w&BDm$>ZvghkL;HtYnp3o0H5cmZp8LmRg)e0VoHXL##@^LeCaJI<>nQ$ ztYxtvoB;90K3n_K%Pb-u1?Jb{!kW4@e1M$c@W$cz3F2&A#-!J9JR{^1(r#Gwg*9>QXpaVsShPF9zSsY%BOd^kL6>)PVeVgybJjpzH;oP!Zy9|?ww`+Wemc{E;-`O(#Ot|#Pe{yNV z3!Y9J={--o|07~n(bT!iFw;s0zj8xvUF-HW<#WViOwLmm&GCN4u?Rn+%%ZZ7ns18l zreL1(ShNu%d4~Bt!S93jh)4Q&^|;wz?qS}GXUtziJm*jAxv7CJXJ?;Wfu z%bzdzUEg4Kss6}pPM-xEz&#w>)cfN{Hn!CUsi$BF7mJ5w`VX)0{958&TRj4&GW&qp zicOiZx+}CIm+iG)?ws~IW#9R!=;qx0{_xy_P3y&AD$UXVkEXu~?)yB?Jx_14@k$$Q zxZ#E?E`~i5W^$PLAaRVufgK}`5j${f!?K~+a3q8@s1z^-vrq+8>t7KYWDMDaqtHrd zN5OF#c|j60K4B+q_6w(`cxs9pu2?nAJ_&7!l1Rxu%$ZS673cGPpe#^&qX7JWzvsDM zuKT*L%WQSldtMZaXeV#^8PAQq5BGRSPS}*^o1d#Yc$U~_^sEkjy3@v?abu=FG{y#B zF`Y~M7_cR^`_t`gAHWK(%1bx+#@>JZcYpSgecwmoz{5PGtN+V2&S;v^>5FVTqq}&A zn`#O3FTJq*=V#|79bVP^TUC*{AuN7k$08JG24cJDaB` zOp1q{nnnz}9q-M26W{yduJ{>FBVIU@Fobf7T%NA$f;=7%SkH<_X11>;82qAYjluV` z_bTqx)6ek|UC{T(ADq)CkGYFDGU}^)|BwH4?6t4_?FMp8kO8jeab9ivP_WY?^_J6PAWbB92 zhX2X?@vAz&?OhzC%^I%^rnr-qi&!#Z!@Jt9yEw_)YOefhm%W#C>pV-^2r%ZjPJYim z=d3#dhtX%t2fpGf4~@iTdZTYY^c`#;s(tjlUplYpi}Dq{G=WVm=m+d~#V<57;n|>1 zSP5^h&#cyI{{C(bFwcv(g=_Ux&uUV9(VK4!nOR)>5sGryjcvYXC8M14-cUU<-4es8H+vZ;Snw=~2>clnk<11zZH}Aji_i0XV!$daPceqR6mJbQtNqwg8 zQN9w>;IC(&zAj$jKtCIAv;Bwq(>Pb{N$(cp;7;MtgO4dbq!D_h&u^x8AQG7;^;g zxjSD^5|7pVdl3!<%UCy`m$&4W_&R_gom6Y;*sGw?i{3B}J9 zr&sNaieYpP)e!Ljujoz6nYTL=^_QOSL=8Z%<5JpA^TmF7APjn(aqrYlWVK*@CoRj# z%X7_!i>2Q0oZ5B+!+KVR5(C=c`jSM%k>wYct| zujkE!KXJAF3-9K#=T*NjcKzhm{hmb_;s1B(GwnuoVS=fRlNb!qrtT&nJH_lEw| zM87&|uB491f81;i)^q7;cjN3Fp29qjLLT1hvvI)c3(Yjr>as5nvlHvg7RDL&jLx-J zuhz=vsvTJWx?TH7S4n{dOtuyl)u_!*~;J>QZ+NB%)hMGGK<89A;Ee~?HDbHS@kyQUf{}|%~zFX z<Fu1os2S^HhD`yYF`Fe#0mDgPo-%cBcJ8`TY4C_VVmEzhJ-lcgzdE zd>6O)x<26wjCAi?Tj-hfZu@%MNd8+-2l6=zy)NSiiIBy$g+Q~hZUZ71FH8@uUh z;c(}Lx3<4Goh}Q$$)Q&)t+eLK%>vXYOLEod;kv(YeR?bQifClWf$hTge*G*QW1r8t zIFO%tVjOw`Ro}b+?T?DZ?$*F=O)7Rd@S3ZuJ>k03^owW2}(vk{~noFbT;q%vy ztNl;dTRDlhK2^M+1(YTY&S03U^F2{h#zDdfbpGSqid{7Ny>GQ`wSjwR&)}uc4PL)` z|EisxYsJ`ldv(*kS?V==n%B)$Z^HraJoxSDdupZI-ra#Xx)%mk9UKM#$B9dJdGz~q z82%e>jCYrJb2Fy6bj2Ll?ipGc-ZxIVKA_yc7Oq5t<)|}ehP1__lz*Yw56&Xpl4ZQl z=gjiMfrpkXF6rw0z-$j^GVrU5o7GNf?wPslm?MVcltbsuqtfE>Z1g&6fOH)w6V)nm zN0_j?Urc*uPn`+Z<5`)$+9$Ve(WbEb_`B+WE!uQn--jpe+1W|I2JXlAhR415atj_9 zS0K&u%bt&1e`(}rb?&A)Y`tY3KWTmOOtb3l6RZ30^YUc&PSl_@JoHY*4>42hDo&Yc znz6$WuEF+hI-@tbyUtp=gSX78@BHB6Pu=|Iou9mp3wUkp4C(pB_2#qbfHr^jGwkK8 zelgtUntOiW9JCjG$a6D0gk9en&mX3zMl+)|w`}*s=kZ)d{TGj~=M*003m@ft82YZB z`2cos-E88To|irr{E~kP{5c)bS$8-*YBp`x^yOjg=Bnox@J?o`3!H_4t;+v1W-56t zragYlxjlwIMVJ5l3~ut!vw!=m-#v!=a|HMI2^yG3U<0Rc*TP!Uj9&4)(+^j3Txwob z?MD|$UHtSVHL}?T{(<_$zRiVvY1(PHEN@+RuLo`_@9&F|JXvwsc{8g8ZhP)={_p%? z;0Rn#^K7(p}9#Q<%xpmiJlK zU?`jB1?g{Gt{&jwycCY>eVub3^UMsFY#t2{QSZadftzW;igx{^Wd?m*FO37<%1*m-6!D{_Qpn>G@o|Acp}sf_gBBWJo_|V#ijNEZ|H^M zPZZzlS=%w=6}FXL`)%`-bZg?f!yB4CY^ftI3?DuE2YH^(!IIOQo3gVzg*SQ9TnEF9H;6b(YbU6F9@F%rud;V9<`me$On^j%A zf8_%Qum1T5_w57h#wRN0j5ryt2nXm{sXO9kTvxNf8}vjQPwkmw5AJ}RRnEKO&ZtGi zzI?9JbIZS2E!G^a8ql2?dk;RBnW7#Fm#Xg>AI|xQajlzQykLI%d^#K_#n6*5$0_ru z={PCwW|~`RB2WLzH?Pp9#-pM;-8@mOm=%&rjrT-RLV_;>-25 z&c+^|{++i!|B;8)hhu(am$N#Ce%cLu|M-9R&GqZE9>Q7gq$?$6lv8fP>28MK)bsmU z?GB`!v6Hq-yeu`AT!)i)QQ!4aT0``U;k;>}n7=E>Jz`k&sTuRPM9 zQyqRKLV#>N&L&R z0}gUgU$I&(s5j$veb)bDM(RDZXI8%nE94LQ((qJCQ|*+ykQO0*fxz)U#l$m?~%ctjl_`iOBjxQm9lGVj}6)}G*yr(-P9+X>~Rj4&+WZCtu2llK6 z=hd9T-2K9_c4!`c>#vT5x4W-mm0pWy*Qi@)fOm$gRo$7Z`t0=m%pIL^y-WGFK11(A zLjwPlevg(*E~{aJUL))!jhX}b?go7Nz@OiTh3%-x#{9zjwPZf_&I;|0w>K=kM-qU#GgE=CYTyCmp}P~DLx;=&%*p=MoycvitEqE`hctU ze6HE|y@M-#mrwfr2fs5tFc$y*HjMB(+~h!vb@tk!;2ZnmGw$i>9sT~5;U;o7H5B}q?&hs5q zqu3j~_~J=5+;Qh1ucdLW)Ghjpe7we9Ab#p<8cWN3TWPd@_2}CNm(w^srO%)r<+-Ne zmv?V-(BUaHcH8!x;pza|HLd} z_H?Ji&_TuVI)to1t!IN?OJ*OFctLGz! z4J^g`u|FW^zzxg0r~8cfa2q&qTXGNXW<12F<>IG5$D{i!F4Bb&BkJ?V_ec{XozuSb zY~sKD0(I=r3Bp$ux6SM?me(4O|LdGD61)$;Z3dKr7K zG*ZM|HEunm9;2F)HovdtaQV}yp?0R_kluScC*_cEx*2y}%)~3+qAhP1#JfIG%>B{j zzc}*aZ}|G-y`yS|6Y#%7KLRmYP2cXwto{t%?_ATD##LPs1K#bucHonAL}(ht6IBa~ zp?*)hka*A4iTI%FW9AFXs`ulSwlQ}0#N#`9`8)h~)sSc6v0v3YU48hC58n8}@BP&6 z*VlgbE`0TFylPliSm2oHsi%9s+U6{A->jUy?+Yxhne_@gF()>i)y1q-*d!mz3p-{QqN??`*QxD*$gArJ1omr%}rpFFXjIho;p0>?6Xaa zQQrNMyYF23+10%6vOK+-roEnozxbswQ&wZ3o) z=0|G{*X8+-4es^8%zPgA4Ce6ypN6mUbQwDe?v;K=%oGRX9*P)1?Pz(>?^gSV{ity+*5@2PqxL5G37F5#!}3o#bEoP_anGjZ_LC2O|L>dY zofIeM{9bl^%=9KN(UZF{t*4C(+5G=_+B51@^JqIkd8e4=9zK8GAGAQ-aW&?%*KoGY z9mkH;HTw#Dx8r~p1J1N3-F_F}cwA3=hSk*Kpq$0G_|n<5!rQThk-%%!eeDH|eBwU4 z+n3?e*Yp5GGcYZIA71|1y?gt=u>as&AC4Pb4N!kp-e_M`j)Eu3Q|%hL`+NHJtFV^? zI8OEJW$`8MVf(vrw8NLphs_^{9zMNfv0gl0bLaK{XTyuzlNz4M)wF8d=E?1z%{xQ& z|0hPg$NT6xIh!kDS=u+VdcrCF#f;c8=PaGFFL~UZkFRz_?tfArd{q89B@WH1@#p3A zMem4?@TFzX3y0vP&h;Xm^5VGvb`z^{-GAOedi^v^U_j}$j5(zqMV$_Z6RXU)&BdFY z=@(#`r}>Pl<;}G3gb~Rl?d6$ctX@<5-?;bR|KINX@PGK}W`Ni9saJb`;T(3f*6eM= z^H%d1po_J-sE$1s|3`di$Fu#4?dtroXMs!N9J)i^^Xj_yYX|S>bNYPeRZrrarCpVV-@CfYFSoDOzQDY5Uj48l-|FMTl>aW<1ks*Im!&vOJU~)u#MEj}JQ)zN2q3|Fnm8R*kgvu}N5g+=>(MVto41cgPcT z*|+jyoXvYzoZ;zQU5Xd)4yZLfKlg0x-rCdV$)LV9i;Dl-uEjdu>7^Ze&6{S*YKARy zxI>@DQJ0^e=szz_(d0U&KT&VdbKTmVsi*Wc<$29HOP!D9-UkdK?1{JRy1C26bf=Cx zqxs^6ImP3EN5Ng+lHQl6ZW|w^Pj_2PVJ}%Ahcu&jB8Ggy{ZqB2J{4c+0rn0b*p5tv;OS?At#NB-K ziQl?~Q*r0buf6{|KjwpKEjlfm&Mn>iXBX&(&)dt2FK&0_*)?}Q|HgJX_Nu>NtP^** znxL5Np0>*;e{boxFTS)~-RMrmvrf-6K4czj&B@)9v(>$E6Z0{is3-VE(px&z5g5I# zT%Sf)^Ym(va6Mn^&d|j;7sZu0Kyd|@n`4Oy;j#02v?cGV@2_S{8xJN!o3c4~&%K?0 z?|enQ5_YZ56DMKA;zs^|EB>ASDvbf0>GS6EYSrc@ba2$OaK(*h>QVRn-g-iu_$`>) zsyzj@aU5&4y8F7ZEzd9DpQmk+HbMC`O$NQ=g&8}VX}Ax~3$+j**w3utQC0tLyElWo z>F(46#dGV~T=xFbJIPCaXY5q!^Xy!xyVvND?!-+=e|6CuZ$^HCPo2*LqW$P8eoDui z!?^cL?qYN18CbwcHR+)bwwZuuG^0K}hTmtm2bZQCng2Gf)42a?e)UNDBJrT`;^Q5i zjiZ!CE-iu$J4loI&oNu|jH|=KUYFx-_=+2a|f zcDp@a*jstLXMLGR;Ld;k4?lD8+8_V?{*V6n*LTwuQjgIKSg4i^E8-h`dM(`nHNvhP z!rgdb<(l%m=g0&3>4D$Y*WhfxoPia3PGOCWFfE9sY}8__N;UMG#V7jQk{lJw*3id?7LDCWN4`O}d3 zggxB)LLA#>zc^ugwA|x{+;S$vi0|@{xH;z7_>KSdlene0BgIK~zg`PYMN{!FmvL&J zb9T=x`TNE8sKWi=DPv|}&T=bW`pDUInVJiT0ey)9X5y5REUh(0qs4<}as zv)=~0+J}+e{;!|=oSjD6SauxJu{K*h_il~XYe4g5e$CMw{L24mAs^25Nl6(+` z&Nuw@i$2H1JVx)xJ1LxBZJ*{vJJM-EPRCE}e5f}U-hTdjQ*UnnLm2a%f1jRB+_mOb z)9>~NL(fbfHr@wZ!CnHdm(#E{pB)AiH!55rjIv!sJBma9m1o+ep}kyQ3(xU6<$2g} zKCAk$a)SHfbLM?=dRZRdbOwjlczg@<=4X zZF<$` z;|w27b18quf2;SKt={)nzFU+0gQwEvaL1pddv+YAGj^%ypPtNXSFC;V?LYg|_rCd^ zzkHAW>!|t<7O<+%v+odB$n!R9>D*2ZXAJ9CJVSY9^}r5cb$xe#qQ~3CP4E8i(yh3x zuCm{~aScbMKZgt2-go-&6P%UdiSECBHSd}3jk|xA4##ut)!?r_omb2qvw+)j{!KWo z`rm#nytba(x$1ph7E`y=RPO$_t5IDq_lB+Rq$!7&c^!A~rucs&o;++SjIceFG(*F0 z<6Tsv?%r?^QT@jQ(0m#<<&Kyae+*aTCGm?_pPUnCq5j$VwhNz^ z;ClaVPR#@#o`emZ_|ac~{Ukr;Q}*5EecmkTpwkvsZY|Fj78DAir(!~p%&)Ah$o z;Voe;@A7H3#f9(|80mK7=C!m@KI8CHea5vKXsQ^)U?a$ zq?res|2WmYnLE0On?3Xjik;!8y))0f-PU~WMo;G*)4psb32%h?4*uBI%;CHpXTf`H z@6${l$I^Z>d}=%1VcNH9?dCkr0qhKCPA{bX>zRjDo^DTdqGr#Rp`1OuZPl4q{CzQY z*WHgpl!nbFEO6(a4?b}D)xVuxd+;}(UMxSg>q9rlzR#BqHG#kStD`Gv4(Pdizg2{PRD3FP)?(+fny3aV>Dc^gVt?KIDVb4#(MvO9nSli>LF@ z+;pqwH9U*s0s6CHTIb?!y8pDX@wz{A$(%n=xOAWn>n%0cs0q|v`*g2&+BwG|t1lb= z1?ItOV){fp-BF9CyBNQ}-HI!N17n9veV$Ly zHCW7n__`-wHKz{eEvDp^a7!MzWk>eLJ5QY*+O_T0!R8m@Kk6~#Kg{6qES4W&5c0*k zIkBHl|5aYEhD-Zxkx$8@Jg9FUT6{x;+p`S2Q)jhrCzfyM|>##xfsk$k>)Zq*2XE_`4m1ol|L>+oV zY!ff}H`06;Q^JiGyX$bJ>PUS;_!54P9VIz0PSYvp;kYk#c)IQRoer&DJxcinHeest zz2|}RtXz3Ioze1Y^OMmd|J%%4AA^?!TiEz?a}9Wu&ol9JUJT2kR~$ENa#8*9(mc)h z<8Qz4z2j!kr^;QPnLihnxe<0X+x$tNe-f{6*7<6lyeMuC90gCX8LQo8bNTk%d8~;6 z@%i_}`*@GdNiNILH_8Pt_ImbuqM&)_S~cqI8oTS6II(_t%%@=Ws{ee^(5@`cU!mZTD@5FP9gBkBBEC#-E;629|yz2R0ZT1%j2w(UXZo%FBqVywn+Md1L&IJ7W zpu7=&*`BB!(rI^ps(XR|c22ya!6ydcEyQ_opYllV-OR|5^WN#=>)-vvA`C(dP%}4Y zH*0f;;j?)t#~a13q0`ciO8E|+*ZrSX=Qf8)(wRZch)jxY;;l4gcZ+>wRHXhHrnz|h}U%Y274o*Y!!p_J{ z_s+ea8oTo^pI7taMblw?7ju?p@WS(duLi#O^tSlApXLCb#x*hevN$p@XIh%OZ@%*3 zG_Yy!KV$x}x(QE+?;dW?(@foApSM|y&oTCR;QU8neaGUB79-T2)w7<*Brm4pxF$!$ z2AGsN=y^IQ>BPc}n!7lIamnb|h2vkKK^Eq`V=iH?lm6Oz^}y;OH}tt*y`|sTlS2>V zR-EuJ4!(A0v|P4A!)D(5nfEis{+f8~XV@QDHNT@v?_HUz@E_I-<@rY^G>yRgTPNjh zJ1KBx*u7ol@@PHR!$1ACbNN@i`8S_j;Ac1UgYVDJtN-mLEu9OOsWzb@bXl(2ZI(DN zs+X3;>Qy)ptZwkPXg$L`ya#>5h2wOHj?*AH!Anc6me1z;sQ3MDVK>v_blkMKTg|hN zgaOC_@YO9Eh8yO(FXYj4r2B6kbWFaA+mnwT?3sTK9NTPX2SzU6jGjs#nNG`T8V>2@ zy>M0D-oxA3qyex%TU?!-KNgN1-Iwl@TCH8u`c)ogIOyqYq&G|_#>|DT#MtKL7wR*w+nKyc=i^SAAnN+` zBX7_Ls295d*S;~dL$+pa+R?fdPAezTnOfo*afTjPbE>d6UUyrg&O9Zaoy60hDQC*R zW`%NaxtBJ%nrI;`&z-9`4ilp(|M?|-K%6^qf4!P3FHW_q8H4^aOdy=0eC^(!z?(d( z2RLr-T2EK3rX_cQN9xveeu;h0&RBO(U41U>Sss>?;(zHeoJn8d2J-#zbF?Fug zd;RqAp@Yrs$_p^73xiW5&o&qLdBPRKkHrdgfctgg?SpR|ed}+(am3freA&V+#10-; zcCv~`?!K>j!WG~Da(fwrYyF(vD||ucOs?{~s3*jRG%&9`_`?rQ(mCko=cR;$cG4L= z=}en5)pwkqjhmAGA#T|bdVR;`_2D-jzo|29UOiPkGIV>*2XM2>ZSYw9K0A!whZ)YQ zotS4~iqG@J{$@BHt|5(@c>Ak#M(j|@+vWdu$ga!%V=p9*9ZWF&A?KP-MI8Cn?<~*? zn6~>d<#`p0)GF|RFE;1JA)-qpUef1*g}~80-<5~on!SwY(|l$4faV1NfAZYVsJG}0 z%H!(PNp-;R0r~6YxmW-3Qwum5E4V@vHEKG6?Xp&*ra#vGUrrOx^P1%;+PrsQ`lBv& zX7Y!1e_=H1;WQ_4J*Lwq#d(=8pNQqv3B{;6_x`B+{{*ZLcl+WA^S$2pv4_`QIQrK2 zwx2Kuey`c<5jdgVp!<)@3Mcpb9EjhzI`*(kX zZ=bsQAkAlJ`={_qr^Ef!HtO(!`R%x8EAln`3m0qW z(hN@I;G#MUb8y{B?_UkKgBv`sS@F~S$o(H2&UEZ1^^r5~{_zK2`}-&H44!Pp;wwG+ zlkOd@8(vB3qC0Cy94#5Fw5$*^Aj~0o{M~k zW2FY&?ssv=(-E0%?(g>w!^3%Wzx8+eziD^tL|$#MpyOhJc=YT%&b5A$M&q|O=w0V` z98Xd_E4Dm~r}m{!+_uAWOANj4XHE19KHpYnj=q?E>$EZQZu{=?QaYLLa-1{y>iLuY z-83!|@8sv3;ZN1C!l#bQ{m0d(C&R1d`V(;JexDQW|FO<{b7|*SO@$k=YVPq2?8BKz z;|MN{yF;&yc4HV``CmLtf6Sbpw&y45wVpkFRjkSrA$~%7DL0*${rdcO>#2oiqGqGh zG%ZfVj}^z^FwOhqeKo&lJMql%J;a4@myPx9G(aA{@PPw)n>XD;UI1eb4VRs$UI*88yM{SAKE#hkrbE`Sox9!k(U~xnZ-av`58l8UuW=#K}4FWX1Vf@r;`z z&sAsR?oU?>^d3iTU@vjZwCt(5|DBJXQ+%%(v-~5l{U^oQG$)Tf_?vG%iO=<fXS?`Uxt?xM##{9g9!tF6=RwBup_#C#W?H13u==ibnCr;CM$eEGEx{@Im# z@B7xly;Fa5^VOeu@eUr}?R;%{7v8cL+CEqsS+pMdcWdp1K726!+Yiaq1wa)j>;`7q3N^iF~9xpzA6C6yAle617NoS(_-_G<6_xw5@1>XNtd-8i)V1omk zMnn1xctW?*WT78+FHJCK_(oh|?|((Dm##@3G1GGUDf7_Tu%`Gq{yV&(_kVr@2hE#L zJjTi6eX2%iHlP=OdJ@mTyV@;h!ceNAmfl~NM=k`~4pn37e7nhoG!2-;^ z;}ZDZajG^>pYu#7daXTkm2_6ylgDGRKQw9PEC%4Tbq?jPiO;?kHf>kxq`7h<B!R zT(vg+*7v?V_23`Z#Dk5a?Nq6wPMG1vGd*6fiVJYWGdY@%q_Y`s1wZAyKFPjz`vT2a z^!V~jT0R5Ig)6pSm2OLO@VM7}9G+9B(jMob>%0zqQ9a^K@BXG9@P__i&x~_u4fXxa zyH56d*k?PYCpppmms9bvmx`%z|3>{)tx#TsfwiyFd^wNc{O#QTPp$9}SoZh%gDmj@ zI%lTWUR!m+IbY46H{%4t2KRpWr|;hv2lnC)rca@F*!fp=L+?zi9+)a@DQ=jUtmk-s z%#3E?nqpA>Fb-Q<8s_7l+8Coewy!O6`>|McJe_mBE}8d0~*{cgW@>UZzFc53a>8&h9-{NU%;9{%`O zzG|lb2jT8R=MYvv>tU4#$C-4Z;r{&O;)~)5=%2@ajC>7)(TCXGvO`f0A9@$%`}*EE zS-$Y6aPWA)iv?HlGSXnY!-xG2eU`iStL~}&XaK?VCp2-&>+ATDw2jh@uFh(A9~QXm z=Y_ec-{V?b9C~PcQwRP8cWypq<|i)E`xFB2$(MJyqFC4JGqaLjJcl;x>qM@ZXosN9?E(~ur{77zBuj31^(*oM! zWt>j@>A@FU#Gi@>u;9$Cz!T!mwj0p=GcM&7nip4`XI!ehJmtr9q1z$yj68SeaEWft z8L?{hRCVU7|J$Ya_Sy9}&7acGJ^A1tH;()AT%HpXwvPM#((CQ(XgSOMZ(h|bTAz@2 z=cqxti}?5PkMR!mnLcZ~-*#*5tmIL@ZkBxZygkCRduoHBEo}A}uk<=@`CVV_i_k>0 zGfsnFU8GM_Pn~~pDxT|u@9aNe|Kn(yq2*hjXZSBx2Z+Jq99&GjrN0>d#A?j+JSO6D zyH-m){+8YUB|Tx7@NycVVnTD$p39nekeA2`KiuuOf#v^ZgzXH$5AvcHH=mocw-Zha z|6E%3|K@c$YOyd7@9R{vIq?BTW44lBw!Y4vUsSKD9nX(`5~g<|egypgr1(CKFP)$L zlb&@oz!7Kh2|a*!vVO9k>2uJWG=rA!oMC<^tNrXgQ*%#vD4j`s8uO31o#A2hA(wBx z{Yz`S7`Jc8{kMPk(=Xorr~m84yRZKA@7?EtdEdXg|4%>t^1J_TgAd*YKfJYjykzc) z3AcVY_3eE#!}$N(@LMy3Gq8cP?X9c*&kx@xF(y9gzyRV6g+cmrLrY2x(0>0-H60wv zd@ufFHGo<#Z7>|-+w_0$zVW+L_w8igvtMz8pJ+U5nk;%hoGE7}{^Gp6-#%&czI2z< zJ#L3I{9TUQXyzIxWIhgm`m^r7KJ%j423~VMKXOFx%6o>fo}W=yt9{j7bR)}i)m&oj zPdxa$KYY&*|NhV4GY}L{H z5NGv#@W*w$ylVR9)ZqiC%h%=x?qoG8&D?70@~V6`?Vhw#v?iCQvpn#3xuF@Kdv~By03M%e=jQwJ;#xD;{4M?2!`VbyFL7mfYr&_E{NVrfdp~ja z|NXW1y!yYr_!Dnk+c+ksz^XP*yz%|bW4?~O`TdO}Z+~y?q}X_}S|1)=4e+F0qcM-F zAHjhWcnwa6; zYV)z%A7%=xY5!`u`!5bG>fe`n)t`I&+rNGe|1#h3CGTww9&nD2-DUTF>~MsMetz^5+d8+5{- z$KRumY@fxP<;a^aUp?~UZ|@z|TgB~`NAOM69Dcuasp4~)nL6|7(U|d6OOL!t7jf|I zw>~y}H1l14_`xsSgWdCBy+A8&`+Bv093MUr>irjRtheaG{14Z~1^@03@96Vs!aSE} zYuecdxI=qC_~pOZeSPLX4E^cOm>ftyGS8T;yk?ut@Z$^L&D-xZ-q0ER&Ajwr_@DT# zdt&;17!Y6U^>zhrs0nYW@$RJijYDvsM$Ua0;a$5!H^r~3X@}8w-PfZ#uX3mT#4u(2 zyqRWiL$7d^J|e9}cif#y%g|m#Uc0a#|4&+9aZu`u4*h9yoyC#C7q9orA4Y$Ba^QO} z?cmL(A$c(#=8@O__AlP^#?@EeBexw_TUB%WJ?sGBo%HT~xhLiLtrPwVJHyBMOFNhP z2VX~EX|%-iqWJRskG?Bc{K;=E#7~p+@m}4B_K(f==Yu z;^8;`?uj>E{*Uit%kH zS6{pIzJpi4`S17463%(Ac!AY>?xfzsdsU<0S+~DFVjiwp-aJb<31Z!tcbSdrNAeJd zHxCV!a$1_m?L$tv|J8nJr5u0b_rHIvSql!@wAyFE=YV6>-{PLzWfB91e`z}ku=ljG z=`_)~{=}E=^3S@*Pv@Pt7C-d(%};*#oi~5^sYh@B(sTFCU+y%2X`ez(pUyB$mS@}C zPBYo`Uaz$KjR$l?O>i>~usXoJ@4{tV+f8~_E4;7M6sdMoZ{p?BvZ=On|MvVj7@~Qh zuV#ep2jC0c{_(FocmKf$7azYlz4+Mg@etpr*g|vW3lHD=wNKrD>$4xZpI-nz3?A`Q zx6H)TWZ7>YVDK^Fv~sMRuKvgOZ?~aYxqn_(7Yr^BPV*Yxe%Mg^lhg5G{`Fyr@=-um{RAAR^oe_KChm)@?<#b@$D z@O!MsXN{YK1Gh8d|1;xx{+K-Ko~)Y*@D8~02gk#4`6swb&&}eGg)fz-*St5q!s&2g zz53zI$nRC&T!}9O8$V|c%UsMHV#9f&W9N+1u-eEPX`hP^ z6~9N$vBwAF_AJ#f>FTc)=T7KXpMa0Pw;iSMK6fClAx+3<>c90`bo+Q4R==ok4r?5{ zz4621kjN{|kZ)J-r!Rb{E%*Zd$na?zT%a*OHuDkx=8NR;1IL<81S(w2o7;8A{(Xap*;;FDL@xmFm zx5hVHEKG|(zv9dJAHdV>MK0aon`0LLsrzq#9yfDN`E4j;IvpG~9Wyc%p>jL1vU-WBekdHe7cZl8#5P$rcXVd^N+)Ky&Iro2K&hNh{ z|8_qn&fIdk!p@BQAJ?W@Fum_XOc4e)^fbj`c*oKt7@e%gtR3z4@G zUi@#}u#0ggj+A^5x8fj9Kg?ytdIF?WI&n18Ch)0G+Z3QaXN2(Nf}v%ikMl&%2mC%plh zhR!VRwY2$bb&aa$)pg-&W$HmY)Y~UB-U3f1G=>y}qw`(+S zk9|>pm(I5QDwfi%@)_~6^k;a)?j;U*I|gEdJwttBd`)La9`!E80ky#3p>D^MfaiDj zm(4vE^#sfO!Opq+<=Jgq-_6(l?1PiLSASvq)xZDsrB|v_TXg|!)pf}NMTJ0*1hjaH%+&4MvtX-CR)G+L|znt+LXUtZbIUf;Q2gl0) zJL}Kkqnp|GIcP(gYwBg-HyboJ*MH@!;oj5c-W87}un}58MK2h34FqduTC_Sh0H~kb|FzSiwdjI~4U9gFr*mR^8JohD- z+Oo4b!5j2vx7yS2{?=$%(r6HK#i%&jI0Ik4_xdk9{rLYlIsf?1|K-z<|IZU=9-A>d zG-JFShiLQ_dJDb4O>@NV{FQdBV5`jr(nuVAx@S3wr_nBt_oa58dN6qtrmd$!Tt5F&dG}WX>NlH%g@A_{x@HzbiCck!T&AJ;WwJ^*yR_0Y4P%f zf}MM}*W=5>6b{_~!JQviVB7|Ej(Ugoe7v7Yd{W$nuNJf3!*BOJ=1f1K);|gZoGZpw zo9MaKN@fpvq2+`0^1!&~{hsj;=Y5ZPSpTegJnvZ8D^Bmz&t8ph&>fG@BNps=uV%q& z`18JSrsXMnyXHaSM7nwZ@|(Zq>^w)0aA*?B8!uetTav$(Ttpv&=3yKHSXw)ddVD(T zOE0&-+TK@MyJ_CHe--9#FT?Jy8Hidd3@^Mxj2-&S`~qIC?$axz&r?jn*R5`+-{IVC zI%o7g*Ozd^mSBG8%=)(T3~LtH7hGWbwZHh#_G^Fl>nm>^e0JfrgO4o#@NYi6(vE=V zHXm+)Q@EK|x%ggh5e^6!NaF-If!0L*fw%8_`9JJFerkYJW`O@ubIXeROHQE(BecjK!^I-OqkMI4$#~%NG{@q6(|L322>hWu* zzVZmBaLZ1S_Z+Wi6`yyNuIv_niH$hJm(`BxfbGbWJKl}hkHb&v&iyHO`tR}C$BtEFU9Bgtf$oO)9&*rp5`aJ3vygF03OSw z=5EcgPxx!`H~+u-G545cj-O#Jsd#z4r59`gpdF8$EFFv7p&2I6Vdj9ysYtQSK zad$7C)@SP(?30@%HE{Rkh|-JWtTPvHF@*V`O>xOMG> zo?zOafdS!{;e{3kgg0{|pHi{mu2_)9<_)oj zej^`@&K90kciK+y#4JCL3Vz}j4$Se|`8hD>+jF<`f#Em4jt@A2`G0%owGaJ8`$9YR z2;*(hc^w`_?Q9qGVSyKY-+UpSy$#D7eaGEj_~pm{Jo8JB-}=aBAKOEWLqtdDtMLcM zOrqIf^=t25|B)_b-2XkFZ^ztfM=wPKM4v|cv)JnXgag!z%0>7)ux7q8^Kbm__ooIA zNR8(ig%Qm8@@Iw?;K0f8dFSl%#uW@7m~v;Qor}Ke<@LThC(L1v%WEgy?Nc~F&2FaQ zGBfhMeT}6BxKKM83;x?QUf_v#G2Z^OZ~p}C4YQeX|M6vfuYEnjH$S)R-aCtM;#ZcI z{lDo+%M0`luE3i2+96v=Yg%6Cp@OU7vtM;@>%*M&$>?e5G?wFNkuTNTwoAO`F4uR8 zkFdNA8YdU!KH3Mcs5Ny(Gc1}Q8*$9rMa@4T&*m_{IL6cY?~K20?N6yc)0vo6`!6-S z!i`yii#OZI-!c!=;p-Ehu9%>9R?FAN=Ra~0XNNY_N561W4HDLi-*evn1r90iDEW6s zp2f?g^R#aMpZ;+iahlO--wmFho#$rR@-!Ul{9e0<&I#X=ueWm=SLmELm>#-#mp;%% z9Ke^-XUx-JK0d4eE+4d8Pov9Tt$4|+c4MVobG7`~nKI+4raKXrDNO?TSueOsGy17! z{$cjjJ?C($@}Agp=ko#Db;s(ncl8JRyu%LMuXMlC6I*MiEiB;egU|QO7VWh!`upXy zT=0mRM{bt$<0Q*va2&f-{7$Mr>I=lSY5triVX0~O9P>_2x%)G;Ip)3dMbFzAhYz1s zv*0qpIu`tY)n?VhJFu}U%_eD@UB*k;!%aT)IQhNz-{Mt%Q#`m1lepsdNO!;a{C0b3 zo@G9P?VHhZe8H|aPA1-;f3J??>q6hr+|(S&4F8#n`*wqN?GEnZ5ABKrn`r>5QHMvN z9B#%4XHG+gFSoOB`@tt?AOG{*&prOZhkyBT{fD~mZdi1C#CA7^fAPCINOlIoYuh>4 z>MX_crVVCyj-IIdzwHiJcaQz6F{`!P-u;)OaBcXK;>)LH3X`1I>$ZQMcK2-DUmRfd zYJ3;77QEVeM|(YKtju|~?gS3-%NLs04Gx=H|D-yzy1>^Z{edt374cll7w&KMVYuOR z{1fr|=y-3u!r@6Hr$C7!)X=DD_g~k#V`Q#q;_vsIv4TKaM8z38f<7^{l2Gf z*7wl2phxKW=Jzr@SmQ`Ck-wS z%r4v>H}s~jTX8_^8Q*#8JPzrFcFFLm_3^N97(iYTcJTT4!2sLo>He!>^J>vA(Coxj zvE#vK?1ck4CSSuV=}}d0cK^kixI+1qZl?R77hTYc&e5`(r&+KJ$MQSUYP~q>Wqjax z;OR!=WWEBk?OncfsrhLf4QI+bN@D^p3fpaGV6#1FT=YD~_tl(N+?{RvD7$L=%X+sf z=269fd}`uNnE|aXjl94A@f9(5InGe?0=?cu{J$J84<=AQf?r9$369$A-&yK+2=hNR z<{7{D{gd8FT;|2FEirF}4olk4dc$}n;UDyrcyq=Lb-v&BRG6+;CAF}M|ftt3vp=WwDooe;9h6PI|=*7gU4sTcpA^)jJ(EQl0KGqw&wnZ zWv7vv21Qyq-Tiraej1jVcKX2m^zO9zE=}XFpTZkDX>OEPyPp316n;g$@Do4!?h8kn zca6PF&)T0)$MS@_0N3_nSa^CrYs~<9f7NXIjuSksX2j;@fmNM7d0%tp_2fqplf zw%x|`hxv=EMdonHm}U)*kto>b&In~YZ8C4x)C;EZ*S<~nlG5|e%zk89T0zo`J8XoHfBP__V)YY z`1@Vs0bNNqv-~e^?dbp8NxGQ^w4Me(gx3I`pYKigXR8`CA7@|R-f`yE#P)yl(`!#{ z(*4jEE%{ogKl0y~#DqM?mq%|1Gn7-(Xmz%5Z{Vxq0&Qk}qumU#!5K3@i6^_tlTJU< z-kQI*6Wz>WFDy#E6_&UQ54b|pGQIoa0RG^YRy<$5RlC$rjoG0-;auEd_r2YqD{Asx zSQdWp*%dPrbLQqotLDpRyf0i39DdkwK8Por*Qs{ecqXzty|ox7ukxmA3?1B(ZG&7S^E_*}cxab)w* z!9Q+S1a@ma;!g0u!Bt3;(Z8=R9Y5#nlDYvV#cNcJy#QZd;%T!IPFwsJ1LFCp;psDe z=FF{Tk8geam60ohE)wM6!nhtFHbDX zspYq!spD?gpWdROusUD=ET%4o@5|Hq%cOZe{3M$Zs-g0motNYI0@3NDqh@9e^Ly!} zdo^W#I9m*;4}P%!o%e=?J-oJkBz{Y??`i|NcM7IhzZlkcxQB~dYsPGTWKVAA%HVhB zWg+L;=~2hfi&o3?&9y(t%S{~P`}oBj=PHehgZBOP!8hA|YWD%R{Wi>|JqNpPae>ky zQ!ih{4LCnyGjH#;Yw%U^mA4k}Z#8kdT4E(1l#6P@b`U4Ka3&g*FQ-%SLNm#9z|8BO zGpl&68mPLxyWIRkUvzQCEG?edDbFT7t_2uWK5DdS%o{GY53x>Tti7Z&>W%fa^uYOm z-H1n~=i^(5U&KGOJu@5|THEd8(+#bj&xfaQeD5AcXxUb_^4*ZH2j?18}6QG z!PkSgr?39|H93Ly|I3?ZQ)|BR4o=%;Ar6N#BnC~ITP=6*{kJg_wQpR^j~kM=0FG5P zAHCIZigeRA#@X|Z%pmNMct88qE8-2`uFo9ae|rZ$OZaJZXMRI@4^}s~C$Y!VZs=H4 z!=(*SFQ{MYnXmZ!_KDL27@W&^m+*rf^?;p=5r5!3co6j1Z4?tq*-pN5s3 zI8pDc=xtWo(Qm)iT^pJ{gF}eR?ry@gSNY!_)?n`R4f!M;-utxpAK&}@zkB?{&;RUW zo@5VcoTSZtkMGHC|J;n=7HqCQy}Mj(*}3sMv^SPc>7}@}X;btJ-F;{9G|nRJLor7$ z>-Xd(tX5ov8=R{rkoN~?tM}sfs)ox8B;NL|;yb?e4LPr8s>X){wFg%&H?!C8^Lny- z*dTN{TB&$=FdZRXMc_$6`r z>_X36{#|HqIxI~Mi+}#ih&eEE`(A%gZ!o1Mj>}eU>fJi`z322mHu&MR-)^2QkA(g1 zt7(S!shGH*?w4nD`%v?UzXrV`XQS^SPO1awbvmQ)*k{w|7du|I)5DL&ohna=ZQ^!0 zjo-kQeQtUry+^;B7`8Q~C*Xs-9yZ;aTkXORY3v1?edu4}8m1HL{~x}zIQi+D=rz+# zF?Y)&g(i@Ec-4L1=l^-<;Rn`m!Pd>}w{E!8`K&rmdX{xOe}2Gtn8k`>N1A-g@r~>6 zU|(?O^v2A@+7lHvqYUSVRgM99;I`jK5EPl4n z=99hYeQ%3-`C7nmcVUb#g-MFT^cC6%;bkMXZ{{5+rsbDB2ODg^X~ryTW?)%k$5A~g z$9V4hV|VV^r*GqY+`a$w&pp2P@t=GAPajote`4k_f5Lb_k6)er(Bp?6`s~Aab)B=r zUhDk1xU=qZJKAcBOU)wYK-I6tEqEY60{a+=;0uRSp@o!|0@y6n9B?;O8E zOTTjpcdPDKm*+2W!t5Eo{@m0X-~S!EDPKAM=0E)Y(J=RF{IC^w6;}4*IcITGJe}wx zCw8AU>k-vh>G?Ht?fxI!PiJ7a<}9=v)nhzBCb*>hoti=a z<@304&rihx@LXoft7FbY15EtMUtmcs-u&G8m($ayg>C7<4%%a@#uN*#`ujYjhG(jC z2b&%G*DyUiPIJI=YkQOK*>!Pb55H;XbBmeHvYUYpEmwDcsriO{yAWO%N4Oj>FUf&t zt5NL)=n4771i&43;=jJq_jsC5b$b@+DOby=8{I86UYJ#$r! znpWJtnrKh##8<3$+8SE3>C`{`?Z2DX3#+j%go%1S^u1{6zrFUoS^NJZ|BDlAaO`vG z0>xMP(XV`cw|x3;J(312Jks~=UF5+b4y(oTHH?E~Prmwe=+O@@i)Y@S-*Ja&ggli7 z<=6*oJ}3sP>G20w5Jr%O$Yp1KUmd=$2fu7r=!za--*@GuHl1Wv}s6qPrRsxp6yb3WcX*(-nsYsGw%MEesbh~ zT)M|^eC$^r{~sUtrN{R_^3lgW<2`vKpXoihH4Jh&u7NrENgT>kb`Fl0GhjyX*G`3% z=m`#Imi#T;SM|aA(4z5s=0lvX)R?U~hj~?oN4dA^I-b(?vf(GRUFwA%*uK&M<@O%JV^lU#Ln-mX2Z&=;D|9aG1*hcab1&CcHN z_lkSo{)HYQEjIj)^gParBeb{Fii=`s`C-m8ZRS#MFq0P|?B$pq{urH~v?|R4&40`o z+T+&)w;xrk&@jW`yOqMfJrvytvd);aAgfwSPH*y{^T> zP_GYt!s?x3)6m)D7mHKU=k`wMpxO<92f)9#+HY)U*}lmn4*!%MAxu;5cP5@OOQiW< zEG{PdJ<@Hsn*P$m&wl8h8u^ACo$tmC_#Aw1!wh%LZpQ@w<2>%(#E$o*ozTl_Lp<o z?X%KUit8m;E>)*APCSs)?9@67@9z4nrd_$H|DS{j>haSL34_ZIC=a&-n89W9xP3ap z)dArL`Ic|X1vmlEiNPB<n=e)p#yzxumB{rLXxyzlXU{>0Bbe)ZQr_!$58 z9p|V1%=|&`6Am7KW9Q{l_9#x^7oN-u43>3LK7bdk$59VM9%tX@r_=u8v^=4fY&X9B z4%k6^#_4S2qj{(sQa^RWc}b@yZ=dVcxB3qrUp&8Q@ea&&V|QMEVg4~V%;A1GSa#jh z#ES>R(;z)BeK(Dhi&Oe=vFE%#U}Hvn5)00c-8lcPxUkq<4UXFm%n~d&F2~SdbwAxn zzpq{pHaOj9^jU|Fr+$4-?Ku6$+V@Yr@s;nN6kkuN^Jjde@l!u%H?Hq>I*zE{H9TKz zqAB9+EyACh*TW~;D{tq}9&lehUuQFH#aUYO8PCNDt2T6|c41xn?Kt}TcrxugwcB>3 zS*IRn+cToykdDLPP}LLXHH#x*e+oZBzZCAZEOsr(5wp%loUsKM1C0LsO1P(gp6~Z^ z_XelS?}-DTucMD7M(Y1p?FzQz@PeJyRk01`ZNILWoOe2b16Dirne^biGk@bZ(s#b& z_qyhHKkz=&eKRYb!2Y*JUqVO1y>G9Iuhr5;8Xov1pV&!r+Wn_}*t^Ixoo;e9pSxH8 zU%h>G=sob!tPb*gig$ZrMxKxD?+-sseSYt2-tV^Ndsi2n)BD5$SQZOc-0|wXG=aAD zdh`|OS<$oc-_8{i;3nZQv?}ry93BX?2YK75NxR$brd-rcx97-DIJ~U>#Cc3Vpgp_Y zdOEpCTtB@G+uy_s!V6d!nu2ESd$<8t^aI0VNG!WbXCOb3b}!QgPb1hlH50}?GgnDh z#XQ;0&nqv4Ee%XYzcymCvmdYWM7tjH)olGu_(1VhuW}og?@`>oH-GsvkL=St`q2Wu z-xogk$jlrXM4;Gz4wXPp`Fc-e(5f*?|oPm&8{=I z?DO3;*Wz!_m)guxeseD-;hS;W!-UO-VS0I{;5z9$=Jg}_o8=L6JiK0Pluw7JWczhP z_pVvJxB%B*$7Ndz2NbUkwGz$eh8C0j3kRpSW@ishm;Y=!ely*Dxic@+8F&BGn_vEi zQ~Jy5tzvC`77Y1|=h7@xtF4K5dKmwRc{G=9$5 zFVLq|n^qUDsO6URcV@q<*Ko=E`8U-eH@x$G{mR~d+4>b;fb@ECMY~hZ0S@8|X&2*x z>{LSxUr=?xwti*PjJ};L_bdKB{rx;ws%O%4;w_Q32mWdp=q>reSqV!JC(7MzxAviO*d*SDlZ~y6x}BOj|zcb1cGm(;v0}%eRsyoH=#+Gy}_a z4$JM~n{odKXVBeP3!8w&=4Gj0@&2BHvC_{B+ZtRlTvENjF03ydq5ZeF_=wQ0@Gh^I z30^iEydoa#SMz$`J925Wzh$vqk0_Vnk-)EJ?NsrvGiz=(OXDGYHhe3L8c!iVkCWko zKI>9AmN<5$-pdZ(;~&0%{_(x{eflw7j>q=;9{%Xp7w*y3dFQpI_l>(R2E4;>?-Bg} zw)$gFY;*V1L5YKGHxA!WjH&mVg8vO)#yo*W?*{*@=JcHQ%G2)7jG9{=j>ow5RI|}M znDBJ$8_@$%=e4hGpFmwW_odtToOX=X?%Ex=gZp2tdjL0s4a$dhzs7t>T_|@nhKNzJy;zi7XV4)R~er{5}fHS3B8A-^PK%TxX1L5p8sy%r&G8iGY@|I?`Oi8!jqk2Tvk2ed2>8m zy6V(%|9E(*Ip^$ToPt5tm*gcrFFxqUJP+8`JMH7}=+&2p$%k{w9eE7U3!vxw1(C6 zlh<4IVf&Bu#LKXgHF>}DKBtdbboQIuyXRuK`MY{NuGcPZw|q<&C!PGWu-&smTXSgT ziS6>V9fUZ8c5u~kdGNrCdAgi=s$C-3<1a%!zJ^aqW8DlK*e2$L;*#3sq+|^PS*r=FQ4K zSPYo;x%4KmYntlu&)oMs*28yq=5Acp|6f+~ zk9bgT02^G1^MOmD?hk*l3(6Z2pE6wqJ5(??UVmx2^GSolo=N)BkY#*B;;hz-J!6`Tj4r({~SsId=VC{oKEQtOj_;?{$~Q(akskunY4? z+Q=^sosqm^hJQmk1M+U3q5~`U9GAl5@i)@&OfzUZ%&{5KmJ2!FjXTku}y|S;84w9Pb%%T24^+>u~@u~TQ`GOn5yYTJA)OrTHxLoeyV4JvQ`4#n3c= z^&G|1XSN^lHIvIcGx-({uit3CkT$00ein9mxW7~VE&ng^`n5au8S&t`>4(?WW^qR6 z@krY<-_cv{!o>FF+3><$@oz=_MKkUj$HjoO2J<)>dv9u7`S4Ph#4;>k(R`yB*;0M8 zT;-ng`*vrYd-XW|$GJbaT(0!r>7%I0!{g4=RhYo$(oMmiQ|IG)E%DhobIUC3=6|Kv zr-y9TPutmCbKSgbbTbSuZ)>M1%xd_dg) z103P)I0Am=p4c;VDc=6npKW@VE8=>40ysmb>5TFRh5@LBR^%6R9W##bXFJ%%v4IV2 z@kP~lIK%n1A{VZeN1@y*>ozr)!DGnCO=$7kYE+^*wE|Gk~N ze!uo^hpty#p0pFf`qI&O^Xkh_#qP^Uw0{wOc9Y3KD)X(Oz{CE+*X^fksQhq~7M zDcXH}>qCEd`N8ZfJ8=ztw%vTo;DpO>f8n4V_00z#{6jvKLyz7w*gEI#FT#M*i4OCG zMW|tLe&oC6m}!ogbB4F#GrZd~ixYzn46DqG!e>|)-!}TpH~-6T&E3YazZ2G7Z{ywU zq^acnE0{9v^dB?O#tDC!5Cdgg)?cTo&A<>W}yza#&twtGhdT zs~hV3dv8vEkq+1IJbL|Sf7ktAdFQPUEk4Gvd(?l|gB^&^w_t&H>FC~7yWCMv-F~$8 ztG8e)*Yuy^Zq4q@(CJ5Avae2;NIlInrRSXI3!L`!BtFhLvBzB+J8nzvfBHJ=g0pl2 z_=t#&<$Zm1I4SKhGmSVa8|_!F_s_#?yrG?qi_Dh_7Pw2ee)l__N180i`RbtEA8UbwsxoLDV)o(L;U0Azg~9#SMbc@nWop! z9D7^sWp|C9p_y$lQ17{-=giaH+%lcyvv{hXz3c0qvvDoH3!X|dhPi4RHSD~2qz~De zlk4gCJ{#xUEbh5>%g?Fxw_$4bTRwT6U*erNzx@8Ycw4=@8)hf_a!=ghX7*F@b^J3d zw7DW~5|4>6Sv}%nJOICIzxN6}Ag!a_fyeWJ@P7Bi<)Kw3r%bvdJfG;de7#y-ZLr=h zZX7uNBTLts6Tk7RA4{j<5#6_Yv?6Z9`po#Y)c4ExXf-@4cf0>Lod-Lgd|;mD8?pLI zdYvPB4n347{w&>q)ii0ZhB?9)w&nXV^Al$_dA2XV{n@`*5d+rLI_G};(Xa3L z>(IW`=Pt;3=|;2{=KVF_Gi!L}^uEtOv}ti1_*cna@N(yO_#O?e5Pp*WE+&oi&cLeoc(HTt-JV^B zC8SBY?M|5!$AL*Z_w*Im>;2b${&SCC{h4PTzcKaYcW^K6Km5S@eX;pYzpHwro@U>B zNJICQ7=BAFavK)V*NuArk*D*g$}ca!8W>y8q8Yj8T>kF<_cPl=T{eqrFP`?pg>bhy zaiQEFFA6_(a=6Q7A3Z+`UQUmfbE(o54XJb&_EU*3r0WWHj5-R{0;t}Z{FKYM+8b@Ng2_!;Px_@}3z!$y!R^i)(mUH}U|(mAunFcW0_+DfcXU9t%C6Fi?1vK5=5#{KB~Z z;mHFZ*%D`9HG2Q$u)fZ$JQYTl|6n@fdKkIREWl^r_wv<)H{bvJ^j|Nf1xKf0?WX?z zrZ{v1j(qRU&;0V(7svN$)}QBQd!h8Ap1c3nhraO8JeeLRjrT1xGT$4%=efK*X^+Gm zwe!zM0+)av%bMr0RxD~R^k3$F>$ZEJr^EgFf3-hN_YHWU9!2fE)tn&<=s;6(Zv#dY5tX64{vEC;uXHVmGZd7|>Lh559`tAAZE!K~9|5BGuOoMYxU=H$xWEl z74_maTygX;YCyRjzH81FR@_c@{Z94!sAa_l&nCat{HxQRi|?vOBt%1Jf~UR?oEyLo-Joa!S2V%W!hi zGmBro0B@Lse>7WLmYWyMvj)Elw}a-5y@WKB;$`F)QNOD14+Dht=d0AdSGpZX?c*KM zH{c2E`2MSE9@y*f_NlL|Z?`w({)-FkR~_=^oRextIb_B8IVZRHS?g)+=)vrv>T%?x zc5?Wio!__beCxr7KmEuI=J8v<^yT~R6fe|2nZUain^)OK8Z(CQ9RHuVrC*5KKcUO` zJf6t9Jq;c=)%q~wcq4m#(Vp7ZL+&=mR14ugUKqMW^-J!59^2lvkZ+HIbC%=A=*DH<3jdtfciQuIU$6MSgVPUVfQ!RDo`#RY8Pw=-zDqmhV{vpl z%)$4*QLJ>g?#TIf)&7svue@dX$Q;fM^;>W?dPlue=TidKy*rH1XEMv3quYm*!f<(Qu2w!SeI-q}z+5;NJIFxf8d6*MQ%d2Kzdm$_uCT zt7CTEJ|G{Vm4|=z=@s*Vv=rz{UU2`{=s_*F!{VLcnOq!NUTM4#O+F8oVNT{(tDW=sLcBaiO_l$Q zdA>ZV#&ZAhw3}Uv3+uZJ_4?!P)5RHoMonf0z1J5$q~~sT$KI8^*8X=IgcBIUF3!W~ z8QfvHX+lqOeVUHk(2sQ2PdT&cYSnwRw+jd0T?dCy!-hw|KdR}^rq8ihO%9t%?_e>k zrg@#8S#RrH4{ppsy=3pFc;J2Zv*RkzuDFzrXB__%{j74QekF~jH9b6Dah_lJI(bCl zGI$@wBQqj6ZkqAtNIq})jNA2+tqyIsbB2t9r!X2dJby?U zj{G8g4*bQJXb`~Rz`=+hnPK?~Mz3G)KgRy6jF}X$C2u@2L&0rt_tyj)NRG!n;jhZ_BQ}eOp`$ z@wVS_&&()I6eT+*lJks&E4p0#I9!}+Om>Xu0y9GF|P%adkQwBol;h;ew`j5wO0go<;R|IZbXd#|yhx&u-Z5<=H`-ZW=CNo@Lg4=$E;yMjSY!exrTi!`jwP zfqEf6b$T@MhvE^9+R>kZXAVw&I9~WF{t`VVJ0Unda6=d{jMwvOPUpP67~i}ZK%5bI za$@i11v*CC^ij9?A#C1!@bjB@-+2EQAJH*;^zZ{;u7V{hLHVpi3xVPSX=;Or^F#p>N3&bs7QX|5PpXVKOf!E7woDsYv zGfz9Cuz>W+)L?W_+F`uN3-~3U3)cYlTAoy^(P4Y~o4do``IEeyc&f^KH}OU8m?7VX z>oq&V=ij>d@Pl8wo-PZF`QdBtTN;`zVE}TY-hYc1^m@9{cfJ35{B7rBdvH&FQzP^K#r_MefUM^3KTpM0ckBw7c-yv@Ry?9)5ca9zotckv>cNj-- zGv0lD%is?VJxzDNnOytx^k2#m?)O4CgWPVXWbBnK;S0~H0cM@mfsv}m!fiH--_0fm zPvxVZH>X~|*~#gcX0v-9!PKEsSE8OmHW*1<&m&_x_&<6;AFrK($#4G)GpF;yYO%P z!x!h^n`ZO;3C!8*>)-y~)=Bthcn5A%y3qVjHntXFIt$_G@>cx?j)ms~RJn3iC$E5KiZVi8FIb2`k>wcyhQuun8C+JzaT=9_rV-vovka+;;D2q;KAT?bOD@!@vIS zBN&YH^E~gPm*fO{K0Ln6sOOx$1v*J9&8CLG`bRG7A=m4%Z?!w8mux@s&ZE!$=IwAN zbrqeS)$RDvIOTCldGM|4pW^Fo&?;KBi+C0ub0)8k1$B#hsl74!#&k$~W@fr+nAk`B z%$`_pzCQRHCR9LA~eDb=n{9qFH_QlCHwO)Kb^^!S)T-%PIm}S1Ws@_$Do8hVX>_w`3 z+Ed}{6nf)0N*hiIrKAc23ai9d(`XP_4nS%2LGEc-|>0z zo6qidkL8`_QR2{9eavUnP4o%kaC=WayPVNnVvCP8&yci|^5M!i9+##6Up?T@&~%yj ztoTem^KP6{=SzKCO}Y`cJnRau<4c=w{^9iQn_qkXUYa7s32|ZV;h)cMKG^^G8jN^> z)>u8nrZ}-PG(NU|C0v(x?6+3Ly?!3t)hyF97n63KZO`@ec5@x^U?;5G4!haImfV5E z#<#ZFPxoVBf0I6wTu2+FyeekX_Id%=VKUC9cV2Ez`vu1yC-35=6L!aFZSml-m)vag z{{OPVJLC7Bc<}dMdqNyIK6XvgK}+ivmsY(Y-{N!O8#yC!4Xcle^K$=~^T4)nq4fzk z0QC&G_;|gzxB7y163e5`F^%}8YP5PUbIT1naJ*!kA-o;=DesGXxN-2@%Q4$*Ugvz) z3;SodXWlvLOPH-Qy1pj%^*+~{-#XJU=E*@?W^#UGFkVMQ3thEsi)WbGE%l?=$Sk?!#JhBp65dB`uHPAx}?&7tFgn$t88;0Uz}^ zHT)9c@;r9^j?Mk{s^RTq-+%Dw57T4#%`{o>;%V7^JM??M9I39whFyI&3lhN43}~p73-2TU_Y&RO73T**$En+TRYdT5RrF8n@3i4VfW%c0e|JZLU1?WoK1vul>Jqpv=vE^n7cj=(cgw~U&X-jurp8(teY7%;zo)ZA=&&kH?*~F^}nKj=cK++&uQ$|Ni_F z)vV@gd6Z1|Y~r-(a|S=}U(@XI-e3&of$cIoALqOK{H^HqkMm-eHXgfLu=s$NDYn&9 zK7*HKHruY2bKS1o$h+ccobaXcM|s0@Pbc0vRgZ}^^??o=(;-m1@{RbcZ))jH!sycd) zKk}6~Km5wR+4Hsg?|bp)KmX*;?H~M9{wiM)1BxBb^GjM)GslUZz*XRay}N3Vc!Kl* z)oSfoz)Q?EzO$|lc!8eiSMUVCF!mse#lFHcy^}blbTRcYbVP2vwsGnn%qY(XGn)va^; z>JBuxr8*aNgA!Z*P#kdITZU7*zxD1gP$mA7_WtkpeLmK+)_VM%?02tinlbIcH1_0J zyIgBLyyD^7+O?e8T8x}XFHruC`L5nSv(c6ps+oiyZy@s{xPY@CEm(A%;zr_aa7+DY za-uxI6R;AEO|(gB`C97d;0gML%i#)5_&og@t~Jb40vFFbG<%EHx8EMZd+Z5E6nDKV z`N(jxUR@q;N@_MWcQg@W@$g*qxo!UEq_amy7%VUzF=qE`;?H`tGtmvxNw10%Ydi>6 zco1fXS=IL`d!^m~VCJ5?I72^D?tbR}(|QyhZtiTfeEMg#vwAZarq9pwOhRy`A*dv>?-AT@uI`#WL!C(7M_?z!wCJRWY2d57I_GxkJO;~|OLG-l3L z%kK2-+wQyl<`;VCb&D@<<|1nQV_wrqe+#f)!hbRXm4+`7k!uesaNSoVlDnK7t)8qve5nbpd2XZj#@gG|IiC7*YAIBA-uW-Hd)cvcz2nRFsm!dYD+*uUy^GITFlMvf_}ZC& zW$q2Hb=I7pvI~&j>|*Dg*S==IK&|uED~}A^`CcC!U=)TaCTAX6bV+#7V}nh8n%SMU z=RB=>Uur}gz}ET4RTx`#=GVQyJ-#ga;qjz5*T*lbg*Vj1(e$r*Ev>oOW23yhyuM*r z{<#-3H*BWvQUAd5>gCVG1s>G$4?I$C@$9p&g#Sl$b9BES^j{4**z43YPrLIx=;S45 zRQ)!cv!+(XQ%t_cQJllSDz$)r8~yVVY%ZFqMSbdw``wRU(M6}x1@ng$<;>uF;z&4` zoyjXWWzn=|XL~n{stT`#+h%4IFI#wnz6GZ)T)*N)pf>04kvgz35e_^}Vbyb)^Ip9s z7}KRXzDhLVW_#J2VAkY}iF0aAJ|#If=|u}hF*&J^Rp;n4-I?tBEdD9_eK8)#&+HxE zt%s}WL3zmFjl&%_@W*!48FsW5P1LggU&G_uh&O~D(Y$3ido#Dqi8pck7U2QoEqu5h z&$+_k4Thh)o98PQ1)GF%+i`HkYbpD!>F?5u*uxDUl7B{5;UV+-WBpv}=4i9@acT** zdHkJ=2afY4x0uc8ZD53DFA4tOF?Tk;mq*`Q{?>7Pn|AjYo)^El%s9`-KZBOA+I{P- zr+fB(Hi+kbzF>lOOC8~}6HbmEp&Gqmm!H)sM)u+Jm6|0zh?z6LD_-UNB;{LYu9i8? znmI;dwfc~Ei1{`R!i>6cqU;SnO zy89pPoE}pg4%XG`OZqa8{m+HxI?Y>q@Pmi+fn{HnvsirON?fn&AEt-r%@Wsd)jK!g z$OSXbeM~*-tUIT;yOrT}bG@DYFZ@k*D)MA9tIy01Ut6Dzvnd8;#yW@#%g+ZUU+@$0 zc7bOzU%q zf5y4Yd7Xn>(>cPl9>2Kw-Xq@)k01Vo*8+10_srdz&;w;>UhzV_^SR{#y;h&OYP4*9 z>22wm`L^i^rp=3LbddHW`214$c*fJ2afj#Pzwu1XeRXf?)#XBZBQRyy=pw@_uRpTk*=%RdM31!t7g?wHyOx2Wwj5?!Te%SooHvF^GRn~i{4zm ztY-&swA!gza?VDgWue;*=dMS6ScxxuaA?2ZF9#GJVYGtcp!s0&6M^jxCige^yT%uF z5l*@yAFlC9FJ3&J&qny5nWHBMs+-{H!%MV`;ejMJY}kotS8{DH{Fz%1d`<2D^<_2x ziu}L4_o0P#cOGZ^%h{(aw|;$rkKG)u`jWr5Dt?&1&#Xk7uGYz}(!7`ST$xwQI8)9k zEOxs1!^dOazTd(l9@zikXY&Ogd?vUHkH2`ynU~EDHt9ar@rSpfM~4MA-7!78*;#f( zCdaCE<^N56&L+J|`26Mm7vC~imop#-xU)DeVo>}%t|s!_+H{m{O9}mPeucsvzi^`nI)GUyy9IoxdApiuU->FE-uOs zt!FF$%Pl_7_*4~tmEcIhA&VvwuOdD{@fZ>-rf1}oe%kQtT+PfH{xVc{1gh!B)iO=9 zn|w~*ul~(UIelhogY+{cCb*BDzt1sRQs0+XTj7qw)5YJl>}sMR*yr1Ik6$)_+|l*I zhk|?Jh^(3cuB-dEZ$I6&#nWR;{kB$SoEKl>MW0#XP@kMIqQ|xuW6;lvFZ(R-$8chT zosA_X4|%;+I^^s*N}n>X?pXLk_+?(RINtC6bi(uE8^;%B%1r+9$&x#tTR5SvFMHo$ zE$z|J-TBV<4*NQ0?_+kA9#dy$#|^*hso?*1;7poXosTz1pShqu;w+z1{HXj_t&&)R z-xrUO?3qem7;FLVH#mg*FlP=H@3qu0;jB16&Qv(c_+jbw)xGJZ%Ki82;7-vD7eCwN z1F>w#86EJR`uKcyrdRx54SKiepYe)(*8ED$+{VrE62Y*^d`at8=lg z?+c$2ww;<0hc24&^i1^XKDWdGSk&3V0go3(bZ6P80tcLTrx$_)zy(&_^%c0lV)96I zaPk{IdYx8fY7tjxULLE$u3LRec7U2|%fHDT_~7Om7wtHtjnISfOriPF>xV~t>&=0l zn{PkU?HTu&A0@WZ|2?{3XX;ioY0>FB4|DMqNNo$JTX0t6Ij|Q0k&T~?zq4;j;k&CY)jCCOMm&{y!Ui#yFZs{}S z#Bk2|umq#ej4w4#;coD+O6{AvUXQzk2eIb=`P1_a8@p6^d*K5l9=I<}m|wKL+282> z1b@6V0Nd-i_4Hdk{IU9?fAIIzgXiq8IhWmYxXn}9WdpmPZNLVr(I$)MnIi=6h-Qgj z^;obuSo|!{i*H103MU?no&+8{JAi{8f1#7%p~rVuuF8JhM$W0)ao!z*AB8)Q7w6}T z8P$A0XE%J<)C1~-M*JiOd~O5k@nHXAs@W`Ewfny<|LDbeIZu8MbBgP zclD2M?mzRP4WDbN>BP>aoKWyhIe}(&xB@dA=S9$H%^`SI!6wxoG!vE70>0qeb7S!T zr!q&#UegJ^;Y?~Z_b$4C?&wMJBePdhA6~qoJG|d^d)=}VGczc6d#c@zxa0Wv$6ze& z&Sg8ix6{9Er%!7aH?k8_PEQQsa}xjg=lkQER6Ni#-%kz>UhR2jwyMXlckS|NcRDy= zE&EIh2P%F`nX9&Pi8I9OI5;od&htx*jb^Fr`x?qQ6rZyLu1EhL-f(Z?LG*V zhAnnyzgX^gZ+b8By+v zJ}=HTZ@v<y

5=oc2ne{-j%I1pSA#|$qc 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 Cxy8Z& literal 0 HcmV?d00001 From ff2bbc9fc5c36f0418d1b28fea6f561e56f9f9d4 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 18 Jan 2012 22:42:07 -0500 Subject: [PATCH 002/586] Transparent water --- apps/openmw/engine.cpp | 6 + apps/openmw/mwrender/renderingmanager.cpp | 4 + apps/openmw/mwrender/renderingmanager.hpp | 3 + apps/openmw/mwrender/water.cpp | 24 +- apps/openmw/mwworld/world.cpp | 1 + files/water/Examples-Water.material | 321 ++++++++++++++++++++++ files/water/Water01.jpg | Bin 0 -> 295326 bytes files/water/water1.cg | 39 +++ 8 files changed, 380 insertions(+), 18 deletions(-) create mode 100644 files/water/Examples-Water.material create mode 100644 files/water/Water01.jpg create mode 100644 files/water/water1.cg diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index acff9c8be..36d801326 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -310,7 +310,13 @@ void OMW::Engine::go() // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. + std::cout << "Before the water\n"; + + std::cout << "After the water" << mResDir << "\n"; + //addResourcesDirectory(mResDir); + addResourcesDirectory(mResDir / "mygui"); + addResourcesDirectory(mResDir / "water"); // Create the window mOgre->createWindow("OpenMW"); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index fffa6f3d6..54c1b55ef 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -57,6 +57,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const cameraPitchNode->attachObject(rend.getCamera()); mPlayer = new MWRender::Player (rend.getCamera(), playerNode); + mWater = new MWRender::Water(rend.getCamera()); //std::cout << "Three"; } @@ -220,6 +221,9 @@ void RenderingManager::toggleLight() setAmbientMode(); } +void RenderingManager::checkUnderwater(){ + mWater->checkUnderwater(); +} diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index e4dc5deb4..7130bdc2b 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -24,6 +24,7 @@ #include "creatures.hpp" #include "objects.hpp" #include "player.hpp" +#include "water.hpp" namespace Ogre { @@ -69,6 +70,7 @@ class RenderingManager: private RenderingInterface { void moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position); void scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale); void rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation); + void checkUnderwater(); /// \param store Cell the object was in previously (\a ptr has already been updated to the new cell). void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); @@ -100,6 +102,7 @@ class RenderingManager: private RenderingInterface { Ogre::Camera* camera; MWRender::Npcs npcs; MWRender::Creatures creatures; + MWRender::Water *mWater; MWRender::Objects objects; // 0 normal, 1 more bright, 2 max diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index acfda488b..2e4882b63 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -2,7 +2,7 @@ namespace MWRender { Water::Water (Ogre::Camera *camera) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { - + std::cout << "1\n"; try { Ogre::CompositorManager::getSingleton().addCompositor(mViewport, "Water", -1); Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); @@ -11,26 +11,14 @@ namespace MWRender { mIsUnderwater = false; mCamera->addListener(this); - - - for (unsigned int i = 0; i < 2; i++) { - Ogre::TexturePtr tex = Ogre::TextureManager::getSingleton().createManual(i == 0 ? "refraction" : "reflection", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 512, 512, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET); - - Ogre::RenderTarget* rtt = tex->getBuffer()->getRenderTarget(); - rtt->addViewport(mCamera)->setOverlaysEnabled(false); - rtt->addListener(this); - - if (i == 0) mRefractionTarget = rtt; - else mReflectionTarget = rtt; - } mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, 0); - Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 7000, 7000, 10, 10, true, 1, 3, 5, Ogre::Vector3::UNIT_Z); - + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 7000, 7000, 1, 1, true, 1, 3,5, Ogre::Vector3::UNIT_Z); mWater = mSceneManager->createEntity("Water", "water"); - mWater->setMaterialName("Water/ReflectionRefraction"); + mWater->setMaterialName("Examples/Water0"); + mWaterNode = mSceneManager->getRootSceneNode()->createChildSceneNode(); mWaterNode->attachObject(mWater); @@ -39,8 +27,8 @@ namespace MWRender { Water::~Water() { Ogre::MeshManager::getSingleton().remove("water"); - Ogre::TextureManager::getSingleton().remove("refraction"); - Ogre::TextureManager::getSingleton().remove("reflection"); + //Ogre::TextureManager::getSingleton().remove("refraction"); + //Ogre::TextureManager::getSingleton().remove("reflection"); Ogre::CompositorManager::getSingleton().removeCompositorChain(mViewport); } diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 93cf19aef..b32f0203f 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -525,6 +525,7 @@ namespace MWWorld if (ptr==mPlayer->getPlayer()) { + mRendering.checkUnderwater(); Ptr::CellStore *currentCell = mWorldScene->getCurrentCell(); if (currentCell) { diff --git a/files/water/Examples-Water.material b/files/water/Examples-Water.material new file mode 100644 index 000000000..285cb22ce --- /dev/null +++ b/files/water/Examples-Water.material @@ -0,0 +1,321 @@ +vertex_program Water/Test cg +{ + source water1.cg + entry_point main + profiles vs_1_1 arbvp1 + +} +vertex_program Water/GlassVP cg +{ + source GlassVP.cg + entry_point glass_vp + profiles vs_1_1 arbvp1 + + default_params + { + param_named_auto worldViewProj worldviewproj_matrix + } +} + + +fragment_program Water/GlassFP cg +{ + source GlassFP.cg + entry_point main_ps + profiles ps_2_0 arbfp1 +} + +material Water/Compositor +{ + technique + { + pass + { + depth_check off + + vertex_program_ref Water/GlassVP + { + param_named_auto timeVal time 0.25 + param_named scale float 0.1 + } + + fragment_program_ref Water/GlassFP + { + param_named tintColour float4 0 0.35 0.35 1 + } + + texture_unit RT + { + tex_coord_set 0 + tex_address_mode clamp + filtering linear linear linear + } + + texture_unit + { + texture WaterNormal1.tga 2d + tex_coord_set 1 + //tex_address_mode clamp + filtering linear linear linear + } + texture_unit + { + texture caustic_0.png 2d + tex_coord_set 2 + //tex_address_mode clamp + filtering linear linear linear + } + } + } +} +vertex_program Water/RefractReflectVP cg +{ + source Example_Fresnel.cg + entry_point main_vp + profiles vs_1_1 arbvp1 +} +vertex_program Water/RefractReflectVPold cg +{ + source Example_Fresnel.cg + entry_point main_vp_old + profiles vs_1_1 arbvp1 +} + +fragment_program Water/RefractReflectFP cg +{ + source Example_Fresnel.cg + entry_point main_fp + // sorry, ps_1_1 and fp20 can't do this + profiles ps_2_0 arbfp1 +} + +fragment_program Water/RefractReflectPS asm +{ + source Example_FresnelPS.asm + // sorry, only for ps_1_4 :) + syntax ps_1_4 + +} +material Examples/Water0 +{ + + technique + { + pass + { + // + + + vertex_program_ref Water/RefractReflectVP + { + param_named_auto worldViewProjMatrix worldviewproj_matrix + param_named_auto eyePosition camera_position_object_space + param_named_auto timeVal time 0.15 + param_named scroll float 1 + param_named scale float 1 + param_named noise float 1 + // scroll and noisePos will need updating per frame + } + fragment_program_ref Water/RefractReflectFP + { + param_named fresnelBias float -0.1 + param_named fresnelScale float 0.8 + param_named fresnelPower float 20 + param_named tintColour float4 1 1 1 1 + param_named noiseScale float 0.05 + } + // Water + scene_blend alpha_blend + texture_unit + { + + // Water texture + texture Water02.jpg + // min / mag filtering, no mip + filtering linear linear none + colour_op_ex source1 src_manual src_current 0 1 0 + alpha_op_ex source1 src_manual src_current 0.1 + + } + // Noise + texture_unit + { + colour_op_ex source1 src_manual src_current 0 1 0 + alpha_op_ex source1 src_manual src_current 0.1 + // Perlin noise volume + texture waves2.dds + // min / mag filtering, no mip + filtering linear linear none + } + + + } + + + } + +} +material Examples/Water1 +{ + technique + { + pass + { + scene_blend colour_blend + depth_write off + + texture_unit + { + texture BeachStones.jpg + scale 0.25 0.25 + } + + texture_unit + { + texture Water01.jpg + env_map spherical + scroll_anim 0.01 0.01 + } + } + } +} +material Examples/Water2 +{ + technique + { + pass + { + scene_blend colour_blend + depth_write off + + texture_unit + { + texture Water01.jpg + scroll_anim 0.01 0.01 + } + } + } +} +material Examples/Water3 +{ + technique + { + pass + { + scene_blend colour_blend + depth_write off + + texture_unit + { + texture Water02.jpg + env_map spherical + scroll_anim 0.01 0.01 + rotate_anim 0.03 + } + } + } +} +material Examples/Water4 +{ + technique + { + pass + { + cull_hardware none + cull_software none + + texture_unit + { + texture Water02.jpg + env_map spherical + scroll_anim 0.01 0.01 + } + } + } +} +material Examples/Water5 +{ + technique + { + pass + { + cull_hardware none + cull_software none + + texture_unit + { + texture BeachStones.jpg + scale 0.25 0.25 + } + + texture_unit + { + texture Water01.jpg + env_map spherical + scroll_anim 0.01 0.01 + } + } + } +} +material Examples/Water6 +{ + technique + { + pass + { + lighting off + + texture_unit + { + cubic_texture cubescene.jpg combinedUVW + tex_address_mode clamp + env_map cubic_reflection + } + } + } +} +material Examples/Water7 +{ + technique + { + pass + { + cull_hardware none + cull_software none + + texture_unit + { + texture BeachStones.jpg + scale 0.25 0.25 + } + + texture_unit + { + cubic_texture cubescene.jpg combinedUVW + tex_address_mode clamp + env_map cubic_reflection + } + } + } +} +material Examples/Water8 +{ + technique + { + pass + { + lighting off + scene_blend add + depth_write off + cull_hardware none + cull_software none + + texture_unit + { + cubic_texture cubescene.jpg combinedUVW + tex_address_mode clamp + env_map cubic_reflection + } + } + } +} diff --git a/files/water/Water01.jpg b/files/water/Water01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9c9b7feec540c35e7a1972cb78c5661912da77d GIT binary patch literal 295326 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

`a>RgL%!BnG?f)Wpv-@KTSGDlR)gOgC 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 WNj=oLu-pr?uYdqM{g?ay=Kl|rkHWS9 literal 0 HcmV?d00001 diff --git a/files/water/water1.cg b/files/water/water1.cg new file mode 100644 index 000000000..f8fa18c1a --- /dev/null +++ b/files/water/water1.cg @@ -0,0 +1,39 @@ +void main( in float4 fresnel : COLOR0, + in float4 inTex0 : TEXCOORD0, + in float4 inTex1 : TEXCOORD1, + in float4 inTex2 : TEXCOORD2, + in float4 inTex3 : TEXCOORD3, + in float4 inTex4 : COLOR1, + in float4 inTex5 : BCOL1, + out float4 outCol : COLOR, + uniform float4 matrix, + uniform sampler2D offsetTexture : texunit0, + uniform sampler2D reflexTexture : texunit1, + uniform sampler2D refractTexture : texunit2, + uniform sampler2D depthTexture : texunit3) +{ + float4 norm = tex2D(offsetTexture, inTex0.xy); + float4 refr = tex2D(depthTexture, inTex3.xy); + + float4 norm2 = tex2D(offsetTexture, inTex0.xy/10.0f); + + float4 projCoord = inTex1 / inTex1.w; + projCoord = (projCoord + 1.0) * 0.5; + projCoord += norm * 0.02; + projCoord = clamp(projCoord, 0.001, 0.999); + + float4 reflexe = tex2D(reflexTexture, projCoord.xy); + float4 refrakce = tex2D(refractTexture, projCoord.xy); + + float4 odrazy = reflexe*(0.7+0.3*refr); + + reflexe = (float4(0,0.4,0.4,1.0) + reflexe*0.5); + + outCol = lerp(refrakce, reflexe, fresnel.r)-refr*0.08; + +//outCol = lerp(refrakce, reflexe, fresnel.r); + +// outCol = norm; + + outCol.a = 1; +} \ No newline at end of file From 2aad3a0bd8b5ec0875e781b3dfd8bc5f7b1e8402 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 19 Jan 2012 23:29:07 -0500 Subject: [PATCH 003/586] Correct water levels --- apps/openmw/mwrender/renderingmanager.cpp | 15 ++++++++++++-- apps/openmw/mwrender/renderingmanager.hpp | 1 + apps/openmw/mwrender/water.cpp | 25 +++++++++++++++-------- apps/openmw/mwrender/water.hpp | 2 +- apps/openmw/mwworld/scene.cpp | 2 +- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 54c1b55ef..312b2c410 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -57,7 +57,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const cameraPitchNode->attachObject(rend.getCamera()); mPlayer = new MWRender::Player (rend.getCamera(), playerNode); - mWater = new MWRender::Water(rend.getCamera()); + mWater = 0; //std::cout << "Three"; } @@ -84,6 +84,10 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ objects.removeCell(store); + if(mWater){ + delete mWater; + mWater = 0; + } } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ const MWWorld::Class& class_ = @@ -114,6 +118,11 @@ bool RenderingManager::getPhysicsDebugRendering() const{ void RenderingManager::update (float duration){ +} +void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store){ + if(store->cell->data.flags & store->cell->HasWater) + mWater = new MWRender::Water(rend.getCamera(), store->cell->water); + } void RenderingManager::skyEnable () @@ -222,7 +231,9 @@ void RenderingManager::toggleLight() setAmbientMode(); } void RenderingManager::checkUnderwater(){ - mWater->checkUnderwater(); + if(mWater){ + mWater->checkUnderwater(); + } } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 7130bdc2b..f397d23e6 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -58,6 +58,7 @@ class RenderingManager: private RenderingInterface { virtual MWRender::Creatures& getCreatures(); virtual MWRender::Objects& getObjects(); virtual MWRender::Player& getPlayer(); + void cellAdded (MWWorld::Ptr::CellStore *store); void toggleLight(); bool toggleRenderMode(int mode); diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index 2e4882b63..86e9ad885 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -1,23 +1,24 @@ #include "water.hpp" namespace MWRender { - Water::Water (Ogre::Camera *camera) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { - std::cout << "1\n"; + Water::Water (Ogre::Camera *camera, int top) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { try { Ogre::CompositorManager::getSingleton().addCompositor(mViewport, "Water", -1); Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); } catch(...) { } mIsUnderwater = false; - mCamera->addListener(this); - - mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, 0); - Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 7000, 7000, 1, 1, true, 1, 3,5, Ogre::Vector3::UNIT_Z); - - mWater = mSceneManager->createEntity("Water", "water"); - mWater->setMaterialName("Examples/Water0"); + mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, top); + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 14000, 14000, 1, 1, true, 1, 3,5, Ogre::Vector3::UNIT_Z); + + + mWater = mSceneManager->createEntity("water"); + mWater->setMaterialName("Examples/Water0"); + + + mWaterNode = mSceneManager->getRootSceneNode()->createChildSceneNode(); mWaterNode->attachObject(mWater); @@ -26,6 +27,12 @@ namespace MWRender { Water::~Water() { + mCamera->removeListener(this); + + mWaterNode->detachObject(mWater); + mSceneManager->destroyEntity(mWater); + mSceneManager->destroySceneNode(mWaterNode); + Ogre::MeshManager::getSingleton().remove("water"); //Ogre::TextureManager::getSingleton().remove("refraction"); //Ogre::TextureManager::getSingleton().remove("reflection"); diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp index 8e04ca3c8..b12a03357 100644 --- a/apps/openmw/mwrender/water.hpp +++ b/apps/openmw/mwrender/water.hpp @@ -33,7 +33,7 @@ namespace MWRender { public: - Water (Ogre::Camera *camera); + Water (Ogre::Camera *camera, int top); ~Water(); void checkUnderwater(); diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 152e00130..fde4d6394 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -95,7 +95,7 @@ namespace MWWorld mActiveCells.insert(cell); if(result.second){ insertCell(*cell, mEnvironment); - //mRendering.cellAdded (cell); + mRendering.cellAdded (cell); mRendering.configureAmbient(*cell); } From 84f45b19720c62d76ab932e18af69d5152ab4599 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 20 Jan 2012 17:59:56 -0500 Subject: [PATCH 004/586] underwater view --- apps/openmw/engine.cpp | 4 +--- apps/openmw/mwrender/renderingmanager.cpp | 4 ++-- apps/openmw/mwrender/renderingmanager.hpp | 2 +- apps/openmw/mwrender/water.cpp | 18 +++++++++--------- apps/openmw/mwrender/water.hpp | 3 ++- apps/openmw/mwworld/world.cpp | 5 +++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 36d801326..4535fd820 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -310,9 +310,7 @@ void OMW::Engine::go() // This has to be added BEFORE MyGUI is initialized, as it needs // to find core.xml here. - std::cout << "Before the water\n"; - - std::cout << "After the water" << mResDir << "\n"; + //addResourcesDirectory(mResDir); addResourcesDirectory(mResDir / "mygui"); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 312b2c410..b5fce4b44 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -230,9 +230,9 @@ void RenderingManager::toggleLight() setAmbientMode(); } -void RenderingManager::checkUnderwater(){ +void RenderingManager::checkUnderwater(float y){ if(mWater){ - mWater->checkUnderwater(); + mWater->checkUnderwater(y); } } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index f397d23e6..99926e400 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -71,7 +71,7 @@ class RenderingManager: private RenderingInterface { void moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position); void scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale); void rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation); - void checkUnderwater(); + void checkUnderwater(float y); /// \param store Cell the object was in previously (\a ptr has already been updated to the new cell). void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index 86e9ad885..2ab2fee38 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -1,7 +1,7 @@ #include "water.hpp" namespace MWRender { - Water::Water (Ogre::Camera *camera, int top) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { + Water::Water (Ogre::Camera *camera, int top) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()), mTop(top) { try { Ogre::CompositorManager::getSingleton().addCompositor(mViewport, "Water", -1); Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); @@ -10,11 +10,13 @@ namespace MWRender { mIsUnderwater = false; mCamera->addListener(this); - mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, top); - Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 14000, 14000, 1, 1, true, 1, 3,5, Ogre::Vector3::UNIT_Z); + mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, mTop); + + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 14000, 14000, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); mWater = mSceneManager->createEntity("water"); + mWater->setMaterialName("Examples/Water0"); @@ -58,24 +60,22 @@ namespace MWRender { } } - void Water::checkUnderwater() { - Ogre::Vector3 pos = mCamera->getPosition(); - if (mIsUnderwater && pos.y > 0) { + void Water::checkUnderwater(float y) { + + if (mIsUnderwater && y > mTop) { try { Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); } catch(...) { } - std::cout << "Removing water compositor" << "\n"; mIsUnderwater = false; } - if (!mIsUnderwater && pos.y < 0) { + if (!mIsUnderwater && y < mTop) { try { Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", true); } catch(...) { } mIsUnderwater = true; - std::cout << "Adding water compositor" << "\n"; } } diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp index b12a03357..73057cc34 100644 --- a/apps/openmw/mwrender/water.hpp +++ b/apps/openmw/mwrender/water.hpp @@ -21,6 +21,7 @@ namespace MWRender { Ogre::Vector3 mOldCameraPos; bool mIsUnderwater; + int mTop; @@ -36,7 +37,7 @@ namespace MWRender { Water (Ogre::Camera *camera, int top); ~Water(); - void checkUnderwater(); + void checkUnderwater(float y); }; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index b32f0203f..d290e093b 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -522,10 +522,11 @@ namespace MWWorld ptr.getRefData().getPosition().pos[0] = x; ptr.getRefData().getPosition().pos[1] = y; ptr.getRefData().getPosition().pos[2] = z; - if (ptr==mPlayer->getPlayer()) { - mRendering.checkUnderwater(); + //std::cout << "Current pos" << ptr.getRefData().getPosition().pos[1]; + + mRendering.checkUnderwater( ptr.getRefData().getPosition().pos[2]); Ptr::CellStore *currentCell = mWorldScene->getCurrentCell(); if (currentCell) { From bf09762b6a467f3d6d8416c554580784d0814911 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 20 Jan 2012 19:50:42 -0500 Subject: [PATCH 005/586] Ground showing up --- files/water/Examples-Water.material | 9 +++------ files/water/WaterNormal1.tga | Bin 0 -> 196652 bytes 2 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 files/water/WaterNormal1.tga diff --git a/files/water/Examples-Water.material b/files/water/Examples-Water.material index 285cb22ce..c09447aa1 100644 --- a/files/water/Examples-Water.material +++ b/files/water/Examples-Water.material @@ -32,7 +32,6 @@ material Water/Compositor pass { depth_check off - vertex_program_ref Water/GlassVP { param_named_auto timeVal time 0.25 @@ -105,7 +104,7 @@ material Examples/Water0 { // - + depth_write off vertex_program_ref Water/RefractReflectVP { param_named_auto worldViewProjMatrix worldviewproj_matrix @@ -133,15 +132,13 @@ material Examples/Water0 texture Water02.jpg // min / mag filtering, no mip filtering linear linear none - colour_op_ex source1 src_manual src_current 0 1 0 - alpha_op_ex source1 src_manual src_current 0.1 + alpha_op_ex source1 src_manual src_current 0.9 } // Noise texture_unit { - colour_op_ex source1 src_manual src_current 0 1 0 - alpha_op_ex source1 src_manual src_current 0.1 + alpha_op_ex source1 src_manual src_current 0.9 // Perlin noise volume texture waves2.dds // min / mag filtering, no mip diff --git a/files/water/WaterNormal1.tga b/files/water/WaterNormal1.tga new file mode 100644 index 0000000000000000000000000000000000000000..a9ca11b7ed0a44ddbd9d1b5cd8d699ade928c4a6 GIT binary patch literal 196652 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%0A>`i> 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 literal 0 HcmV?d00001 From 18108c02a7e7a965252da74526536b3306ba1e8a Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Sat, 21 Jan 2012 16:59:08 +0000 Subject: [PATCH 006/586] Merge of corristo's terrain rendering and fixes so that the terrain is correctly positioned and rendered --- CMakeLists.txt | 11 +++ apps/openmw/CMakeLists.txt | 3 +- apps/openmw/mwrender/renderingmanager.cpp | 4 + apps/openmw/mwrender/renderingmanager.hpp | 2 + apps/openmw/mwrender/terrain.cpp | 62 ++++++++++++++++ apps/openmw/mwrender/terrain.hpp | 31 ++++++++ cmake/FindOGRE.cmake | 15 ++++ components/esm/loadcell.hpp | 15 ++++ components/esm/loadland.cpp | 89 +++++++++++++++++++++-- components/esm/loadland.hpp | 44 +++++++++++ components/esm_store/cell_store.hpp | 33 ++++++++- components/esm_store/reclists.hpp | 2 +- components/esm_store/store.hpp | 2 +- files/plugins.cfg.linux | 2 +- files/plugins.cfg.mac | 2 +- 15 files changed, 306 insertions(+), 11 deletions(-) create mode 100644 apps/openmw/mwrender/terrain.cpp create mode 100644 apps/openmw/mwrender/terrain.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 723d10b34..015ffd7ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,6 +188,7 @@ find_package(OpenAL REQUIRED) find_package(Bullet REQUIRED) include_directories("." ${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE + ${OGRE_Terrain_INCLUDE_DIR} ${OIS_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${PLATFORM_INCLUDE_DIR} ${CMAKE_HOME_DIRECTORY}/extern/caelum/include @@ -259,6 +260,16 @@ if (APPLE) configure_file(${OGRE_PLUGIN_DIR}/Plugin_ParticleFX.dylib "${APP_BUNDLE_DIR}/Contents/Plugins/Plugin_ParticleFX.dylib" COPYONLY) + # prepare components + configure_file(${OGRE_LIB_DIR}/libOgrePaging.dylib + "${APP_BUNDLE_DIR}/Contents/Components/libOgrePaging.dylib" COPYONLY) + + configure_file(${OGRE_LIB_DIR}/libOgreTerrain.dylib + "${APP_BUNDLE_DIR}/Contents/Components/libOgreTerrain.dylib" COPYONLY) + + configure_file(${OpenMW_SOURCE_DIR}/files/openmw.cfg + "${APP_BUNDLE_DIR}/Contents/MacOS/openmw.cfg") + endif (APPLE) diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index e17a2cb25..663a10787 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging sky player npcs creatures objects renderinginterface + renderingmanager debugging sky terrain player npcs creatures objects renderinginterface ) add_openmw_dir (mwinput @@ -75,6 +75,7 @@ add_definitions(${SOUND_DEFINE}) target_link_libraries(openmw ${OGRE_LIBRARIES} + ${OGRE_Terrain_LIBRARY} ${OIS_LIBRARIES} ${Boost_LIBRARIES} ${OPENAL_LIBRARY} diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 06339cdd4..b0b7c88c4 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -26,6 +26,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const { rend.createScene("PlayerCam", 55, 5); mSkyManager = MWRender::SkyManager::create(rend.getWindow(), rend.getCamera(), resDir); + mTerrainManager = new TerrainManager(rend.getScene()); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -59,6 +60,7 @@ RenderingManager::~RenderingManager () { delete mPlayer; delete mSkyManager; + delete mTerrainManager; } MWRender::Npcs& RenderingManager::getNPCs(){ @@ -76,11 +78,13 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ objects.removeCell(store); + mTerrainManager->cellRemoved(store); } void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store) { objects.buildStaticGeometry (*store); + mTerrainManager->cellAdded(store); } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 8d8c98232..5afbd9b78 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -3,6 +3,7 @@ #include "sky.hpp" +#include "terrain.hpp" #include "debugging.hpp" #include "../mwworld/class.hpp" @@ -97,6 +98,7 @@ class RenderingManager: private RenderingInterface { void setAmbientMode(); SkyManager* mSkyManager; + TerrainManager* mTerrainManager; OEngine::Render::OgreRenderer &rend; Ogre::Camera* camera; MWRender::Npcs npcs; diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp new file mode 100644 index 000000000..44c499130 --- /dev/null +++ b/apps/openmw/mwrender/terrain.cpp @@ -0,0 +1,62 @@ +#include +#include + +#include "terrain.hpp" + +#include "components/esm/loadland.hpp" + +namespace MWRender +{ + TerrainManager::TerrainManager(Ogre::SceneManager* mgr) + { + mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions(); + + mTerrainGlobals->setMaxPixelError(8); + + mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, + Ogre::Terrain::ALIGN_X_Z, ESM::Land::LAND_SIZE, + ESM::Land::REAL_SIZE); + + mTerrainGroup->setOrigin(Ogre::Vector3(ESM::Land::REAL_SIZE/2, + 0, + -ESM::Land::REAL_SIZE/2)); + + Ogre::Terrain::ImportData importSettings = + mTerrainGroup->getDefaultImportSettings(); + + importSettings.terrainSize = ESM::Land::LAND_SIZE; + importSettings.worldSize = ESM::Land::REAL_SIZE; + importSettings.minBatchSize = 9; + importSettings.maxBatchSize = 33; + + importSettings.deleteInputData = false; + } + + TerrainManager::~TerrainManager() + { + OGRE_DELETE mTerrainGroup; + OGRE_DELETE mTerrainGlobals; + } + + void TerrainManager::cellAdded(MWWorld::Ptr::CellStore *store) + { + int x = store->cell->getGridX(); + int y = store->cell->getGridY(); + + Ogre::Terrain::ImportData terrainData; + + terrainData.inputBias = 0; + terrainData.inputFloat = store->land->landData->heights; + + mTerrainGroup->defineTerrain(x, y, &terrainData); + + mTerrainGroup->loadTerrain(x, y, true); + } + + void TerrainManager::cellRemoved(MWWorld::Ptr::CellStore *store) + { + mTerrainGroup->removeTerrain(store->cell->getGridX(), + store->cell->getGridY()); + } + +} diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp new file mode 100644 index 000000000..0a8b1ace0 --- /dev/null +++ b/apps/openmw/mwrender/terrain.hpp @@ -0,0 +1,31 @@ +#ifndef _GAME_RENDER_TERRAIN_H +#define _GAME_RENDER_TERRAIN_H + +#include "../mwworld/ptr.hpp" + +namespace Ogre{ + class SceneManager; + class TerrainGroup; + class TerrainGlobalOptions; +} + +namespace MWRender{ + + /** + * Implements the Morrowind terrain using the Ogre Terrain Component + */ + class TerrainManager{ + public: + TerrainManager(Ogre::SceneManager*); + virtual ~TerrainManager(); + + void cellAdded(MWWorld::Ptr::CellStore* store); + void cellRemoved(MWWorld::Ptr::CellStore* store); + private: + Ogre::TerrainGlobalOptions* mTerrainGlobals; + Ogre::TerrainGroup* mTerrainGroup; + }; + +} + +#endif // _GAME_RENDER_TERRAIN_H diff --git a/cmake/FindOGRE.cmake b/cmake/FindOGRE.cmake index ce3993805..c3b471bb2 100644 --- a/cmake/FindOGRE.cmake +++ b/cmake/FindOGRE.cmake @@ -96,10 +96,25 @@ IF (OGRE_INCLUDE_DIR AND OGRE_LIBRARIES) ENDIF (OGRE_INCLUDE_DIR AND OGRE_LIBRARIES) IF (OGRE_FOUND) + # find terrain component + find_path(OGRE_Terrain_INCLUDE_DIR NAMES OgreTerrain.h HINTS ${OGRE_INCLUDE_DIR} PATH_SUFFIXES Terrain Components/Terrain/include) + set(OGRE_Terrain_LIBRARY_NAMES "OgreTerrain") + find_library(OGRE_Terrain_LIBRARY NAMES ${OGRE_Terrain_LIBRARY_NAMES} HINTS ${OGRE_LIB_DIR} PATH_SUFFIXES "" "release" "relwithdebinfo" "minsizerel") + if(OGRE_Terrain_INCLUDE_DIR AND OGRE_Terrain_LIBRARY) + SET(OGRE_Terrain_FOUND TRUE) + endif(OGRE_Terrain_INCLUDE_DIR AND OGRE_Terrain_LIBRARY) + IF (NOT OGRE_FIND_QUIETLY) MESSAGE(STATUS " libraries : ${OGRE_LIBRARIES} from ${OGRE_LIB_DIR}") MESSAGE(STATUS " includes : ${OGRE_INCLUDE_DIR}") MESSAGE(STATUS " plugins : ${OGRE_PLUGIN_DIR}") + IF (OGRE_Terrain_FOUND) + MESSAGE(STATUS "Ogre Terrain component found:") + MESSAGE(STATUS " include : ${OGRE_Terrain_INCLUDE_DIR}") + MESSAGE(STATUS " library : ${OGRE_Terrain_LIBRARY}") + ELSE (OGRE_Terrain_FOUND) + MESSAGE(FATAL_ERROR "Required Ogre terrain component not found") + ENDIF (OGRE_Terrain_FOUND) ENDIF (NOT OGRE_FIND_QUIETLY) ELSE (OGRE_FOUND) IF (OGRE_FIND_REQUIRED) diff --git a/components/esm/loadcell.hpp b/components/esm/loadcell.hpp index 671f702ca..a5d61f930 100644 --- a/components/esm/loadcell.hpp +++ b/components/esm/loadcell.hpp @@ -119,6 +119,21 @@ struct Cell void load(ESMReader &esm); + bool isExterior() const + { + return !(data.flags & Interior); + } + + int getGridX() const + { + return data.gridX; + } + + int getGridY() const + { + return data.gridY; + } + // Restore the given reader to the stored position. Will try to open // the file matching the stored file name. If you want to read from // somewhere other than the file system, you need to pre-open the diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 740d15a40..b8de98f0a 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -19,14 +19,93 @@ void Land::load(ESMReader &esm) int cnt = 0; // Skip these here. Load the actual data when the cell is loaded. - if(esm.isNextSub("VNML")) {esm.skipHSubSize(12675);cnt++;} - if(esm.isNextSub("VHGT")) {esm.skipHSubSize(4232);cnt++;} - if(esm.isNextSub("WNAM")) esm.skipHSubSize(81); - if(esm.isNextSub("VCLR")) esm.skipHSubSize(12675); - if(esm.isNextSub("VTEX")) {esm.skipHSubSize(512);cnt++;} + if (esm.isNextSub("VNML")) + { + esm.skipHSubSize(12675); + cnt++; + } + if (esm.isNextSub("VHGT")) + { + esm.skipHSubSize(4232); + cnt++; + } + if (esm.isNextSub("WNAM")) + { + esm.skipHSubSize(81); + } + if (esm.isNextSub("VCLR")) + { + esm.skipHSubSize(12675); + } + if (esm.isNextSub("VTEX")) + { + esm.skipHSubSize(512); + cnt++; + } // We need all three of VNML, VHGT and VTEX in order to use the // landscape. hasData = (cnt == 3); + + dataLoaded = false; + landData = NULL; } + +void Land::loadData(ESMReader &esm) +{ + if (dataLoaded) + { + return; + } + + landData = new LandData; + + if (hasData) + { + esm.restoreContext(context); + + //esm.getHNExact(landData->normals, sizeof(VNML), "VNML"); + if (esm.isNextSub("VNML")) + { + esm.skipHSubSize(12675); + } + + VHGT rawHeights; + + esm.getHNExact(&rawHeights, sizeof(VHGT), "VHGT"); + int currentHeightOffset = rawHeights.heightOffset; + for (int y = 0; y < LAND_SIZE; y++) + { + currentHeightOffset += rawHeights.heightData[y * LAND_SIZE]; + landData->heights[y * LAND_SIZE] = currentHeightOffset * HEIGHT_SCALE; + + int tempOffset = currentHeightOffset; + for (int x = 1; x < LAND_SIZE; x++) + { + tempOffset += rawHeights.heightData[y * LAND_SIZE + x]; + landData->heights[x + y * LAND_SIZE] = tempOffset * HEIGHT_SCALE; + } + } + } + else + { + for (int i = 0; i < LAND_NUM_VERTS; i++) + { + landData->heights[i] = -256.0f * HEIGHT_SCALE; + } + } + + dataLoaded = true; +} + +void Land::unloadData() +{ + if (dataLoaded) + { + delete landData; + landData = NULL; + dataLoaded = false; + } +} + } diff --git a/components/esm/loadland.hpp b/components/esm/loadland.hpp index af91850ac..898e7f529 100644 --- a/components/esm/loadland.hpp +++ b/components/esm/loadland.hpp @@ -21,7 +21,51 @@ struct Land bool hasData; + bool dataLoaded; + + // number of vertices per side + static const int LAND_SIZE = 65; + + // cell terrain size in world coords + static const int REAL_SIZE = 8192; + + // total number of vertices + static const int LAND_NUM_VERTS = LAND_SIZE * LAND_SIZE; + + static const int HEIGHT_SCALE = 8; + +#pragma pack(push,1) + struct VHGT + { + float heightOffset; + int8_t heightData[LAND_NUM_VERTS]; + short unknown1; + char unknown2; + }; +#pragma pack(pop) + + typedef uint8_t VNML[LAND_NUM_VERTS * 3]; + + struct LandData + { + float heightOffset; + float heights[LAND_NUM_VERTS]; + //float normals[LAND_NUM_VERTS * 3]; + }; + + LandData *landData; + void load(ESMReader &esm); + + /** + * Actually loads data + */ + void loadData(ESMReader &esm); + + /** + * Frees memory allocated for land data + */ + void unloadData(); }; } #endif diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index d064312f1..7c2ee48fb 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -96,7 +96,8 @@ namespace ESMS State_Unloaded, State_Preloaded, State_Loaded }; - CellStore (const ESM::Cell *cell_) : cell (cell_), mState (State_Unloaded) {} + CellStore (const ESM::Cell *cell_) : cell (cell_), mState (State_Unloaded), + land(NULL) {} const ESM::Cell *cell; State mState; @@ -124,6 +125,8 @@ namespace ESMS CellRefList statics; CellRefList weapons; + const Land* land; + void load (const ESMStore &store, ESMReader &esm) { if (mState!=State_Loaded) @@ -135,6 +138,11 @@ namespace ESMS loadRefs (store, esm); + if ( ! (cell->data.flags & ESM::Cell::Interior) ) + { + loadTerrain(cell->data.gridX, cell->data.gridY, store, esm); + } + mState = State_Loaded; } } @@ -180,6 +188,29 @@ namespace ESMS private: + void loadTerrain(int X, int Y, const ESMStore &store, ESMReader &esm) + { + // load terrain + Land *land = store.lands.search(X, Y); + if (land != NULL) + { + land->loadData(esm); + } + + this->land = land; + } + + void unloadTerrain(int X, int Y, const ESMStore &store) { + Land *land = store.lands.search(X,Y); + // unload terrain + if (land != NULL) + { + land->unloadData(); + } + + this->land = NULL; + } + template bool forEachImp (Functor& functor, List& list) { diff --git a/components/esm_store/reclists.hpp b/components/esm_store/reclists.hpp index 20a2e8ff9..e150f1085 100644 --- a/components/esm_store/reclists.hpp +++ b/components/esm_store/reclists.hpp @@ -235,7 +235,7 @@ namespace ESMS virtual void listIdentifier (std::vector& identifier) const {} // Find land for the given coordinates. Return null if no data. - const Land *search(int x, int y) const + Land *search(int x, int y) const { Lands::const_iterator it = lands.find(x); if(it==lands.end()) diff --git a/components/esm_store/store.hpp b/components/esm_store/store.hpp index e3bbf9e82..83cd5ab16 100644 --- a/components/esm_store/store.hpp +++ b/components/esm_store/store.hpp @@ -115,7 +115,7 @@ namespace ESMS recLists[REC_GLOB] = &globals; recLists[REC_GMST] = &gameSettings; recLists[REC_INGR] = &ingreds; - //recLists[REC_LAND] = &lands; + recLists[REC_LAND] = &lands; recLists[REC_LEVC] = &creatureLists; recLists[REC_LEVI] = &itemLists; recLists[REC_LIGH] = &lights; diff --git a/files/plugins.cfg.linux b/files/plugins.cfg.linux index b6e104351..2921153b4 100644 --- a/files/plugins.cfg.linux +++ b/files/plugins.cfg.linux @@ -7,6 +7,6 @@ PluginFolder=${OGRE_PLUGIN_DIR} Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_OctreeSceneManager -# Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager diff --git a/files/plugins.cfg.mac b/files/plugins.cfg.mac index baaca4479..0c16bddaf 100644 --- a/files/plugins.cfg.mac +++ b/files/plugins.cfg.mac @@ -7,6 +7,6 @@ PluginFolder= Plugin=RenderSystem_GL.dylib Plugin=Plugin_ParticleFX.dylib Plugin=Plugin_OctreeSceneManager.dylib -# Plugin=Plugin_CgProgramManager +Plugin=Plugin_CgProgramManager From 637302fc87a85fb3c67574861baef406734a7076 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Sat, 21 Jan 2012 17:59:12 +0000 Subject: [PATCH 007/586] Added blended textures to the terrain --- apps/openmw/mwrender/terrain.cpp | 150 ++++++++++++++++++++++++++++ apps/openmw/mwrender/terrain.hpp | 28 ++++++ components/esm/loadland.cpp | 19 ++++ components/esm/loadland.hpp | 8 ++ components/esm_store/cell_store.hpp | 2 + 5 files changed, 207 insertions(+) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 44c499130..4d13b6889 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -48,9 +48,13 @@ namespace MWRender terrainData.inputBias = 0; terrainData.inputFloat = store->land->landData->heights; + std::map indexes; + initTerrainTextures(&terrainData, store, indexes); mTerrainGroup->defineTerrain(x, y, &terrainData); mTerrainGroup->loadTerrain(x, y, true); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(x,y); + initTerrainBlendMaps(terrain, store, indexes); } void TerrainManager::cellRemoved(MWWorld::Ptr::CellStore *store) @@ -59,4 +63,150 @@ namespace MWRender store->cell->getGridY()); } + void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, + MWWorld::Ptr::CellStore* store, + std::map& indexes) + { + //have a base texture for now, but this is probably not needed on most cells + terrainData->layerList.resize(1); + terrainData->layerList[0].worldSize = 256; + terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); + terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); + + const uint16_t* const textures = store->land->landData->textures; + for ( int y = 0; y < ESM::Land::LAND_TEXTURE_SIZE; y++ ) + { + for ( int x = 0; x < ESM::Land::LAND_TEXTURE_SIZE; x++ ) + { + const uint16_t ltexIndex = textures[y * ESM::Land::LAND_TEXTURE_SIZE + x]; + if ( ltexIndex == 0 ) + { + continue; + } + + const std::map::const_iterator it = indexes.find(ltexIndex); + + if ( it == indexes.end() ) + { + //NB: All vtex ids are +1 compared to the ltex ids + assert((int)ltexIndex - 1 > 0 && + store->landTextures->ltex.size() > (size_t)ltexIndex - 1 && + "LAND.VTEX must be within the bounds of the LTEX array"); + + std::string texture = store->landTextures->ltex[ltexIndex-1].texture; + //TODO this is needed due to MWs messed up texture handling + texture = texture.substr(0, texture.rfind(".")) + ".dds"; + + const size_t position = terrainData->layerList.size(); + terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); + + terrainData->layerList[position].worldSize = 256; + terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + + //Normal map. This should be removed but it would require alterations to + //the material generator. Another option would be to use a 1x1 blank texture + terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + + indexes[ltexIndex] = position; + } + } + } + + } + + void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, + MWWorld::Ptr::CellStore* store, + const std::map& indexes) + { + const int blendSize = terrain->getLayerBlendMapSize(); + const int blendDist = TERRAIN_SHADE_DISTANCE * + (blendSize / ESM::Land::LAND_TEXTURE_SIZE); + + //zero out every map + std::map::const_iterator iter; + for ( iter = indexes.begin(); iter != indexes.end(); ++iter ) + { + float* pBlend = terrain->getLayerBlendMap(iter->second) + ->getBlendPointer(); + memset(pBlend, 0, sizeof(float) * blendSize * blendSize); + } + + //covert the ltex data into a set of blend maps + const uint16_t* const textures = store->land->landData->textures; + for ( int texY = 0; texY < ESM::Land::LAND_TEXTURE_SIZE; texY++ ) + { + for ( int texX = 0; texX < ESM::Land::LAND_TEXTURE_SIZE; texX++ ) + { + const uint16_t ltexIndex = textures[texY * ESM::Land::LAND_TEXTURE_SIZE + texX]; + if ( ltexIndex == 0 ){ + continue; + } + const int layerIndex = indexes.find(ltexIndex)->second; + + float* const pBlend = terrain->getLayerBlendMap(layerIndex) + ->getBlendPointer(); + + const int splatSize = blendSize / ESM::Land::LAND_TEXTURE_SIZE; + + //setup the bounds for the shading of this texture splat + const int startX = std::max(0, texX*splatSize - blendDist); + const int endX = std::min(blendSize, (texX+1)*splatSize + blendDist); + + const int startY = std::max(0, texY*splatSize - blendDist); + const int endY = std::min(blendSize, (texY+1)*splatSize + blendDist); + + for ( int blendX = startX; blendX < endX; blendX++ ) + { + for ( int blendY = startY; blendY < endY; blendY++ ) + { + assert(blendX >= 0 && blendX < blendSize && + "index must be within texture bounds"); + + assert(blendY >= 0 && blendY < blendSize && + "index must be within texture bounds"); + + //calculate the distance from the edge of the square + // to the point we are shading + int distX = texX*splatSize - blendX; + if ( distX < 0 ) + { + distX = std::max(0, blendX - (texX+1)*splatSize); + } + + int distY = texY*splatSize - blendY; + if ( distY < 0 ) + { + distY = std::max(0, blendY - (texY+1)*splatSize); + } + + float blendAmount = blendDist - std::sqrt((float)distX*distX + distY*distY); + blendAmount /= blendDist; + + //this is required as blendDist < sqrt(blendDist*blendDist + blendDist*blendDist) + //this means that the corners are slightly the "wrong" shape but totaly smooth + //shading for the edges + blendAmount = std::max( (float) 0.0, blendAmount); + + assert(blendAmount >= 0 && "Blend should never be negative"); + + //flips the y + const int index = blendSize*(blendSize - 1 - blendY) + blendX; + pBlend[index] += blendAmount; + pBlend[index] = std::min((float)1, pBlend[index]); + } + } + + } + } + + //update the maps + for ( iter = indexes.begin(); iter != indexes.end(); ++iter ) + { + Ogre::TerrainLayerBlendMap* blend = terrain->getLayerBlendMap(iter->second); + blend->dirty(); + blend->update(); + } + + } + } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 0a8b1ace0..127c3f5f2 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -1,12 +1,15 @@ #ifndef _GAME_RENDER_TERRAIN_H #define _GAME_RENDER_TERRAIN_H +#include + #include "../mwworld/ptr.hpp" namespace Ogre{ class SceneManager; class TerrainGroup; class TerrainGlobalOptions; + class Terrain; } namespace MWRender{ @@ -24,6 +27,31 @@ namespace MWRender{ private: Ogre::TerrainGlobalOptions* mTerrainGlobals; Ogre::TerrainGroup* mTerrainGroup; + + /** + * The distance that the current cell should be shaded into the neighbouring + * texture. The distance is in terms of the splat size of a texture + */ + static const float TERRAIN_SHADE_DISTANCE = 0.5; + + /** + * Setups up the list of textures for the cell + * @param terrainData the terrain data to setup the textures for + * @param indexes a mapping of ltex index to the terrain texture layer that + * can be used by initTerrainBlendMaps + */ + void initTerrainTextures(Ogre::Terrain::ImportData* terrainData, + MWWorld::Ptr::CellStore* store, + std::map& indexes); + + /** + * Creates the blend (splatting maps) for the given terrain from the ltex data. + * @param terrain the terrain object for the current cell + * @param indexes the mapping of ltex to blend map produced by initTerrainTextures + */ + void initTerrainBlendMaps(Ogre::Terrain* terrain, + MWWorld::Ptr::CellStore* store, + const std::map& indexes); }; } diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index b8de98f0a..1d670036e 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -86,6 +86,25 @@ void Land::loadData(ESMReader &esm) landData->heights[x + y * LAND_SIZE] = tempOffset * HEIGHT_SCALE; } } + + if (esm.isNextSub("WNAM")) + { + esm.skipHSubSize(81); + } + if (esm.isNextSub("VCLR")) + { + esm.skipHSubSize(12675); + } + //TODO fix magic numbers + uint16_t vtex[512]; + esm.getHNExact(&vtex, 512, "VTEX"); + + int readPos = 0; //bit ugly, but it works + for ( int y1 = 0; y1 < 4; y1++ ) + for ( int x1 = 0; x1 < 4; x1++ ) + for ( int y2 = 0; y2 < 4; y2++) + for ( int x2 = 0; x2 < 4; x2++ ) + landData->textures[(y1*4+y2)*16+(x1*4+x2)] = vtex[readPos++]; } else { diff --git a/components/esm/loadland.hpp b/components/esm/loadland.hpp index 898e7f529..4219f3eb6 100644 --- a/components/esm/loadland.hpp +++ b/components/esm/loadland.hpp @@ -34,6 +34,12 @@ struct Land static const int HEIGHT_SCALE = 8; + //number of textures per side of land + static const int LAND_TEXTURE_SIZE = 16; + + //total number of textures per land + static const int LAND_NUM_TEXTURES = LAND_TEXTURE_SIZE * LAND_TEXTURE_SIZE; + #pragma pack(push,1) struct VHGT { @@ -51,6 +57,8 @@ struct Land float heightOffset; float heights[LAND_NUM_VERTS]; //float normals[LAND_NUM_VERTS * 3]; + uint16_t textures[LAND_NUM_TEXTURES]; + char colours[3 * LAND_NUM_VERTS]; }; LandData *landData; diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index 7c2ee48fb..5310237fe 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -126,6 +126,7 @@ namespace ESMS CellRefList weapons; const Land* land; + const LTexList* landTextures; void load (const ESMStore &store, ESMReader &esm) { @@ -141,6 +142,7 @@ namespace ESMS if ( ! (cell->data.flags & ESM::Cell::Interior) ) { loadTerrain(cell->data.gridX, cell->data.gridY, store, esm); + landTextures = &store.landTexts; } mState = State_Loaded; From a0838369b2c11f98108845f685a67c7847c9f93b Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 21 Jan 2012 20:05:08 -0500 Subject: [PATCH 008/586] Very basic exterior water --- apps/openmw/mwrender/renderingmanager.cpp | 11 +++++++++-- apps/openmw/mwrender/renderingmanager.hpp | 1 + apps/openmw/mwrender/water.cpp | 19 +++++++++++++++++-- apps/openmw/mwrender/water.hpp | 7 +++++-- apps/openmw/mwworld/scene.cpp | 9 +++++++-- apps/openmw/mwworld/world.cpp | 2 +- 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index b5fce4b44..b86f73ba4 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -84,6 +84,9 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ objects.removeCell(store); + +} +void RenderingManager::removeWater (){ if(mWater){ delete mWater; mWater = 0; @@ -120,8 +123,12 @@ void RenderingManager::update (float duration){ } void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store){ - if(store->cell->data.flags & store->cell->HasWater) - mWater = new MWRender::Water(rend.getCamera(), store->cell->water); + if(store->cell->data.flags & store->cell->HasWater){ + if(mWater == 0) + mWater = new MWRender::Water(rend.getCamera(), store->cell); + //else + + } } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 99926e400..e35a80751 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -64,6 +64,7 @@ class RenderingManager: private RenderingInterface { bool toggleRenderMode(int mode); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? + void removeWater(); void addObject (const MWWorld::Ptr& ptr); void removeObject (const MWWorld::Ptr& ptr); diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index 2ab2fee38..98730922c 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -1,18 +1,21 @@ #include "water.hpp" namespace MWRender { - Water::Water (Ogre::Camera *camera, int top) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()), mTop(top) { + Water::Water (Ogre::Camera *camera, const ESM::Cell* cell) : mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()) { try { Ogre::CompositorManager::getSingleton().addCompositor(mViewport, "Water", -1); Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); } catch(...) { } + mTop = cell->water; + + std::cout << "Making water\n"; mIsUnderwater = false; mCamera->addListener(this); mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, mTop); - Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, 14000, 14000, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, CELL_SIZE*3 + 10000, CELL_SIZE * 3 + 10000, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); mWater = mSceneManager->createEntity("water"); @@ -23,6 +26,13 @@ namespace MWRender { mWaterNode = mSceneManager->getRootSceneNode()->createChildSceneNode(); + + //if(!(cell->data.flags & cell->Interior)) + //{ + mWaterNode->setPosition(getSceneNodeCoordinates(cell->data.gridX, cell->data.gridY)); + //} + //else + // mWaterNode->setPosition(10000, 0, 10000); //Don't mess with y mWaterNode->attachObject(mWater); } @@ -95,5 +105,10 @@ namespace MWRender { void Water::cameraDestroyed(Ogre::Camera *cam) { } + Ogre::Vector3 Water::getSceneNodeCoordinates(int gridX, int gridY){ + Ogre::Vector3 out = Ogre::Vector3(gridX * CELL_SIZE + (CELL_SIZE / 2), 0, -gridY * CELL_SIZE - (CELL_SIZE / 2)); + + return out; + } } diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp index 73057cc34..e07e93eef 100644 --- a/apps/openmw/mwrender/water.hpp +++ b/apps/openmw/mwrender/water.hpp @@ -2,12 +2,13 @@ #define GAME_MWRENDER_WATER_H #include - +#include namespace MWRender { /// Water rendering class Water : Ogre::RenderTargetListener, Ogre::Camera::Listener { + static const int CELL_SIZE = 8192; Ogre::Camera *mCamera; Ogre::SceneManager *mSceneManager; Ogre::Viewport *mViewport; @@ -31,13 +32,15 @@ namespace MWRender { void cameraPreRenderScene(Ogre::Camera *cam); void cameraPostRenderScene(Ogre::Camera *cam); void cameraDestroyed(Ogre::Camera *cam); + Ogre::Vector3 getSceneNodeCoordinates(int gridX, int gridY); public: - Water (Ogre::Camera *camera, int top); + Water (Ogre::Camera *camera, const ESM::Cell* cell); ~Water(); void checkUnderwater(float y); + void changeCell(float x, float y); }; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index fde4d6394..12264913e 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -75,7 +75,7 @@ namespace MWWorld mPhysics->removeObject (node->getName()); } } - mRendering.removeCell(active); + //mPhysics->removeObject("Unnamed_43"); mWorld->getLocalScripts().clearCell (active); mEnvironment.mMechanicsManager->dropActors (active); @@ -95,7 +95,6 @@ namespace MWWorld mActiveCells.insert(cell); if(result.second){ insertCell(*cell, mEnvironment); - mRendering.cellAdded (cell); mRendering.configureAmbient(*cell); } @@ -180,6 +179,7 @@ namespace MWWorld assert (iter!=mActiveCells.end()); mCurrentCell = *iter; + std::cout << "GridX: " << mCurrentCell->cell->data.gridX << "GridY: " << mCurrentCell->cell->data.gridY << "\n"; // adjust player playerCellChange (mWorld->getExterior(X, Y), position, adjustPlayerPos); @@ -188,6 +188,7 @@ namespace MWWorld mWorld->adjustSky(); mCellChanged = true; + mRendering.cellAdded(mCurrentCell); } //We need the ogre renderer and a scene node. @@ -214,6 +215,7 @@ namespace MWWorld void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) { std::cout << "Changing to interior\n"; + mRendering.removeWater(); // remove active CellStoreCollection::iterator active = mActiveCells.begin(); @@ -227,6 +229,7 @@ namespace MWWorld Ptr::CellStore *cell = mWorld->getInterior(cellName); loadCell (cell); + // adjust player mCurrentCell = cell; @@ -236,12 +239,14 @@ namespace MWWorld mWorld->adjustSky(); mCellChanged = true; + mRendering.cellAdded(cell); } void Scene::changeToExteriorCell (const ESM::Position& position) { int x = 0; int y = 0; + mRendering.removeWater(); mWorld->positionToIndex (position.pos[0], position.pos[1], x, y); diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index d290e093b..f02c71ed6 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -524,7 +524,7 @@ namespace MWWorld ptr.getRefData().getPosition().pos[2] = z; if (ptr==mPlayer->getPlayer()) { - //std::cout << "Current pos" << ptr.getRefData().getPosition().pos[1]; + //std::cout << "X:" << ptr.getRefData().getPosition().pos[0] << " Z: " << ptr.getRefData().getPosition().pos[1] << "\n"; mRendering.checkUnderwater( ptr.getRefData().getPosition().pos[2]); Ptr::CellStore *currentCell = mWorldScene->getCurrentCell(); From 1b1ce485024ddca13ad354ff4ee38c349dc00222 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Sun, 22 Jan 2012 20:20:12 +0400 Subject: [PATCH 009/586] Now terrain manager donesn't try to load terrain for interiors --- apps/openmw/mwrender/renderingmanager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index b0b7c88c4..471ce5c41 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -78,13 +78,15 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ objects.removeCell(store); - mTerrainManager->cellRemoved(store); + if (store->cell->isExterior()) + mTerrainManager->cellRemoved(store); } void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store) { objects.buildStaticGeometry (*store); - mTerrainManager->cellAdded(store); + if (store->cell->isExterior()) + mTerrainManager->cellAdded(store); } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ From e1aba44da643a1e776fa69873ebf8e59bdc5cd0f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 22 Jan 2012 16:38:10 -0500 Subject: [PATCH 010/586] Switching cells in exterior works --- apps/openmw/mwrender/renderingmanager.cpp | 4 ++++ apps/openmw/mwrender/water.cpp | 20 ++++++++++++++++---- apps/openmw/mwrender/water.hpp | 2 +- apps/openmw/mwworld/scene.cpp | 2 -- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index b18415e65..3adfa6929 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -133,9 +133,13 @@ void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){ if(store->cell->data.flags & store->cell->HasWater){ if(mWater == 0) mWater = new MWRender::Water(rend.getCamera(), store->cell); + else + mWater->changeCell(store->cell); //else } + else + removeWater(); } diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index 4ab809567..5cf6df99e 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -12,9 +12,9 @@ namespace MWRender { mIsUnderwater = false; - mCamera->addListener(this); + //mCamera->addListener(this); - mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, mTop); + mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, 0); Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, CELL_SIZE*3 + 10000, CELL_SIZE * 3 + 10000, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); @@ -27,6 +27,7 @@ namespace MWRender { mWaterNode = mSceneManager->getRootSceneNode()->createChildSceneNode(); + mWaterNode->setPosition(0, mTop, 0); if(!(cell->data.flags & cell->Interior)) @@ -40,7 +41,7 @@ namespace MWRender { Water::~Water() { Ogre::MeshManager::getSingleton().remove("water"); - mCamera->removeListener(this); + //mCamera->removeListener(this); mWaterNode->detachObject(mWater); mSceneManager->destroyEntity(mWater); @@ -51,6 +52,17 @@ namespace MWRender { Ogre::CompositorManager::getSingleton().removeCompositorChain(mViewport); } + void Water::changeCell(const ESM::Cell* cell){ + mTop = cell->water; + + + + if(!(cell->data.flags & cell->Interior)) + mWaterNode->setPosition(getSceneNodeCoordinates(cell->data.gridX, cell->data.gridY)); + else + mWaterNode->setPosition(0, mTop, 0); + } + void Water::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) { mWater->setVisible(false); @@ -106,7 +118,7 @@ namespace MWRender { void Water::cameraDestroyed(Ogre::Camera *cam) { } Ogre::Vector3 Water::getSceneNodeCoordinates(int gridX, int gridY){ - Ogre::Vector3 out = Ogre::Vector3(gridX * CELL_SIZE + (CELL_SIZE / 2), 0, -gridY * CELL_SIZE - (CELL_SIZE / 2)); + Ogre::Vector3 out = Ogre::Vector3(gridX * CELL_SIZE + (CELL_SIZE / 2), mTop, -gridY * CELL_SIZE - (CELL_SIZE / 2)); return out; } diff --git a/apps/openmw/mwrender/water.hpp b/apps/openmw/mwrender/water.hpp index e07e93eef..bdc9895fd 100644 --- a/apps/openmw/mwrender/water.hpp +++ b/apps/openmw/mwrender/water.hpp @@ -40,7 +40,7 @@ namespace MWRender { ~Water(); void checkUnderwater(float y); - void changeCell(float x, float y); + void changeCell(const ESM::Cell* cell); }; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index b222d5aec..0b02a867e 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -218,7 +218,6 @@ namespace MWWorld void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) { std::cout << "Changing to interior\n"; - mRendering.removeWater(); // remove active CellStoreCollection::iterator active = mActiveCells.begin(); @@ -250,7 +249,6 @@ namespace MWWorld { int x = 0; int y = 0; - mRendering.removeWater(); mWorld->positionToIndex (position.pos[0], position.pos[1], x, y); From 3a1d7b7864145a00a05ec716e215b327928119a6 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 22 Jan 2012 19:24:35 -0500 Subject: [PATCH 011/586] Huge Water --- apps/openmw/mwrender/water.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/water.cpp b/apps/openmw/mwrender/water.cpp index 5cf6df99e..06ab53734 100644 --- a/apps/openmw/mwrender/water.cpp +++ b/apps/openmw/mwrender/water.cpp @@ -7,7 +7,6 @@ namespace MWRender { Ogre::CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false); } catch(...) { } - std::cout << "Water Constructor\n"; mTop = cell->water; @@ -16,7 +15,7 @@ namespace MWRender { mWaterPlane = Ogre::Plane(Ogre::Vector3::UNIT_Y, 0); - Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, CELL_SIZE*3 + 10000, CELL_SIZE * 3 + 10000, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); + Ogre::MeshManager::getSingleton().createPlane("water", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, mWaterPlane, CELL_SIZE*5, CELL_SIZE * 5, 10, 10, true, 1, 3,5, Ogre::Vector3::UNIT_Z); mWater = mSceneManager->createEntity("water"); From cd0df082df5c83cca1170651d7b74068e701d146 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Mon, 23 Jan 2012 17:19:54 +0000 Subject: [PATCH 012/586] Textures are now blended between cells and the texture blending functions are now more abstract --- apps/openmw/mwrender/terrain.cpp | 103 ++++++++++++++++++++++++---- apps/openmw/mwrender/terrain.hpp | 28 +++++++- components/esm_store/cell_store.hpp | 32 +++++---- 3 files changed, 133 insertions(+), 30 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 4d13b6889..90dc91731 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -46,15 +46,17 @@ namespace MWRender Ogre::Terrain::ImportData terrainData; terrainData.inputBias = 0; - terrainData.inputFloat = store->land->landData->heights; + terrainData.inputFloat = store->land[1][1]->landData->heights; std::map indexes; - initTerrainTextures(&terrainData, store, indexes); + initTerrainTextures(&terrainData, store, 0, 0, + ESM::Land::LAND_TEXTURE_SIZE, indexes); mTerrainGroup->defineTerrain(x, y, &terrainData); mTerrainGroup->loadTerrain(x, y, true); Ogre::Terrain* terrain = mTerrainGroup->getTerrain(x,y); - initTerrainBlendMaps(terrain, store, indexes); + initTerrainBlendMaps(terrain, store, 0, 0, + ESM::Land::LAND_TEXTURE_SIZE, indexes); } void TerrainManager::cellRemoved(MWWorld::Ptr::CellStore *store) @@ -65,20 +67,29 @@ namespace MWRender void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, + int fromX, int fromY, int size, std::map& indexes) { + assert(store != NULL && "store must be a valid pointer"); + assert(terrainData != NULL && "Must have valid terrain data"); + assert(fromX >= 0 && fromY >= 0 && + "Can't get a terrain texture on terrain outside the current cell"); + assert(fromX+size <= ESM::Land::LAND_TEXTURE_SIZE && + fromY+size <= ESM::Land::LAND_TEXTURE_SIZE && + "Can't get a terrain texture on terrain outside the current cell"); + //have a base texture for now, but this is probably not needed on most cells terrainData->layerList.resize(1); terrainData->layerList[0].worldSize = 256; terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); - const uint16_t* const textures = store->land->landData->textures; - for ( int y = 0; y < ESM::Land::LAND_TEXTURE_SIZE; y++ ) + for ( int y = fromY - 1; y < fromY + size + 1; y++ ) { - for ( int x = 0; x < ESM::Land::LAND_TEXTURE_SIZE; x++ ) + for ( int x = fromX - 1; x < fromX + size + 1; x++ ) { - const uint16_t ltexIndex = textures[y * ESM::Land::LAND_TEXTURE_SIZE + x]; + const uint16_t ltexIndex = getLtexIndexAt(store, x, y); + //this is the base texture, so we can ignore this at present if ( ltexIndex == 0 ) { continue; @@ -89,7 +100,7 @@ namespace MWRender if ( it == indexes.end() ) { //NB: All vtex ids are +1 compared to the ltex ids - assert((int)ltexIndex - 1 > 0 && + assert((int)ltexIndex >= 0 && store->landTextures->ltex.size() > (size_t)ltexIndex - 1 && "LAND.VTEX must be within the bounds of the LTEX array"); @@ -116,11 +127,23 @@ namespace MWRender void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, + int fromX, int fromY, int size, const std::map& indexes) { + assert(store != NULL && "store must be a valid pointer"); + assert(terrain != NULL && "Must have valid terrain"); + assert(fromX >= 0 && fromY >= 0 && + "Can't get a terrain texture on terrain outside the current cell"); + assert(fromX+size <= ESM::Land::LAND_TEXTURE_SIZE && + fromY+size <= ESM::Land::LAND_TEXTURE_SIZE && + "Can't get a terrain texture on terrain outside the current cell"); + + //size must be a power of 2 as we do divisions with a power of 2 number + //that need to result in an integer for correct splatting + assert( (size & (size - 1)) == 0 && "Size must be a power of 2"); + const int blendSize = terrain->getLayerBlendMapSize(); - const int blendDist = TERRAIN_SHADE_DISTANCE * - (blendSize / ESM::Land::LAND_TEXTURE_SIZE); + const int blendDist = TERRAIN_SHADE_DISTANCE * (blendSize / size); //zero out every map std::map::const_iterator iter; @@ -132,21 +155,24 @@ namespace MWRender } //covert the ltex data into a set of blend maps - const uint16_t* const textures = store->land->landData->textures; - for ( int texY = 0; texY < ESM::Land::LAND_TEXTURE_SIZE; texY++ ) + for ( int texY = fromY - 1; texY < fromY + size + 1; texY++ ) { - for ( int texX = 0; texX < ESM::Land::LAND_TEXTURE_SIZE; texX++ ) + for ( int texX = fromY - 1; texX < fromY + size + 1; texX++ ) { - const uint16_t ltexIndex = textures[texY * ESM::Land::LAND_TEXTURE_SIZE + texX]; + const uint16_t ltexIndex = getLtexIndexAt(store, texX, texY); + + //this is the ground texture, which is currently the base texture + //so don't alter the splatting map if ( ltexIndex == 0 ){ continue; } + const int layerIndex = indexes.find(ltexIndex)->second; float* const pBlend = terrain->getLayerBlendMap(layerIndex) ->getBlendPointer(); - const int splatSize = blendSize / ESM::Land::LAND_TEXTURE_SIZE; + const int splatSize = blendSize / size; //setup the bounds for the shading of this texture splat const int startX = std::max(0, texX*splatSize - blendDist); @@ -209,4 +235,51 @@ namespace MWRender } + + int TerrainManager::getLtexIndexAt(MWWorld::Ptr::CellStore* store, + int x, int y) + { + //check texture index falls within the 9 cell bounds + //as this function can't cope with anything above that + assert(x >= -ESM::Land::LAND_TEXTURE_SIZE && + y >= -ESM::Land::LAND_TEXTURE_SIZE && + "Trying to get land textures that are out of bounds"); + + assert(x < 2*ESM::Land::LAND_TEXTURE_SIZE && + y < 2*ESM::Land::LAND_TEXTURE_SIZE && + "Trying to get land textures that are out of bounds"); + + assert(store != NULL && "Store pointer must be valid"); + + //default center cell is indexed at (1,1) + int cellX = 1; + int cellY = 1; + + if ( x < 0 ) + { + cellX--; + x += ESM::Land::LAND_TEXTURE_SIZE; + } + else if ( x >= ESM::Land::LAND_TEXTURE_SIZE ) + { + cellX++; + x -= ESM::Land::LAND_TEXTURE_SIZE; + } + + if ( y < 0 ) + { + cellY--; + y += ESM::Land::LAND_TEXTURE_SIZE; + } + else if ( y >= ESM::Land::LAND_TEXTURE_SIZE ) + { + cellY++; + y -= ESM::Land::LAND_TEXTURE_SIZE; + } + + return store->land[cellX][cellY] + ->landData + ->textures[y * ESM::Land::LAND_TEXTURE_SIZE + x]; + } + } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 127c3f5f2..c64b741d5 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -35,23 +35,49 @@ namespace MWRender{ static const float TERRAIN_SHADE_DISTANCE = 0.5; /** - * Setups up the list of textures for the cell + * Setups up the list of textures for part of a cell, using indexes as + * an output to create a mapping of MW LtexIndex to the relevant terrain + * layer + * * @param terrainData the terrain data to setup the textures for + * @param store the cell store for the given terrain cell + * @param fromX the ltex index in the current cell to start making the texture from + * @param fromY the ltex index in the current cell to start making the texture from + * @param size the size (number of splats) to get * @param indexes a mapping of ltex index to the terrain texture layer that * can be used by initTerrainBlendMaps */ void initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, + int fromX, int fromY, int size, std::map& indexes); /** * Creates the blend (splatting maps) for the given terrain from the ltex data. + * * @param terrain the terrain object for the current cell + * @param store the cell store for the given terrain cell + * @param fromX the ltex index in the current cell to start making the texture from + * @param fromY the ltex index in the current cell to start making the texture from + * @param size the size (number of splats) to get * @param indexes the mapping of ltex to blend map produced by initTerrainTextures */ void initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, + int fromX, int fromY, int size, const std::map& indexes); + + /** + * Gets a LTEX index at the given point, assuming the current cell + * starts at (0,0). This supports getting values from the surrounding + * cells so negative x, y is acceptable + * + * @param store the cell store for the current cell + * @param x, y the splat position of the ltex index to get relative to the + * first splat of the current cell + */ + int getLtexIndexAt(MWWorld::Ptr::CellStore* store, int x, int y); + }; } diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index 5310237fe..951b0736a 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -96,8 +96,8 @@ namespace ESMS State_Unloaded, State_Preloaded, State_Loaded }; - CellStore (const ESM::Cell *cell_) : cell (cell_), mState (State_Unloaded), - land(NULL) {} + CellStore (const ESM::Cell *cell_) : cell (cell_), mState (State_Unloaded) + {} const ESM::Cell *cell; State mState; @@ -125,7 +125,7 @@ namespace ESMS CellRefList statics; CellRefList weapons; - const Land* land; + const Land* land[3][3]; const LTexList* landTextures; void load (const ESMStore &store, ESMReader &esm) @@ -141,7 +141,16 @@ namespace ESMS if ( ! (cell->data.flags & ESM::Cell::Interior) ) { - loadTerrain(cell->data.gridX, cell->data.gridY, store, esm); + for ( size_t x = 0; x < 3; x++ ) + { + for ( size_t y = 0; y < 3; y++ ) + { + land[x][y] = loadTerrain(cell->data.gridX + x - 1, + cell->data.gridY + y - 1, + store, + esm); + } + } landTextures = &store.landTexts; } @@ -190,7 +199,7 @@ namespace ESMS private: - void loadTerrain(int X, int Y, const ESMStore &store, ESMReader &esm) + Land* loadTerrain(int X, int Y, const ESMStore &store, ESMReader &esm) { // load terrain Land *land = store.lands.search(X, Y); @@ -199,18 +208,13 @@ namespace ESMS land->loadData(esm); } - this->land = land; + return land; } void unloadTerrain(int X, int Y, const ESMStore &store) { - Land *land = store.lands.search(X,Y); - // unload terrain - if (land != NULL) - { - land->unloadData(); - } - - this->land = NULL; + assert (false && + "This function is not implemented due to the fact that we now store overlapping land blocks so" && + "we cannot be sure that the land segment is not being used by another CellStore"); } template From 5e3e6f916562ddeb8a7e3928551a0a810718e232 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Tue, 24 Jan 2012 13:29:31 +0000 Subject: [PATCH 013/586] Fixed some minor bugs, a cells terrain can now be rendered as 4 Ogre::Terrain objects, possibly giving a speed increase --- apps/openmw/mwrender/terrain.cpp | 184 +++++++++++++++++++++++++------ apps/openmw/mwrender/terrain.hpp | 30 +++++ 2 files changed, 179 insertions(+), 35 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 90dc91731..70ecdee73 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "terrain.hpp" @@ -7,64 +8,167 @@ namespace MWRender { + + //---------------------------------------------------------------------------------------------- + TerrainManager::TerrainManager(Ogre::SceneManager* mgr) { mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions(); mTerrainGlobals->setMaxPixelError(8); + mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 1024 : 256); + + Ogre::TerrainMaterialGenerator::Profile* const activeProfile = + mTerrainGlobals->getDefaultMaterialGenerator() + ->getActiveProfile(); + Ogre::TerrainMaterialGeneratorA::SM2Profile* matProfile = + static_cast(activeProfile); + + matProfile->setLightmapEnabled(false); + matProfile->setReceiveDynamicShadowsEnabled(false); + + mLandSize = ESM::Land::LAND_SIZE; + mRealSize = ESM::Land::REAL_SIZE; + if ( SPLIT_TERRAIN ) + { + mLandSize = (mLandSize - 1)/2 + 1; + mRealSize /= 2; + } mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, - Ogre::Terrain::ALIGN_X_Z, ESM::Land::LAND_SIZE, - ESM::Land::REAL_SIZE); + Ogre::Terrain::ALIGN_X_Z, + mLandSize, + mRealSize); - mTerrainGroup->setOrigin(Ogre::Vector3(ESM::Land::REAL_SIZE/2, - 0, - -ESM::Land::REAL_SIZE/2)); + mTerrainGroup->setOrigin(Ogre::Vector3(mRealSize/2, + 0, + -mRealSize/2)); - Ogre::Terrain::ImportData importSettings = + Ogre::Terrain::ImportData& importSettings = mTerrainGroup->getDefaultImportSettings(); - importSettings.terrainSize = ESM::Land::LAND_SIZE; - importSettings.worldSize = ESM::Land::REAL_SIZE; + importSettings.inputBias = 0; + importSettings.terrainSize = mLandSize; + importSettings.worldSize = mRealSize; importSettings.minBatchSize = 9; - importSettings.maxBatchSize = 33; + importSettings.maxBatchSize = mLandSize; - importSettings.deleteInputData = false; + importSettings.deleteInputData = true; } + //---------------------------------------------------------------------------------------------- + TerrainManager::~TerrainManager() { OGRE_DELETE mTerrainGroup; OGRE_DELETE mTerrainGlobals; } + //---------------------------------------------------------------------------------------------- + void TerrainManager::cellAdded(MWWorld::Ptr::CellStore *store) { - int x = store->cell->getGridX(); - int y = store->cell->getGridY(); + const int cellX = store->cell->getGridX(); + const int cellY = store->cell->getGridY(); + + Ogre::Terrain::ImportData terrainData = + mTerrainGroup->getDefaultImportSettings(); + + if ( SPLIT_TERRAIN ) + { + //split the cell terrain into four segments + const int numTextures = ESM::Land::LAND_TEXTURE_SIZE/2; + + for ( int x = 0; x < 2; x++ ) + { + for ( int y = 0; y < 2; y++ ) + { + const int terrainX = cellX * 2 + x; + const int terrainY = cellY * 2 + y; + + terrainData.inputFloat = OGRE_ALLOC_T(float, + mLandSize*mLandSize, + Ogre::MEMCATEGORY_GEOMETRY); + + //copy the height data row by row + for ( int terrainCopyY = 0; terrainCopyY < mLandSize; terrainCopyY++ ) + { + //the offset of the current segment + const size_t yOffset = y * (mLandSize-1) * ESM::Land::LAND_SIZE + + //offset of the row + terrainCopyY * ESM::Land::LAND_SIZE; + const size_t xOffset = x * (mLandSize-1); + + memcpy(&terrainData.inputFloat[terrainCopyY*mLandSize], + &store->land[1][1]->landData->heights[yOffset + xOffset], + mLandSize*sizeof(float)); + } + + std::map indexes; + initTerrainTextures(&terrainData, store, + x * numTextures, y * numTextures, + numTextures, indexes); + + mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); + + mTerrainGroup->loadTerrain(terrainX, terrainY, true); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); + initTerrainBlendMaps(terrain, store, + x * numTextures, y * numTextures, + numTextures, indexes); + + } + } + } + else + { + //one cell is one terrain segment + terrainData.inputFloat = OGRE_ALLOC_T(float, + mLandSize*mLandSize, + Ogre::MEMCATEGORY_GEOMETRY); - Ogre::Terrain::ImportData terrainData; + memcpy(&terrainData.inputFloat[0], + &store->land[1][1]->landData->heights[0], + mLandSize*mLandSize*sizeof(float)); - terrainData.inputBias = 0; - terrainData.inputFloat = store->land[1][1]->landData->heights; + std::map indexes; + initTerrainTextures(&terrainData, store, 0, 0, + ESM::Land::LAND_TEXTURE_SIZE, indexes); - std::map indexes; - initTerrainTextures(&terrainData, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, indexes); - mTerrainGroup->defineTerrain(x, y, &terrainData); + mTerrainGroup->defineTerrain(cellX, cellY, &terrainData); + + mTerrainGroup->loadTerrain(cellX, cellY, true); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(cellX, cellY); + initTerrainBlendMaps(terrain, store, 0, 0, + ESM::Land::LAND_TEXTURE_SIZE, indexes); + } - mTerrainGroup->loadTerrain(x, y, true); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(x,y); - initTerrainBlendMaps(terrain, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, indexes); } + //---------------------------------------------------------------------------------------------- + void TerrainManager::cellRemoved(MWWorld::Ptr::CellStore *store) { - mTerrainGroup->removeTerrain(store->cell->getGridX(), - store->cell->getGridY()); + if ( SPLIT_TERRAIN ) + { + for ( int x = 0; x < 2; x++ ) + { + for ( int y = 0; y < 2; y++ ) + { + mTerrainGroup->removeTerrain(store->cell->getGridX() * 2 + x, + store->cell->getGridY() * 2 + y); + } + } + } + else + { + mTerrainGroup->removeTerrain(store->cell->getGridX(), + store->cell->getGridY()); + } } + //---------------------------------------------------------------------------------------------- + void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, @@ -122,9 +226,10 @@ namespace MWRender } } } - } + //---------------------------------------------------------------------------------------------- + void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, @@ -157,16 +262,24 @@ namespace MWRender //covert the ltex data into a set of blend maps for ( int texY = fromY - 1; texY < fromY + size + 1; texY++ ) { - for ( int texX = fromY - 1; texX < fromY + size + 1; texX++ ) + for ( int texX = fromX - 1; texX < fromX + size + 1; texX++ ) { const uint16_t ltexIndex = getLtexIndexAt(store, texX, texY); + //whilte texX is the splat index relative to the entire cell, + //relX is relative to the current segment we are splatting + const int relX = texX - fromX; + const int relY = texY - fromY; + //this is the ground texture, which is currently the base texture //so don't alter the splatting map if ( ltexIndex == 0 ){ continue; } + assert (indexes.find(ltexIndex) != indexes.end() && + "Texture layer must exist"); + const int layerIndex = indexes.find(ltexIndex)->second; float* const pBlend = terrain->getLayerBlendMap(layerIndex) @@ -175,11 +288,11 @@ namespace MWRender const int splatSize = blendSize / size; //setup the bounds for the shading of this texture splat - const int startX = std::max(0, texX*splatSize - blendDist); - const int endX = std::min(blendSize, (texX+1)*splatSize + blendDist); + const int startX = std::max(0, relX*splatSize - blendDist); + const int endX = std::min(blendSize, (relX+1)*splatSize + blendDist); - const int startY = std::max(0, texY*splatSize - blendDist); - const int endY = std::min(blendSize, (texY+1)*splatSize + blendDist); + const int startY = std::max(0, relY*splatSize - blendDist); + const int endY = std::min(blendSize, (relY+1)*splatSize + blendDist); for ( int blendX = startX; blendX < endX; blendX++ ) { @@ -193,16 +306,16 @@ namespace MWRender //calculate the distance from the edge of the square // to the point we are shading - int distX = texX*splatSize - blendX; + int distX = relX*splatSize - blendX; if ( distX < 0 ) { - distX = std::max(0, blendX - (texX+1)*splatSize); + distX = std::max(0, blendX - (relX+1)*splatSize); } - int distY = texY*splatSize - blendY; + int distY = relY*splatSize - blendY; if ( distY < 0 ) { - distY = std::max(0, blendY - (texY+1)*splatSize); + distY = std::max(0, blendY - (relY+1)*splatSize); } float blendAmount = blendDist - std::sqrt((float)distX*distX + distY*distY); @@ -235,6 +348,7 @@ namespace MWRender } + //---------------------------------------------------------------------------------------------- int TerrainManager::getLtexIndexAt(MWWorld::Ptr::CellStore* store, int x, int y) diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index c64b741d5..195741b0f 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -16,6 +16,15 @@ namespace MWRender{ /** * Implements the Morrowind terrain using the Ogre Terrain Component + * + * This currently has two options as to how the terrain is rendered, one + * is that one cell is rendered as one Ogre::Terrain and the other that + * it is rendered as 4 Ogre::Terrain segments + * + * Splitting it up into segments has the following advantages + * * Seems to be faster + * * Terrain can now be culled more aggressivly using view frustram culling + * * We don't hit splat limits as much */ class TerrainManager{ public: @@ -28,6 +37,27 @@ namespace MWRender{ Ogre::TerrainGlobalOptions* mTerrainGlobals; Ogre::TerrainGroup* mTerrainGroup; + /** + * Should each cell be split into a further four Ogre::Terrain objects + * + * This has the advantage that it is possible to cull more terrain and + * we are more likly to be able to be able to fit all the required splats + * in (Ogre's default material generator only works with about 6 textures) + */ + static const bool SPLIT_TERRAIN = true; + + /** + * The length in verticies of a single terrain block. + * This takes into account the SPLIT_TERRAIN option + */ + int mLandSize; + + /** + * The length in game units of a single terrain block. + * This takes into account the SPLIT_TERRAIN option + */ + int mRealSize; + /** * The distance that the current cell should be shaded into the neighbouring * texture. The distance is in terms of the splat size of a texture From 9cc3af34e5dc8ebd8b90cee9a3e1bd3da48321b0 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Tue, 7 Feb 2012 12:41:08 +0000 Subject: [PATCH 014/586] Removed composite maps, fixes to texture sizes and unloading --- apps/openmw/mwrender/terrain.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 70ecdee73..a468a4406 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -16,7 +16,20 @@ namespace MWRender mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions(); mTerrainGlobals->setMaxPixelError(8); - mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 1024 : 256); + mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setLightMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setCompositeMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setDefaultGlobalColourMapSize(256); + + //10 (default) didn't seem to be quite enough + mTerrainGlobals->setSkirtSize(32); + + /* + * Here we are pushing the composite map distance beyond the edge + * of the rendered terrain due to light issues (the lighting differs + * so much that it is very noticable + */ + mTerrainGlobals->setCompositeMapDistance(ESM::Land::REAL_SIZE*4); Ogre::TerrainMaterialGenerator::Profile* const activeProfile = mTerrainGlobals->getDefaultMaterialGenerator() @@ -27,6 +40,7 @@ namespace MWRender matProfile->setLightmapEnabled(false); matProfile->setReceiveDynamicShadowsEnabled(false); + //scale the land size if required mLandSize = ESM::Land::LAND_SIZE; mRealSize = ESM::Land::REAL_SIZE; if ( SPLIT_TERRAIN ) @@ -109,6 +123,8 @@ namespace MWRender x * numTextures, y * numTextures, numTextures, indexes); + assert( mTerrainGroup->getTerrain(cellX, cellY) == NULL && + "The terrain for this cell already existed" ); mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); mTerrainGroup->loadTerrain(terrainX, terrainY, true); @@ -143,6 +159,7 @@ namespace MWRender ESM::Land::LAND_TEXTURE_SIZE, indexes); } + mTerrainGroup->freeTemporaryResources(); } //---------------------------------------------------------------------------------------------- @@ -155,14 +172,14 @@ namespace MWRender { for ( int y = 0; y < 2; y++ ) { - mTerrainGroup->removeTerrain(store->cell->getGridX() * 2 + x, + mTerrainGroup->unloadTerrain(store->cell->getGridX() * 2 + x, store->cell->getGridY() * 2 + y); } } } else { - mTerrainGroup->removeTerrain(store->cell->getGridX(), + mTerrainGroup->unloadTerrain(store->cell->getGridX(), store->cell->getGridY()); } } From 286701e3a5ace50f60d60e0f8dcd9078b043f893 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Sat, 11 Feb 2012 20:54:29 +0000 Subject: [PATCH 015/586] Removed the flawed shading, updated textures, removed the need for a unused base texture --- apps/openmw/mwrender/terrain.cpp | 146 +++++++++++++++++++------------ apps/openmw/mwrender/terrain.hpp | 13 ++- 2 files changed, 104 insertions(+), 55 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index a468a4406..710a3ad05 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -22,12 +22,11 @@ namespace MWRender mTerrainGlobals->setDefaultGlobalColourMapSize(256); //10 (default) didn't seem to be quite enough - mTerrainGlobals->setSkirtSize(32); + mTerrainGlobals->setSkirtSize(128); /* * Here we are pushing the composite map distance beyond the edge - * of the rendered terrain due to light issues (the lighting differs - * so much that it is very noticable + * of the rendered terrain due to not having setup lighting */ mTerrainGlobals->setCompositeMapDistance(ESM::Land::REAL_SIZE*4); @@ -38,6 +37,10 @@ namespace MWRender static_cast(activeProfile); matProfile->setLightmapEnabled(false); + matProfile->setLayerSpecularMappingEnabled(false); + + matProfile->setLayerParallaxMappingEnabled(false); + matProfile->setReceiveDynamicShadowsEnabled(false); //scale the land size if required @@ -85,8 +88,6 @@ namespace MWRender const int cellX = store->cell->getGridX(); const int cellY = store->cell->getGridY(); - Ogre::Terrain::ImportData terrainData = - mTerrainGroup->getDefaultImportSettings(); if ( SPLIT_TERRAIN ) { @@ -97,6 +98,9 @@ namespace MWRender { for ( int y = 0; y < 2; y++ ) { + Ogre::Terrain::ImportData terrainData = + mTerrainGroup->getDefaultImportSettings(); + const int terrainX = cellX * 2 + x; const int terrainY = cellY * 2 + y; @@ -138,6 +142,9 @@ namespace MWRender } else { + Ogre::Terrain::ImportData terrainData = + mTerrainGroup->getDefaultImportSettings(); + //one cell is one terrain segment terrainData.inputFloat = OGRE_ALLOC_T(float, mLandSize*mLandSize, @@ -199,19 +206,17 @@ namespace MWRender fromY+size <= ESM::Land::LAND_TEXTURE_SIZE && "Can't get a terrain texture on terrain outside the current cell"); - //have a base texture for now, but this is probably not needed on most cells - terrainData->layerList.resize(1); - terrainData->layerList[0].worldSize = 256; - terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); - terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); - + //there is one texture that we want to use as a base (i.e. it won't have + //a blend map). This holds the ltex index of that base texture so that + //we know not to include it in the output map + int baseTexture = -1; for ( int y = fromY - 1; y < fromY + size + 1; y++ ) { for ( int x = fromX - 1; x < fromX + size + 1; x++ ) { const uint16_t ltexIndex = getLtexIndexAt(store, x, y); //this is the base texture, so we can ignore this at present - if ( ltexIndex == 0 ) + if ( ltexIndex == baseTexture ) { continue; } @@ -225,21 +230,35 @@ namespace MWRender store->landTextures->ltex.size() > (size_t)ltexIndex - 1 && "LAND.VTEX must be within the bounds of the LTEX array"); - std::string texture = store->landTextures->ltex[ltexIndex-1].texture; - //TODO this is needed due to MWs messed up texture handling - texture = texture.substr(0, texture.rfind(".")) + ".dds"; + std::string texture; + if ( ltexIndex == 0 ) + { + texture = "_land_default.dds"; + } + else + { + texture = store->landTextures->ltex[ltexIndex-1].texture; + //TODO this is needed due to MWs messed up texture handling + texture = texture.substr(0, texture.rfind(".")) + ".dds"; + } const size_t position = terrainData->layerList.size(); terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); - terrainData->layerList[position].worldSize = 256; - terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + Ogre::TexturePtr normDisp = getNormalDisp("textures\\" + texture); - //Normal map. This should be removed but it would require alterations to - //the material generator. Another option would be to use a 1x1 blank texture + terrainData->layerList[position].worldSize = 256; terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + terrainData->layerList[position].textureNames.push_back(normDisp->getName()); - indexes[ltexIndex] = position; + if ( baseTexture == -1 ) + { + baseTexture = ltexIndex; + } + else + { + indexes[ltexIndex] = position; + } } } } @@ -271,9 +290,9 @@ namespace MWRender std::map::const_iterator iter; for ( iter = indexes.begin(); iter != indexes.end(); ++iter ) { - float* pBlend = terrain->getLayerBlendMap(iter->second) - ->getBlendPointer(); - memset(pBlend, 0, sizeof(float) * blendSize * blendSize); + float* pBlend = terrain->getLayerBlendMap(iter->second) + ->getBlendPointer(); + memset(pBlend, 0, sizeof(float) * blendSize * blendSize); } //covert the ltex data into a set of blend maps @@ -288,15 +307,13 @@ namespace MWRender const int relX = texX - fromX; const int relY = texY - fromY; - //this is the ground texture, which is currently the base texture - //so don't alter the splatting map - if ( ltexIndex == 0 ){ + //check if it is the base texture (which isn't in the map) and + //if it is don't bother altering the blend map for it + if ( indexes.find(ltexIndex) == indexes.end() ) + { continue; } - assert (indexes.find(ltexIndex) != indexes.end() && - "Texture layer must exist"); - const int layerIndex = indexes.find(ltexIndex)->second; float* const pBlend = terrain->getLayerBlendMap(layerIndex) @@ -310,7 +327,7 @@ namespace MWRender const int startY = std::max(0, relY*splatSize - blendDist); const int endY = std::min(blendSize, (relY+1)*splatSize + blendDist); - + for ( int blendX = startX; blendX < endX; blendX++ ) { for ( int blendY = startY; blendY < endY; blendY++ ) @@ -321,34 +338,16 @@ namespace MWRender assert(blendY >= 0 && blendY < blendSize && "index must be within texture bounds"); - //calculate the distance from the edge of the square - // to the point we are shading - int distX = relX*splatSize - blendX; - if ( distX < 0 ) + const int index = blendSize*(blendSize - 1 - blendY) + blendX; + if ( blendX >= relX*splatSize && blendX < (relX+1)*splatSize && + blendY >= relY*splatSize && blendY < (relY+1)*splatSize ) { - distX = std::max(0, blendX - (relX+1)*splatSize); + pBlend[index] = 1; } - - int distY = relY*splatSize - blendY; - if ( distY < 0 ) + else { - distY = std::max(0, blendY - (relY+1)*splatSize); + pBlend[index] = std::max((float)pBlend[index], 0.5f); } - - float blendAmount = blendDist - std::sqrt((float)distX*distX + distY*distY); - blendAmount /= blendDist; - - //this is required as blendDist < sqrt(blendDist*blendDist + blendDist*blendDist) - //this means that the corners are slightly the "wrong" shape but totaly smooth - //shading for the edges - blendAmount = std::max( (float) 0.0, blendAmount); - - assert(blendAmount >= 0 && "Blend should never be negative"); - - //flips the y - const int index = blendSize*(blendSize - 1 - blendY) + blendX; - pBlend[index] += blendAmount; - pBlend[index] = std::min((float)1, pBlend[index]); } } @@ -413,4 +412,43 @@ namespace MWRender ->textures[y * ESM::Land::LAND_TEXTURE_SIZE + x]; } + //---------------------------------------------------------------------------------------------- + + Ogre::TexturePtr TerrainManager::getNormalDisp(const std::string& fileName) + { + Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); + const std::string normalTextureName = fileName.substr(0, fileName.rfind(".")) + + "_n.dds"; + if ( !texMgr->getByName(normalTextureName).isNull() ) + { + return texMgr->getByName(normalTextureName); + } + + const std::string textureName = "default_terrain_normal"; + if ( !texMgr->getByName(textureName).isNull() ) + { + return texMgr->getByName(textureName); + } + + Ogre::TexturePtr tex = texMgr->createManual( + textureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + Ogre::TEX_TYPE_2D, 1, 1, 0, Ogre::PF_BYTE_BGRA); + + Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); + + pixelBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL); + const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); + + Ogre::uint8* pDest = static_cast(pixelBox.data); + + *pDest++ = 128; // B + *pDest++ = 128; // G + *pDest++ = 128; // R + *pDest++ = 0; // A + + pixelBuffer->unlock(); + + return tex; + } + } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 195741b0f..548d00eab 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -62,7 +62,7 @@ namespace MWRender{ * The distance that the current cell should be shaded into the neighbouring * texture. The distance is in terms of the splat size of a texture */ - static const float TERRAIN_SHADE_DISTANCE = 0.5; + static const float TERRAIN_SHADE_DISTANCE = 0.25f; /** * Setups up the list of textures for part of a cell, using indexes as @@ -107,6 +107,17 @@ namespace MWRender{ * first splat of the current cell */ int getLtexIndexAt(MWWorld::Ptr::CellStore* store, int x, int y); + + /** + * Retrives the texture that is the normal and parallax map for the + * terrain. If it doesn't exist a blank texture is used + * + * The file name of the texture should be the same as the file name of + * the base diffuse texture, but with _n appended before the extension + * + * @param fileName the name of the *diffuse* texture + */ + Ogre::TexturePtr getNormalDisp(const std::string& fileName); }; From f34b2c73c5f81f15a02ee9a4fe878ff005ff4e37 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Feb 2012 19:44:52 +0100 Subject: [PATCH 016/586] committing the terrain material generator from ogre 1.7.4, it seems to be almost impossible to make a derived class of TerrainMaterialGeneratorA because of the many classes it contains and the inter-relationships between them; just adding the whole source makes it a lot easier to modify if we decide to update this source from OGRE upstream at any point (which seems unlikely), we can take the diff from this commit on to see the changes we did to the material generator --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwrender/terrain.cpp | 18 +- apps/openmw/mwrender/terrainmaterial.cpp | 1656 ++++++++++++++++++++++ apps/openmw/mwrender/terrainmaterial.hpp | 261 ++++ 4 files changed, 1932 insertions(+), 5 deletions(-) create mode 100644 apps/openmw/mwrender/terrainmaterial.cpp create mode 100644 apps/openmw/mwrender/terrainmaterial.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 663a10787..8ee865a0b 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging sky terrain player npcs creatures objects renderinginterface + renderingmanager debugging sky terrain terrainmaterial player npcs creatures objects renderinginterface ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 70ecdee73..568ed3741 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -1,11 +1,13 @@ #include #include -#include +#include "terrainmaterial.hpp" #include "terrain.hpp" #include "components/esm/loadland.hpp" +using namespace Ogre; + namespace MWRender { @@ -18,15 +20,23 @@ namespace MWRender mTerrainGlobals->setMaxPixelError(8); mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 1024 : 256); + Ogre::TerrainMaterialGeneratorPtr matGen; + TerrainMaterialGeneratorB* matGenP = new TerrainMaterialGeneratorB(); + matGen.bind(matGenP); + mTerrainGlobals->setDefaultMaterialGenerator(matGen); + Ogre::TerrainMaterialGenerator::Profile* const activeProfile = mTerrainGlobals->getDefaultMaterialGenerator() ->getActiveProfile(); - Ogre::TerrainMaterialGeneratorA::SM2Profile* matProfile = - static_cast(activeProfile); + TerrainMaterialGeneratorB::SM2Profile* matProfile = + static_cast(activeProfile); matProfile->setLightmapEnabled(false); matProfile->setReceiveDynamicShadowsEnabled(false); - + matProfile->setLayerNormalMappingEnabled(false); + //matProfile->setLayerParallaxMappingEnabled(false); + matProfile->setLayerSpecularMappingEnabled(false); + mLandSize = ESM::Land::LAND_SIZE; mRealSize = ESM::Land::REAL_SIZE; if ( SPLIT_TERRAIN ) diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp new file mode 100644 index 000000000..313a4a90c --- /dev/null +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -0,0 +1,1656 @@ +/* +----------------------------------------------------------------------------- +This source file is part of OGRE +(Object-oriented Graphics Rendering Engine) +For the latest info, see http://www.ogre3d.org/ + +Copyright (c) 2000-2011 Torus Knot Software Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +----------------------------------------------------------------------------- +*/ +#include "terrainmaterial.hpp" +#include "OgreTerrain.h" +#include "OgreMaterialManager.h" +#include "OgreTechnique.h" +#include "OgrePass.h" +#include "OgreTextureUnitState.h" +#include "OgreGpuProgramManager.h" +#include "OgreHighLevelGpuProgramManager.h" +#include "OgreHardwarePixelBuffer.h" +#include "OgreShadowCameraSetupPSSM.h" + +namespace Ogre +{ + //--------------------------------------------------------------------- + TerrainMaterialGeneratorB::TerrainMaterialGeneratorB() + { + // define the layers + // We expect terrain textures to have no alpha, so we use the alpha channel + // in the albedo texture to store specular reflection + // similarly we double-up the normal and height (for parallax) + mLayerDecl.samplers.push_back(TerrainLayerSampler("albedo_specular", PF_BYTE_RGBA)); + mLayerDecl.samplers.push_back(TerrainLayerSampler("normal_height", PF_BYTE_RGBA)); + + mLayerDecl.elements.push_back( + TerrainLayerSamplerElement(0, TLSS_ALBEDO, 0, 3)); + mLayerDecl.elements.push_back( + TerrainLayerSamplerElement(0, TLSS_SPECULAR, 3, 1)); + mLayerDecl.elements.push_back( + TerrainLayerSamplerElement(1, TLSS_NORMAL, 0, 3)); + mLayerDecl.elements.push_back( + TerrainLayerSamplerElement(1, TLSS_HEIGHT, 3, 1)); + + + mProfiles.push_back(OGRE_NEW SM2Profile(this, "SM2", "Profile for rendering on Shader Model 2 capable cards")); + // TODO - check hardware capabilities & use fallbacks if required (more profiles needed) + setActiveProfile("SM2"); + + } + //--------------------------------------------------------------------- + TerrainMaterialGeneratorB::~TerrainMaterialGeneratorB() + { + + } + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + TerrainMaterialGeneratorB::SM2Profile::SM2Profile(TerrainMaterialGenerator* parent, const String& name, const String& desc) + : Profile(parent, name, desc) + , mShaderGen(0) + , mLayerNormalMappingEnabled(true) + , mLayerParallaxMappingEnabled(true) + , mLayerSpecularMappingEnabled(true) + , mGlobalColourMapEnabled(true) + , mLightmapEnabled(true) + , mCompositeMapEnabled(true) + , mReceiveDynamicShadows(true) + , mPSSM(0) + , mDepthShadows(false) + , mLowLodShadows(false) + { + + } + //--------------------------------------------------------------------- + TerrainMaterialGeneratorB::SM2Profile::~SM2Profile() + { + OGRE_DELETE mShaderGen; + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::requestOptions(Terrain* terrain) + { + terrain->_setMorphRequired(true); + terrain->_setNormalMapRequired(true); + terrain->_setLightMapRequired(mLightmapEnabled, true); + terrain->_setCompositeMapRequired(mCompositeMapEnabled); + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setLayerNormalMappingEnabled(bool enabled) + { + if (enabled != mLayerNormalMappingEnabled) + { + mLayerNormalMappingEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setLayerParallaxMappingEnabled(bool enabled) + { + if (enabled != mLayerParallaxMappingEnabled) + { + mLayerParallaxMappingEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setLayerSpecularMappingEnabled(bool enabled) + { + if (enabled != mLayerSpecularMappingEnabled) + { + mLayerSpecularMappingEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setGlobalColourMapEnabled(bool enabled) + { + if (enabled != mGlobalColourMapEnabled) + { + mGlobalColourMapEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setLightmapEnabled(bool enabled) + { + if (enabled != mLightmapEnabled) + { + mLightmapEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setCompositeMapEnabled(bool enabled) + { + if (enabled != mCompositeMapEnabled) + { + mCompositeMapEnabled = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setReceiveDynamicShadowsEnabled(bool enabled) + { + if (enabled != mReceiveDynamicShadows) + { + mReceiveDynamicShadows = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setReceiveDynamicShadowsPSSM(PSSMShadowCameraSetup* pssmSettings) + { + if (pssmSettings != mPSSM) + { + mPSSM = pssmSettings; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setReceiveDynamicShadowsDepth(bool enabled) + { + if (enabled != mDepthShadows) + { + mDepthShadows = enabled; + mParent->_markChanged(); + } + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::setReceiveDynamicShadowsLowLod(bool enabled) + { + if (enabled != mLowLodShadows) + { + mLowLodShadows = enabled; + mParent->_markChanged(); + } + } + //--------------------------------------------------------------------- + uint8 TerrainMaterialGeneratorB::SM2Profile::getMaxLayers(const Terrain* terrain) const + { + // count the texture units free + uint8 freeTextureUnits = 16; + // lightmap + --freeTextureUnits; + // normalmap + --freeTextureUnits; + // colourmap + if (terrain->getGlobalColourMapEnabled()) + --freeTextureUnits; + if (isShadowingEnabled(HIGH_LOD, terrain)) + { + uint numShadowTextures = 1; + if (getReceiveDynamicShadowsPSSM()) + { + numShadowTextures = getReceiveDynamicShadowsPSSM()->getSplitCount(); + } + freeTextureUnits -= numShadowTextures; + } + + // each layer needs 2.25 units (1xdiffusespec, 1xnormalheight, 0.25xblend) + return static_cast(freeTextureUnits / 2.25f); + + + } + //--------------------------------------------------------------------- + MaterialPtr TerrainMaterialGeneratorB::SM2Profile::generate(const Terrain* terrain) + { + // re-use old material if exists + MaterialPtr mat = terrain->_getMaterial(); + if (mat.isNull()) + { + MaterialManager& matMgr = MaterialManager::getSingleton(); + + // it's important that the names are deterministic for a given terrain, so + // use the terrain pointer as an ID + const String& matName = terrain->getMaterialName(); + mat = matMgr.getByName(matName); + if (mat.isNull()) + { + mat = matMgr.create(matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + } + } + // clear everything + mat->removeAllTechniques(); + + // Automatically disable normal & parallax mapping if card cannot handle it + // We do this rather than having a specific technique for it since it's simpler + GpuProgramManager& gmgr = GpuProgramManager::getSingleton(); + if (!gmgr.isSyntaxSupported("ps_3_0") && !gmgr.isSyntaxSupported("ps_2_x") + && !gmgr.isSyntaxSupported("fp40") && !gmgr.isSyntaxSupported("arbfp1")) + { + setLayerNormalMappingEnabled(false); + setLayerParallaxMappingEnabled(false); + } + + addTechnique(mat, terrain, HIGH_LOD); + + // LOD + if(mCompositeMapEnabled) + { + addTechnique(mat, terrain, LOW_LOD); + Material::LodValueList lodValues; + lodValues.push_back(TerrainGlobalOptions::getSingleton().getCompositeMapDistance()); + mat->setLodLevels(lodValues); + Technique* lowLodTechnique = mat->getTechnique(1); + lowLodTechnique->setLodIndex(1); + } + + updateParams(mat, terrain); + + return mat; + + } + //--------------------------------------------------------------------- + MaterialPtr TerrainMaterialGeneratorB::SM2Profile::generateForCompositeMap(const Terrain* terrain) + { + // re-use old material if exists + MaterialPtr mat = terrain->_getCompositeMapMaterial(); + if (mat.isNull()) + { + MaterialManager& matMgr = MaterialManager::getSingleton(); + + // it's important that the names are deterministic for a given terrain, so + // use the terrain pointer as an ID + const String& matName = terrain->getMaterialName() + "/comp"; + mat = matMgr.getByName(matName); + if (mat.isNull()) + { + mat = matMgr.create(matName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + } + } + // clear everything + mat->removeAllTechniques(); + + addTechnique(mat, terrain, RENDER_COMPOSITE_MAP); + + updateParamsForCompositeMap(mat, terrain); + + return mat; + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::addTechnique( + const MaterialPtr& mat, const Terrain* terrain, TechniqueType tt) + { + + Technique* tech = mat->createTechnique(); + + // Only supporting one pass + Pass* pass = tech->createPass(); + + GpuProgramManager& gmgr = GpuProgramManager::getSingleton(); + HighLevelGpuProgramManager& hmgr = HighLevelGpuProgramManager::getSingleton(); + if (!mShaderGen) + { + bool check2x = mLayerNormalMappingEnabled || mLayerParallaxMappingEnabled; + if (hmgr.isLanguageSupported("cg")) + mShaderGen = OGRE_NEW ShaderHelperCg(); + else if (hmgr.isLanguageSupported("hlsl") && + ((check2x && gmgr.isSyntaxSupported("ps_2_x")) || + (!check2x && gmgr.isSyntaxSupported("ps_2_0")))) + mShaderGen = OGRE_NEW ShaderHelperHLSL(); + else if (hmgr.isLanguageSupported("glsl")) + mShaderGen = OGRE_NEW ShaderHelperGLSL(); + else + { + // todo + } + + // check SM3 features + mSM3Available = GpuProgramManager::getSingleton().isSyntaxSupported("ps_3_0"); + + } + HighLevelGpuProgramPtr vprog = mShaderGen->generateVertexProgram(this, terrain, tt); + HighLevelGpuProgramPtr fprog = mShaderGen->generateFragmentProgram(this, terrain, tt); + + pass->setVertexProgram(vprog->getName()); + pass->setFragmentProgram(fprog->getName()); + + if (tt == HIGH_LOD || tt == RENDER_COMPOSITE_MAP) + { + // global normal map + TextureUnitState* tu = pass->createTextureUnitState(); + tu->setTextureName(terrain->getTerrainNormalMap()->getName()); + tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); + + // global colour map + if (terrain->getGlobalColourMapEnabled() && isGlobalColourMapEnabled()) + { + tu = pass->createTextureUnitState(terrain->getGlobalColourMap()->getName()); + tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); + } + + // light map + if (isLightmapEnabled()) + { + tu = pass->createTextureUnitState(terrain->getLightmap()->getName()); + tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); + } + + // blend maps + uint maxLayers = getMaxLayers(terrain); + uint numBlendTextures = std::min(terrain->getBlendTextureCount(maxLayers), terrain->getBlendTextureCount()); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + for (uint i = 0; i < numBlendTextures; ++i) + { + tu = pass->createTextureUnitState(terrain->getBlendTextureName(i)); + tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); + } + + // layer textures + for (uint i = 0; i < numLayers; ++i) + { + // diffuse / specular + tu = pass->createTextureUnitState(terrain->getLayerTextureName(i, 0)); + // normal / height + tu = pass->createTextureUnitState(terrain->getLayerTextureName(i, 1)); + } + + } + else + { + // LOW_LOD textures + // composite map + TextureUnitState* tu = pass->createTextureUnitState(); + tu->setTextureName(terrain->getCompositeMap()->getName()); + tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); + + // That's it! + + } + + // Add shadow textures (always at the end) + if (isShadowingEnabled(tt, terrain)) + { + uint numTextures = 1; + if (getReceiveDynamicShadowsPSSM()) + { + numTextures = getReceiveDynamicShadowsPSSM()->getSplitCount(); + } + for (uint i = 0; i < numTextures; ++i) + { + TextureUnitState* tu = pass->createTextureUnitState(); + tu->setContentType(TextureUnitState::CONTENT_SHADOW); + tu->setTextureAddressingMode(TextureUnitState::TAM_BORDER); + tu->setTextureBorderColour(ColourValue::White); + } + } + + } + //--------------------------------------------------------------------- + bool TerrainMaterialGeneratorB::SM2Profile::isShadowingEnabled(TechniqueType tt, const Terrain* terrain) const + { + return getReceiveDynamicShadowsEnabled() && tt != RENDER_COMPOSITE_MAP && + (tt != LOW_LOD || mLowLodShadows) && + terrain->getSceneManager()->isShadowTechniqueTextureBased(); + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::updateParams(const MaterialPtr& mat, const Terrain* terrain) + { + mShaderGen->updateParams(this, mat, terrain, false); + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::updateParamsForCompositeMap(const MaterialPtr& mat, const Terrain* terrain) + { + mShaderGen->updateParams(this, mat, terrain, true); + } + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::generateVertexProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramPtr ret = createVertexProgram(prof, terrain, tt); + + StringUtil::StrStreamType sourceStr; + generateVertexProgramSource(prof, terrain, tt, sourceStr); + ret->setSource(sourceStr.str()); + ret->load(); + defaultVpParams(prof, terrain, tt, ret); +#if OGRE_DEBUG_MODE + LogManager::getSingleton().stream(LML_TRIVIAL) << "*** Terrain Vertex Program: " + << ret->getName() << " ***\n" << ret->getSource() << "\n*** ***"; +#endif + + return ret; + + } + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::generateFragmentProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramPtr ret = createFragmentProgram(prof, terrain, tt); + + StringUtil::StrStreamType sourceStr; + generateFragmentProgramSource(prof, terrain, tt, sourceStr); + ret->setSource(sourceStr.str()); + ret->load(); + defaultFpParams(prof, terrain, tt, ret); + +#if OGRE_DEBUG_MODE + LogManager::getSingleton().stream(LML_TRIVIAL) << "*** Terrain Fragment Program: " + << ret->getName() << " ***\n" << ret->getSource() << "\n*** ***"; +#endif + + return ret; + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::generateVertexProgramSource( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + generateVpHeader(prof, terrain, tt, outStream); + + if (tt != LOW_LOD) + { + uint maxLayers = prof->getMaxLayers(terrain); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + + for (uint i = 0; i < numLayers; ++i) + generateVpLayer(prof, terrain, tt, i, outStream); + } + + generateVpFooter(prof, terrain, tt, outStream); + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::generateFragmentProgramSource( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + generateFpHeader(prof, terrain, tt, outStream); + + if (tt != LOW_LOD) + { + uint maxLayers = prof->getMaxLayers(terrain); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + + for (uint i = 0; i < numLayers; ++i) + generateFpLayer(prof, terrain, tt, i, outStream); + } + + generateFpFooter(prof, terrain, tt, outStream); + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::defaultVpParams( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const HighLevelGpuProgramPtr& prog) + { + GpuProgramParametersSharedPtr params = prog->getDefaultParameters(); + params->setIgnoreMissingParams(true); + params->setNamedAutoConstant("worldMatrix", GpuProgramParameters::ACT_WORLD_MATRIX); + params->setNamedAutoConstant("viewProjMatrix", GpuProgramParameters::ACT_VIEWPROJ_MATRIX); + params->setNamedAutoConstant("lodMorph", GpuProgramParameters::ACT_CUSTOM, + Terrain::LOD_MORPH_CUSTOM_PARAM); + params->setNamedAutoConstant("fogParams", GpuProgramParameters::ACT_FOG_PARAMS); + + if (prof->isShadowingEnabled(tt, terrain)) + { + uint numTextures = 1; + if (prof->getReceiveDynamicShadowsPSSM()) + { + numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + } + for (uint i = 0; i < numTextures; ++i) + { + params->setNamedAutoConstant("texViewProjMatrix" + StringConverter::toString(i), + GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX, i); + if (prof->getReceiveDynamicShadowsDepth()) + { + params->setNamedAutoConstant("depthRange" + StringConverter::toString(i), + GpuProgramParameters::ACT_SHADOW_SCENE_DEPTH_RANGE, i); + } + } + } + + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::defaultFpParams( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const HighLevelGpuProgramPtr& prog) + { + GpuProgramParametersSharedPtr params = prog->getDefaultParameters(); + params->setIgnoreMissingParams(true); + + params->setNamedAutoConstant("ambient", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR); + params->setNamedAutoConstant("lightPosObjSpace", GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE, 0); + params->setNamedAutoConstant("lightDiffuseColour", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, 0); + params->setNamedAutoConstant("lightSpecularColour", GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR, 0); + params->setNamedAutoConstant("eyePosObjSpace", GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE); + params->setNamedAutoConstant("fogColour", GpuProgramParameters::ACT_FOG_COLOUR); + + if (prof->isShadowingEnabled(tt, terrain)) + { + uint numTextures = 1; + if (prof->getReceiveDynamicShadowsPSSM()) + { + PSSMShadowCameraSetup* pssm = prof->getReceiveDynamicShadowsPSSM(); + numTextures = pssm->getSplitCount(); + Vector4 splitPoints; + const PSSMShadowCameraSetup::SplitPointList& splitPointList = pssm->getSplitPoints(); + // Populate from split point 1, not 0, since split 0 isn't useful (usually 0) + for (uint i = 1; i < numTextures; ++i) + { + splitPoints[i-1] = splitPointList[i]; + } + params->setNamedConstant("pssmSplitPoints", splitPoints); + } + + if (prof->getReceiveDynamicShadowsDepth()) + { + size_t samplerOffset = (tt == HIGH_LOD) ? mShadowSamplerStartHi : mShadowSamplerStartLo; + for (uint i = 0; i < numTextures; ++i) + { + params->setNamedAutoConstant("inverseShadowmapSize" + StringConverter::toString(i), + GpuProgramParameters::ACT_INVERSE_TEXTURE_SIZE, i + samplerOffset); + } + } + } + + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::updateParams( + const SM2Profile* prof, const MaterialPtr& mat, const Terrain* terrain, bool compositeMap) + { + Pass* p = mat->getTechnique(0)->getPass(0); + if (compositeMap) + { + updateVpParams(prof, terrain, RENDER_COMPOSITE_MAP, p->getVertexProgramParameters()); + updateFpParams(prof, terrain, RENDER_COMPOSITE_MAP, p->getFragmentProgramParameters()); + } + else + { + // high lod + updateVpParams(prof, terrain, HIGH_LOD, p->getVertexProgramParameters()); + updateFpParams(prof, terrain, HIGH_LOD, p->getFragmentProgramParameters()); + + if(prof->isCompositeMapEnabled()) + { + // low lod + p = mat->getTechnique(1)->getPass(0); + updateVpParams(prof, terrain, LOW_LOD, p->getVertexProgramParameters()); + updateFpParams(prof, terrain, LOW_LOD, p->getFragmentProgramParameters()); + } + } + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::updateVpParams( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const GpuProgramParametersSharedPtr& params) + { + params->setIgnoreMissingParams(true); + uint maxLayers = prof->getMaxLayers(terrain); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + uint numUVMul = numLayers / 4; + if (numLayers % 4) + ++numUVMul; + for (uint i = 0; i < numUVMul; ++i) + { + Vector4 uvMul( + terrain->getLayerUVMultiplier(i * 4), + terrain->getLayerUVMultiplier(i * 4 + 1), + terrain->getLayerUVMultiplier(i * 4 + 2), + terrain->getLayerUVMultiplier(i * 4 + 3) + ); + params->setNamedConstant("uvMul" + StringConverter::toString(i), uvMul); + } + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::updateFpParams( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const GpuProgramParametersSharedPtr& params) + { + params->setIgnoreMissingParams(true); + // TODO - parameterise this? + Vector4 scaleBiasSpecular(0.03, -0.04, 32, 1); + params->setNamedConstant("scaleBiasSpecular", scaleBiasSpecular); + + } + //--------------------------------------------------------------------- + String TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::getChannel(uint idx) + { + uint rem = idx % 4; + switch(rem) + { + case 0: + default: + return "r"; + case 1: + return "g"; + case 2: + return "b"; + case 3: + return "a"; + }; + } + //--------------------------------------------------------------------- + String TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::getVertexProgramName( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + String progName = terrain->getMaterialName() + "/sm2/vp"; + + switch(tt) + { + case HIGH_LOD: + progName += "/hlod"; + break; + case LOW_LOD: + progName += "/llod"; + break; + case RENDER_COMPOSITE_MAP: + progName += "/comp"; + break; + } + + return progName; + + } + //--------------------------------------------------------------------- + String TerrainMaterialGeneratorB::SM2Profile::ShaderHelper::getFragmentProgramName( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + + String progName = terrain->getMaterialName() + "/sm2/fp"; + + switch(tt) + { + case HIGH_LOD: + progName += "/hlod"; + break; + case LOW_LOD: + progName += "/llod"; + break; + case RENDER_COMPOSITE_MAP: + progName += "/comp"; + break; + } + + return progName; + } + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::createVertexProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getVertexProgramName(prof, terrain, tt); + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + } + else + { + ret->unload(); + } + + ret->setParameter("profiles", "vs_3_0 vs_2_0 arbvp1"); + ret->setParameter("entry_point", "main_vp"); + + return ret; + + } + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::createFragmentProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getFragmentProgramName(prof, terrain, tt); + + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_FRAGMENT_PROGRAM); + } + else + { + ret->unload(); + } + + if(prof->isLayerNormalMappingEnabled() || prof->isLayerParallaxMappingEnabled()) + ret->setParameter("profiles", "ps_3_0 ps_2_x fp40 arbfp1"); + else + ret->setParameter("profiles", "ps_3_0 ps_2_0 fp30 arbfp1"); + ret->setParameter("entry_point", "main_fp"); + + return ret; + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpHeader( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + outStream << + "void main_vp(\n" + "float4 pos : POSITION,\n" + "float2 uv : TEXCOORD0,\n"; + if (tt != RENDER_COMPOSITE_MAP) + outStream << "float2 delta : TEXCOORD1,\n"; // lodDelta, lodThreshold + + outStream << + "uniform float4x4 worldMatrix,\n" + "uniform float4x4 viewProjMatrix,\n" + "uniform float2 lodMorph,\n"; // morph amount, morph LOD target + + // uv multipliers + uint maxLayers = prof->getMaxLayers(terrain); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + uint numUVMultipliers = (numLayers / 4); + if (numLayers % 4) + ++numUVMultipliers; + for (uint i = 0; i < numUVMultipliers; ++i) + outStream << "uniform float4 uvMul" << i << ", \n"; + + outStream << + "out float4 oPos : POSITION,\n" + "out float4 oPosObj : TEXCOORD0 \n"; + + uint texCoordSet = 1; + outStream << + ", out float4 oUVMisc : TEXCOORD" << texCoordSet++ <<" // xy = uv, z = camDepth\n"; + + // layer UV's premultiplied, packed as xy/zw + uint numUVSets = numLayers / 2; + if (numLayers % 2) + ++numUVSets; + if (tt != LOW_LOD) + { + for (uint i = 0; i < numUVSets; ++i) + { + outStream << + ", out float4 oUV" << i << " : TEXCOORD" << texCoordSet++ << "\n"; + } + } + + if (prof->getParent()->getDebugLevel() && tt != RENDER_COMPOSITE_MAP) + { + outStream << ", out float2 lodInfo : TEXCOORD" << texCoordSet++ << "\n"; + } + + bool fog = terrain->getSceneManager()->getFogMode() != FOG_NONE && tt != RENDER_COMPOSITE_MAP; + if (fog) + { + outStream << + ", uniform float4 fogParams\n" + ", out float fogVal : COLOR\n"; + } + + if (prof->isShadowingEnabled(tt, terrain)) + { + texCoordSet = generateVpDynamicShadowsParams(texCoordSet, prof, terrain, tt, outStream); + } + + // check we haven't exceeded texture coordinates + if (texCoordSet > 8) + { + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, + "Requested options require too many texture coordinate sets! Try reducing the number of layers.", + __FUNCTION__); + } + + outStream << + ")\n" + "{\n" + " float4 worldPos = mul(worldMatrix, pos);\n" + " oPosObj = pos;\n"; + + if (tt != RENDER_COMPOSITE_MAP) + { + // determine whether to apply the LOD morph to this vertex + // we store the deltas against all vertices so we only want to apply + // the morph to the ones which would disappear. The target LOD which is + // being morphed to is stored in lodMorph.y, and the LOD at which + // the vertex should be morphed is stored in uv.w. If we subtract + // the former from the latter, and arrange to only morph if the + // result is negative (it will only be -1 in fact, since after that + // the vertex will never be indexed), we will achieve our aim. + // sign(vertexLOD - targetLOD) == -1 is to morph + outStream << + " float toMorph = -min(0, sign(delta.y - lodMorph.y));\n"; + // this will either be 1 (morph) or 0 (don't morph) + if (prof->getParent()->getDebugLevel()) + { + // x == LOD level (-1 since value is target level, we want to display actual) + outStream << "lodInfo.x = (lodMorph.y - 1) / " << terrain->getNumLodLevels() << ";\n"; + // y == LOD morph + outStream << "lodInfo.y = toMorph * lodMorph.x;\n"; + } + + // morph + switch (terrain->getAlignment()) + { + case Terrain::ALIGN_X_Y: + outStream << " worldPos.z += delta.x * toMorph * lodMorph.x;\n"; + break; + case Terrain::ALIGN_X_Z: + outStream << " worldPos.y += delta.x * toMorph * lodMorph.x;\n"; + break; + case Terrain::ALIGN_Y_Z: + outStream << " worldPos.x += delta.x * toMorph * lodMorph.x;\n"; + break; + }; + } + + + // generate UVs + if (tt != LOW_LOD) + { + for (uint i = 0; i < numUVSets; ++i) + { + uint layer = i * 2; + uint uvMulIdx = layer / 4; + + outStream << + " oUV" << i << ".xy = " << " uv.xy * uvMul" << uvMulIdx << "." << getChannel(layer) << ";\n"; + outStream << + " oUV" << i << ".zw = " << " uv.xy * uvMul" << uvMulIdx << "." << getChannel(layer+1) << ";\n"; + + } + + } + + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpHeader( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + + // Main header + outStream << + // helpers + "float4 expand(float4 v)\n" + "{ \n" + " return v * 2 - 1;\n" + "}\n\n\n"; + + if (prof->isShadowingEnabled(tt, terrain)) + generateFpDynamicShadowsHelpers(prof, terrain, tt, outStream); + + + outStream << + "float4 main_fp(\n" + "float4 position : TEXCOORD0,\n"; + + uint texCoordSet = 1; + outStream << + "float4 uvMisc : TEXCOORD" << texCoordSet++ << ",\n"; + + // UV's premultiplied, packed as xy/zw + uint maxLayers = prof->getMaxLayers(terrain); + uint numBlendTextures = std::min(terrain->getBlendTextureCount(maxLayers), terrain->getBlendTextureCount()); + uint numLayers = std::min(maxLayers, static_cast(terrain->getLayerCount())); + uint numUVSets = numLayers / 2; + if (numLayers % 2) + ++numUVSets; + if (tt != LOW_LOD) + { + for (uint i = 0; i < numUVSets; ++i) + { + outStream << + "float4 layerUV" << i << " : TEXCOORD" << texCoordSet++ << ", \n"; + } + + } + if (prof->getParent()->getDebugLevel() && tt != RENDER_COMPOSITE_MAP) + { + outStream << "float2 lodInfo : TEXCOORD" << texCoordSet++ << ", \n"; + } + + bool fog = terrain->getSceneManager()->getFogMode() != FOG_NONE && tt != RENDER_COMPOSITE_MAP; + if (fog) + { + outStream << + "uniform float3 fogColour, \n" + "float fogVal : COLOR,\n"; + } + + uint currentSamplerIdx = 0; + + outStream << + // Only 1 light supported in this version + // deferred shading profile / generator later, ok? :) + "uniform float3 ambient,\n" + "uniform float4 lightPosObjSpace,\n" + "uniform float3 lightDiffuseColour,\n" + "uniform float3 lightSpecularColour,\n" + "uniform float3 eyePosObjSpace,\n" + // pack scale, bias and specular + "uniform float4 scaleBiasSpecular,\n"; + + if (tt == LOW_LOD) + { + // single composite map covers all the others below + outStream << + "uniform sampler2D compositeMap : register(s" << currentSamplerIdx++ << ")\n"; + } + else + { + outStream << + "uniform sampler2D globalNormal : register(s" << currentSamplerIdx++ << ")\n"; + + + if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + { + outStream << ", uniform sampler2D globalColourMap : register(s" + << currentSamplerIdx++ << ")\n"; + } + if (prof->isLightmapEnabled()) + { + outStream << ", uniform sampler2D lightMap : register(s" + << currentSamplerIdx++ << ")\n"; + } + // Blend textures - sampler definitions + for (uint i = 0; i < numBlendTextures; ++i) + { + outStream << ", uniform sampler2D blendTex" << i + << " : register(s" << currentSamplerIdx++ << ")\n"; + } + + // Layer textures - sampler definitions & UV multipliers + for (uint i = 0; i < numLayers; ++i) + { + outStream << ", uniform sampler2D difftex" << i + << " : register(s" << currentSamplerIdx++ << ")\n"; + outStream << ", uniform sampler2D normtex" << i + << " : register(s" << currentSamplerIdx++ << ")\n"; + } + } + + if (prof->isShadowingEnabled(tt, terrain)) + { + generateFpDynamicShadowsParams(&texCoordSet, ¤tSamplerIdx, prof, terrain, tt, outStream); + } + + // check we haven't exceeded samplers + if (currentSamplerIdx > 16) + { + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, + "Requested options require too many texture samplers! Try reducing the number of layers.", + __FUNCTION__); + } + + outStream << + ") : COLOR\n" + "{\n" + " float4 outputCol;\n" + " float shadow = 1.0;\n" + " float2 uv = uvMisc.xy;\n" + // base colour + " outputCol = float4(0,0,0,1);\n"; + + if (tt != LOW_LOD) + { + outStream << + // global normal + " float3 normal = expand(tex2D(globalNormal, uv)).rgb;\n"; + + } + + outStream << + " float3 lightDir = \n" + " lightPosObjSpace.xyz - (position.xyz * lightPosObjSpace.w);\n" + " float3 eyeDir = eyePosObjSpace - position.xyz;\n" + + // set up accumulation areas + " float3 diffuse = float3(0,0,0);\n" + " float specular = 0;\n"; + + + if (tt == LOW_LOD) + { + // we just do a single calculation from composite map + outStream << + " float4 composite = tex2D(compositeMap, uv);\n" + " diffuse = composite.rgb;\n"; + // TODO - specular; we'll need normals for this! + } + else + { + // set up the blend values + for (uint i = 0; i < numBlendTextures; ++i) + { + outStream << " float4 blendTexVal" << i << " = tex2D(blendTex" << i << ", uv);\n"; + } + + if (prof->isLayerNormalMappingEnabled()) + { + // derive the tangent space basis + // we do this in the pixel shader because we don't have per-vertex normals + // because of the LOD, we use a normal map + // tangent is always +x or -z in object space depending on alignment + switch(terrain->getAlignment()) + { + case Terrain::ALIGN_X_Y: + case Terrain::ALIGN_X_Z: + outStream << " float3 tangent = float3(1, 0, 0);\n"; + break; + case Terrain::ALIGN_Y_Z: + outStream << " float3 tangent = float3(0, 0, -1);\n"; + break; + }; + + outStream << " float3 binormal = normalize(cross(tangent, normal));\n"; + // note, now we need to re-cross to derive tangent again because it wasn't orthonormal + outStream << " tangent = normalize(cross(normal, binormal));\n"; + // derive final matrix + outStream << " float3x3 TBN = float3x3(tangent, binormal, normal);\n"; + + // set up lighting result placeholders for interpolation + outStream << " float4 litRes, litResLayer;\n"; + outStream << " float3 TSlightDir, TSeyeDir, TShalfAngle, TSnormal;\n"; + if (prof->isLayerParallaxMappingEnabled()) + outStream << " float displacement;\n"; + // move + outStream << " TSlightDir = normalize(mul(TBN, lightDir));\n"; + outStream << " TSeyeDir = normalize(mul(TBN, eyeDir));\n"; + + } + else + { + // simple per-pixel lighting with no normal mapping + outStream << " lightDir = normalize(lightDir);\n"; + outStream << " eyeDir = normalize(eyeDir);\n"; + outStream << " float3 halfAngle = normalize(lightDir + eyeDir);\n"; + outStream << " float4 litRes = lit(dot(lightDir, normal), dot(halfAngle, normal), scaleBiasSpecular.z);\n"; + + } + } + + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpLayer( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) + { + // nothing to do + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpLayer( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) + { + uint uvIdx = layer / 2; + String uvChannels = layer % 2 ? ".zw" : ".xy"; + uint blendIdx = (layer-1) / 4; + String blendChannel = getChannel(layer-1); + String blendWeightStr = String("blendTexVal") + StringConverter::toString(blendIdx) + + "." + blendChannel; + + // generate early-out conditional + /* Disable - causing some issues even when trying to force the use of texldd + if (layer && prof->_isSM3Available()) + outStream << " if (" << blendWeightStr << " > 0.0003)\n { \n"; + */ + + // generate UV + outStream << " float2 uv" << layer << " = layerUV" << uvIdx << uvChannels << ";\n"; + + // calculate lighting here if normal mapping + if (prof->isLayerNormalMappingEnabled()) + { + if (prof->isLayerParallaxMappingEnabled() && tt != RENDER_COMPOSITE_MAP) + { + // modify UV - note we have to sample an extra time + outStream << " displacement = tex2D(normtex" << layer << ", uv" << layer << ").a\n" + " * scaleBiasSpecular.x + scaleBiasSpecular.y;\n"; + outStream << " uv" << layer << " += TSeyeDir.xy * displacement;\n"; + } + + // access TS normal map + outStream << " TSnormal = expand(tex2D(normtex" << layer << ", uv" << layer << ")).rgb;\n"; + outStream << " TShalfAngle = normalize(TSlightDir + TSeyeDir);\n"; + outStream << " litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);\n"; + if (!layer) + outStream << " litRes = litResLayer;\n"; + else + outStream << " litRes = lerp(litRes, litResLayer, " << blendWeightStr << ");\n"; + + } + + // sample diffuse texture + outStream << " float4 diffuseSpecTex" << layer + << " = tex2D(difftex" << layer << ", uv" << layer << ");\n"; + + // apply to common + if (!layer) + { + outStream << " diffuse = diffuseSpecTex0.rgb;\n"; + if (prof->isLayerSpecularMappingEnabled()) + outStream << " specular = diffuseSpecTex0.a;\n"; + } + else + { + outStream << " diffuse = lerp(diffuse, diffuseSpecTex" << layer + << ".rgb, " << blendWeightStr << ");\n"; + if (prof->isLayerSpecularMappingEnabled()) + outStream << " specular = lerp(specular, diffuseSpecTex" << layer + << ".a, " << blendWeightStr << ");\n"; + + } + + // End early-out + /* Disable - causing some issues even when trying to force the use of texldd + if (layer && prof->_isSM3Available()) + outStream << " } // early-out blend value\n"; + */ + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpFooter( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + + outStream << + " oPos = mul(viewProjMatrix, worldPos);\n" + " oUVMisc.xy = uv.xy;\n"; + + bool fog = terrain->getSceneManager()->getFogMode() != FOG_NONE && tt != RENDER_COMPOSITE_MAP; + if (fog) + { + if (terrain->getSceneManager()->getFogMode() == FOG_LINEAR) + { + outStream << + " fogVal = saturate((oPos.z - fogParams.y) * fogParams.w);\n"; + } + else + { + outStream << + " fogVal = saturate(1 / (exp(oPos.z * fogParams.x)));\n"; + } + } + + if (prof->isShadowingEnabled(tt, terrain)) + generateVpDynamicShadows(prof, terrain, tt, outStream); + + outStream << + "}\n"; + + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpFooter( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + + if (tt == LOW_LOD) + { + if (prof->isShadowingEnabled(tt, terrain)) + { + generateFpDynamicShadows(prof, terrain, tt, outStream); + outStream << + " outputCol.rgb = diffuse * rtshadow;\n"; + } + else + { + outStream << + " outputCol.rgb = diffuse;\n"; + } + } + else + { + if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + { + // sample colour map and apply to diffuse + outStream << " diffuse *= tex2D(globalColourMap, uv).rgb;\n"; + } + if (prof->isLightmapEnabled()) + { + // sample lightmap + outStream << " shadow = tex2D(lightMap, uv).r;\n"; + } + + if (prof->isShadowingEnabled(tt, terrain)) + { + generateFpDynamicShadows(prof, terrain, tt, outStream); + } + + // diffuse lighting + outStream << " outputCol.rgb += ambient * diffuse + litRes.y * lightDiffuseColour * diffuse * shadow;\n"; + + // specular default + if (!prof->isLayerSpecularMappingEnabled()) + outStream << " specular = 1.0;\n"; + + if (tt == RENDER_COMPOSITE_MAP) + { + // Lighting embedded in alpha + outStream << + " outputCol.a = shadow;\n"; + + } + else + { + // Apply specular + outStream << " outputCol.rgb += litRes.z * lightSpecularColour * specular * shadow;\n"; + + if (prof->getParent()->getDebugLevel()) + { + outStream << " outputCol.rg += lodInfo.xy;\n"; + } + } + } + + bool fog = terrain->getSceneManager()->getFogMode() != FOG_NONE && tt != RENDER_COMPOSITE_MAP; + if (fog) + { + outStream << " outputCol.rgb = lerp(outputCol.rgb, fogColour, fogVal);\n"; + } + + // Final return + outStream << " return outputCol;\n" + << "}\n"; + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpDynamicShadowsHelpers( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + // TODO make filtering configurable + outStream << + "// Simple PCF \n" + "// Number of samples in one dimension (square for total samples) \n" + "#define NUM_SHADOW_SAMPLES_1D 2.0 \n" + "#define SHADOW_FILTER_SCALE 1 \n" + + "#define SHADOW_SAMPLES NUM_SHADOW_SAMPLES_1D*NUM_SHADOW_SAMPLES_1D \n" + + "float4 offsetSample(float4 uv, float2 offset, float invMapSize) \n" + "{ \n" + " return float4(uv.xy + offset * invMapSize * uv.w, uv.z, uv.w); \n" + "} \n"; + + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + "float calcDepthShadow(sampler2D shadowMap, float4 uv, float invShadowMapSize) \n" + "{ \n" + " // 4-sample PCF \n" + + " float shadow = 0.0; \n" + " float offset = (NUM_SHADOW_SAMPLES_1D/2 - 0.5) * SHADOW_FILTER_SCALE; \n" + " for (float y = -offset; y <= offset; y += SHADOW_FILTER_SCALE) \n" + " for (float x = -offset; x <= offset; x += SHADOW_FILTER_SCALE) \n" + " { \n" + " float4 newUV = offsetSample(uv, float2(x, y), invShadowMapSize);\n" + " // manually project and assign derivatives \n" + " // to avoid gradient issues inside loops \n" + " newUV = newUV / newUV.w; \n" + " float depth = tex2D(shadowMap, newUV.xy, 1, 1).x; \n" + " if (depth >= 1 || depth >= uv.z)\n" + " shadow += 1.0;\n" + " } \n" + + " shadow /= SHADOW_SAMPLES; \n" + + " return shadow; \n" + "} \n"; + } + else + { + outStream << + "float calcSimpleShadow(sampler2D shadowMap, float4 shadowMapPos) \n" + "{ \n" + " return tex2Dproj(shadowMap, shadowMapPos).x; \n" + "} \n"; + + } + + if (prof->getReceiveDynamicShadowsPSSM()) + { + uint numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + + + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + "float calcPSSMDepthShadow("; + } + else + { + outStream << + "float calcPSSMSimpleShadow("; + } + + outStream << "\n "; + for (uint i = 0; i < numTextures; ++i) + outStream << "sampler2D shadowMap" << i << ", "; + outStream << "\n "; + for (uint i = 0; i < numTextures; ++i) + outStream << "float4 lsPos" << i << ", "; + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << "\n "; + for (uint i = 0; i < numTextures; ++i) + outStream << "float invShadowmapSize" << i << ", "; + } + outStream << "\n" + " float4 pssmSplitPoints, float camDepth) \n" + "{ \n" + " float shadow; \n" + " // calculate shadow \n"; + + for (uint i = 0; i < numTextures; ++i) + { + if (!i) + outStream << " if (camDepth <= pssmSplitPoints." << ShaderHelper::getChannel(i) << ") \n"; + else if (i < numTextures - 1) + outStream << " else if (camDepth <= pssmSplitPoints." << ShaderHelper::getChannel(i) << ") \n"; + else + outStream << " else \n"; + + outStream << + " { \n"; + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + " shadow = calcDepthShadow(shadowMap" << i << ", lsPos" << i << ", invShadowmapSize" << i << "); \n"; + } + else + { + outStream << + " shadow = calcSimpleShadow(shadowMap" << i << ", lsPos" << i << "); \n"; + } + outStream << + " } \n"; + + } + + outStream << + " return shadow; \n" + "} \n\n\n"; + } + + + } + //--------------------------------------------------------------------- + uint TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpDynamicShadowsParams( + uint texCoord, const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + // out semantics & params + uint numTextures = 1; + if (prof->getReceiveDynamicShadowsPSSM()) + { + numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + } + for (uint i = 0; i < numTextures; ++i) + { + outStream << + ", out float4 oLightSpacePos" << i << " : TEXCOORD" << texCoord++ << " \n" << + ", uniform float4x4 texViewProjMatrix" << i << " \n"; + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + ", uniform float4 depthRange" << i << " // x = min, y = max, z = range, w = 1/range \n"; + } + } + + return texCoord; + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpDynamicShadows( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + uint numTextures = 1; + if (prof->getReceiveDynamicShadowsPSSM()) + { + numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + } + + // Calculate the position of vertex in light space + for (uint i = 0; i < numTextures; ++i) + { + outStream << + " oLightSpacePos" << i << " = mul(texViewProjMatrix" << i << ", worldPos); \n"; + if (prof->getReceiveDynamicShadowsDepth()) + { + // make linear + outStream << + "oLightSpacePos" << i << ".z = (oLightSpacePos" << i << ".z - depthRange" << i << ".x) * depthRange" << i << ".w;\n"; + + } + } + + + if (prof->getReceiveDynamicShadowsPSSM()) + { + outStream << + " // pass cam depth\n" + " oUVMisc.z = oPos.z;\n"; + } + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpDynamicShadowsParams( + uint* texCoord, uint* sampler, const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + if (tt == HIGH_LOD) + mShadowSamplerStartHi = *sampler; + else if (tt == LOW_LOD) + mShadowSamplerStartLo = *sampler; + + // in semantics & params + uint numTextures = 1; + if (prof->getReceiveDynamicShadowsPSSM()) + { + numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + outStream << + ", uniform float4 pssmSplitPoints \n"; + } + for (uint i = 0; i < numTextures; ++i) + { + outStream << + ", float4 lightSpacePos" << i << " : TEXCOORD" << *texCoord << " \n" << + ", uniform sampler2D shadowMap" << i << " : register(s" << *sampler << ") \n"; + *sampler = *sampler + 1; + *texCoord = *texCoord + 1; + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + ", uniform float inverseShadowmapSize" << i << " \n"; + } + } + + } + //--------------------------------------------------------------------- + void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateFpDynamicShadows( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) + { + if (prof->getReceiveDynamicShadowsPSSM()) + { + uint numTextures = prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); + outStream << + " float camDepth = uvMisc.z;\n"; + + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + " float rtshadow = calcPSSMDepthShadow("; + } + else + { + outStream << + " float rtshadow = calcPSSMSimpleShadow("; + } + for (uint i = 0; i < numTextures; ++i) + outStream << "shadowMap" << i << ", "; + outStream << "\n "; + + for (uint i = 0; i < numTextures; ++i) + outStream << "lightSpacePos" << i << ", "; + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << "\n "; + for (uint i = 0; i < numTextures; ++i) + outStream << "inverseShadowmapSize" << i << ", "; + } + outStream << "\n" << + " pssmSplitPoints, camDepth);\n"; + + } + else + { + if (prof->getReceiveDynamicShadowsDepth()) + { + outStream << + " float rtshadow = calcDepthShadow(shadowMap0, lightSpacePos0, inverseShadowmapSize0);"; + } + else + { + outStream << + " float rtshadow = calcSimpleShadow(shadowMap0, lightSpacePos0);"; + } + } + + outStream << + " shadow = min(shadow, rtshadow);\n"; + + } + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperHLSL::createVertexProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getVertexProgramName(prof, terrain, tt); + + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "hlsl", GPT_VERTEX_PROGRAM); + } + else + { + ret->unload(); + } + + if (prof->_isSM3Available()) + ret->setParameter("target", "vs_3_0"); + else + ret->setParameter("target", "vs_2_0"); + ret->setParameter("entry_point", "main_vp"); + + return ret; + + } + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperHLSL::createFragmentProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getFragmentProgramName(prof, terrain, tt); + + + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "hlsl", GPT_FRAGMENT_PROGRAM); + } + else + { + ret->unload(); + } + + if (prof->_isSM3Available()) + ret->setParameter("target", "ps_3_0"); + else + ret->setParameter("target", "ps_2_x"); + ret->setParameter("entry_point", "main_fp"); + + return ret; + + } + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperGLSL::createVertexProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getVertexProgramName(prof, terrain, tt); + + switch(tt) + { + case HIGH_LOD: + progName += "/hlod"; + break; + case LOW_LOD: + progName += "/llod"; + break; + case RENDER_COMPOSITE_MAP: + progName += "/comp"; + break; + } + + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "glsl", GPT_VERTEX_PROGRAM); + } + else + { + ret->unload(); + } + + return ret; + + } + //--------------------------------------------------------------------- + HighLevelGpuProgramPtr + TerrainMaterialGeneratorB::SM2Profile::ShaderHelperGLSL::createFragmentProgram( + const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) + { + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + String progName = getFragmentProgramName(prof, terrain, tt); + + HighLevelGpuProgramPtr ret = mgr.getByName(progName); + if (ret.isNull()) + { + ret = mgr.createProgram(progName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "glsl", GPT_FRAGMENT_PROGRAM); + } + else + { + ret->unload(); + } + + return ret; + + } + + +} diff --git a/apps/openmw/mwrender/terrainmaterial.hpp b/apps/openmw/mwrender/terrainmaterial.hpp new file mode 100644 index 000000000..eaa5572ee --- /dev/null +++ b/apps/openmw/mwrender/terrainmaterial.hpp @@ -0,0 +1,261 @@ +/* +----------------------------------------------------------------------------- +This source file is part of OGRE +(Object-oriented Graphics Rendering Engine) +For the latest info, see http://www.ogre3d.org/ + +Copyright (c) 2000-2011 Torus Knot Software Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +----------------------------------------------------------------------------- +*/ + +#ifndef __Ogre_TerrainMaterialGeneratorB_H__ +#define __Ogre_TerrainMaterialGeneratorB_H__ + +#include "OgreTerrainPrerequisites.h" +#include "OgreTerrainMaterialGenerator.h" +#include "OgreGpuProgramParams.h" + +namespace Ogre +{ + class PSSMShadowCameraSetup; + + /** \addtogroup Optional Components + * @{ + */ + /** \addtogroup Terrain + * Some details on the terrain component + * @{ + */ + + + /** A TerrainMaterialGenerator which can cope with normal mapped, specular mapped + terrain. + @note Requires the Cg plugin to render correctly + */ + class _OgreTerrainExport TerrainMaterialGeneratorB : public TerrainMaterialGenerator + { + public: + TerrainMaterialGeneratorB(); + ~TerrainMaterialGeneratorB(); + + /** Shader model 2 profile target. + */ + class _OgreTerrainExport SM2Profile : public TerrainMaterialGenerator::Profile + { + public: + SM2Profile(TerrainMaterialGenerator* parent, const String& name, const String& desc); + ~SM2Profile(); + MaterialPtr generate(const Terrain* terrain); + MaterialPtr generateForCompositeMap(const Terrain* terrain); + uint8 getMaxLayers(const Terrain* terrain) const; + void updateParams(const MaterialPtr& mat, const Terrain* terrain); + void updateParamsForCompositeMap(const MaterialPtr& mat, const Terrain* terrain); + void requestOptions(Terrain* terrain); + + /** Whether to support normal mapping per layer in the shader (default true). + */ + bool isLayerNormalMappingEnabled() const { return mLayerNormalMappingEnabled; } + /** Whether to support normal mapping per layer in the shader (default true). + */ + void setLayerNormalMappingEnabled(bool enabled); + /** Whether to support parallax mapping per layer in the shader (default true). + */ + bool isLayerParallaxMappingEnabled() const { return mLayerParallaxMappingEnabled; } + /** Whether to support parallax mapping per layer in the shader (default true). + */ + void setLayerParallaxMappingEnabled(bool enabled); + /** Whether to support specular mapping per layer in the shader (default true). + */ + bool isLayerSpecularMappingEnabled() const { return mLayerSpecularMappingEnabled; } + /** Whether to support specular mapping per layer in the shader (default true). + */ + void setLayerSpecularMappingEnabled(bool enabled); + /** Whether to support a global colour map over the terrain in the shader, + if it's present (default true). + */ + bool isGlobalColourMapEnabled() const { return mGlobalColourMapEnabled; } + /** Whether to support a global colour map over the terrain in the shader, + if it's present (default true). + */ + void setGlobalColourMapEnabled(bool enabled); + /** Whether to support a light map over the terrain in the shader, + if it's present (default true). + */ + bool isLightmapEnabled() const { return mLightmapEnabled; } + /** Whether to support a light map over the terrain in the shader, + if it's present (default true). + */ + void setLightmapEnabled(bool enabled); + /** Whether to use the composite map to provide a lower LOD technique + in the distance (default true). + */ + bool isCompositeMapEnabled() const { return mCompositeMapEnabled; } + /** Whether to use the composite map to provide a lower LOD technique + in the distance (default true). + */ + void setCompositeMapEnabled(bool enabled); + /** Whether to support dynamic texture shadows received from other + objects, on the terrain (default true). + */ + bool getReceiveDynamicShadowsEnabled() const { return mReceiveDynamicShadows; } + /** Whether to support dynamic texture shadows received from other + objects, on the terrain (default true). + */ + void setReceiveDynamicShadowsEnabled(bool enabled); + + /** Whether to use PSSM support dynamic texture shadows, and if so the + settings to use (default 0). + */ + void setReceiveDynamicShadowsPSSM(PSSMShadowCameraSetup* pssmSettings); + /** Whether to use PSSM support dynamic texture shadows, and if so the + settings to use (default 0). + */ + PSSMShadowCameraSetup* getReceiveDynamicShadowsPSSM() const { return mPSSM; } + /** Whether to use depth shadows (default false). + */ + void setReceiveDynamicShadowsDepth(bool enabled); + /** Whether to use depth shadows (default false). + */ + bool getReceiveDynamicShadowsDepth() const { return mDepthShadows; } + /** Whether to use shadows on low LOD material rendering (when using composite map) (default false). + */ + void setReceiveDynamicShadowsLowLod(bool enabled); + /** Whether to use shadows on low LOD material rendering (when using composite map) (default false). + */ + bool getReceiveDynamicShadowsLowLod() const { return mLowLodShadows; } + + /// Internal + bool _isSM3Available() const { return mSM3Available; } + + protected: + + enum TechniqueType + { + HIGH_LOD, + LOW_LOD, + RENDER_COMPOSITE_MAP + }; + void addTechnique(const MaterialPtr& mat, const Terrain* terrain, TechniqueType tt); + + /// Interface definition for helper class to generate shaders + class _OgreTerrainExport ShaderHelper : public TerrainAlloc + { + public: + ShaderHelper() {} + virtual ~ShaderHelper() {} + virtual HighLevelGpuProgramPtr generateVertexProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + virtual HighLevelGpuProgramPtr generateFragmentProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + virtual void updateParams(const SM2Profile* prof, const MaterialPtr& mat, const Terrain* terrain, bool compositeMap); + protected: + virtual String getVertexProgramName(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + virtual String getFragmentProgramName(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + virtual HighLevelGpuProgramPtr createVertexProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) = 0; + virtual HighLevelGpuProgramPtr createFragmentProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt) = 0; + virtual void generateVertexProgramSource(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + virtual void generateFragmentProgramSource(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + virtual void generateVpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) = 0; + virtual void generateFpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) = 0; + virtual void generateVpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) = 0; + virtual void generateFpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) = 0; + virtual void generateVpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) = 0; + virtual void generateFpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) = 0; + virtual void defaultVpParams(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const HighLevelGpuProgramPtr& prog); + virtual void defaultFpParams(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const HighLevelGpuProgramPtr& prog); + virtual void updateVpParams(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const GpuProgramParametersSharedPtr& params); + virtual void updateFpParams(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const GpuProgramParametersSharedPtr& params); + static String getChannel(uint idx); + + size_t mShadowSamplerStartHi; + size_t mShadowSamplerStartLo; + + }; + + /// Utility class to help with generating shaders for Cg / HLSL. + class _OgreTerrainExport ShaderHelperCg : public ShaderHelper + { + protected: + HighLevelGpuProgramPtr createVertexProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + HighLevelGpuProgramPtr createFragmentProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + void generateVpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateFpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateVpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream); + void generateFpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream); + void generateVpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateFpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + uint generateVpDynamicShadowsParams(uint texCoordStart, const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateVpDynamicShadows(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateFpDynamicShadowsHelpers(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateFpDynamicShadowsParams(uint* texCoord, uint* sampler, const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + void generateFpDynamicShadows(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream); + }; + + class _OgreTerrainExport ShaderHelperHLSL : public ShaderHelperCg + { + protected: + HighLevelGpuProgramPtr createVertexProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + HighLevelGpuProgramPtr createFragmentProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + }; + + /// Utility class to help with generating shaders for GLSL. + class _OgreTerrainExport ShaderHelperGLSL : public ShaderHelper + { + protected: + HighLevelGpuProgramPtr createVertexProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + HighLevelGpuProgramPtr createFragmentProgram(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt); + void generateVpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) {} + void generateFpHeader(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) {} + void generateVpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) {} + void generateFpLayer(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, uint layer, StringUtil::StrStreamType& outStream) {} + void generateVpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) {} + void generateFpFooter(const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, StringUtil::StrStreamType& outStream) {} + }; + + ShaderHelper* mShaderGen; + bool mLayerNormalMappingEnabled; + bool mLayerParallaxMappingEnabled; + bool mLayerSpecularMappingEnabled; + bool mGlobalColourMapEnabled; + bool mLightmapEnabled; + bool mCompositeMapEnabled; + bool mReceiveDynamicShadows; + PSSMShadowCameraSetup* mPSSM; + bool mDepthShadows; + bool mLowLodShadows; + bool mSM3Available; + + bool isShadowingEnabled(TechniqueType tt, const Terrain* terrain) const; + + }; + + + + + }; + + + + /** @} */ + /** @} */ + + +} + +#endif From dbd2d390fd4e4858d672c9c11f882010988f96f0 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 27 Feb 2012 21:12:16 +0100 Subject: [PATCH 017/586] terrain material fixes: - disable normal and parallax mapping - disable specular mapping and specular --- apps/openmw/mwrender/terrain.cpp | 10 +++---- apps/openmw/mwrender/terrainmaterial.cpp | 36 ++++++++++++++---------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 568ed3741..f3104ef59 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -31,10 +31,10 @@ namespace MWRender TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast(activeProfile); - matProfile->setLightmapEnabled(false); + matProfile->setLightmapEnabled(false); // this doesn't disable the lightmap, although it should ?? matProfile->setReceiveDynamicShadowsEnabled(false); matProfile->setLayerNormalMappingEnabled(false); - //matProfile->setLayerParallaxMappingEnabled(false); + matProfile->setLayerParallaxMappingEnabled(false); matProfile->setLayerSpecularMappingEnabled(false); mLandSize = ESM::Land::LAND_SIZE; @@ -195,8 +195,8 @@ namespace MWRender //have a base texture for now, but this is probably not needed on most cells terrainData->layerList.resize(1); terrainData->layerList[0].worldSize = 256; - terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); - terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); + terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); // diffuseSpec + //terrainData->layerList[0].textureNames.push_back("textures\\_land_default.dds"); // normalHeight for ( int y = fromY - 1; y < fromY + size + 1; y++ ) { @@ -230,7 +230,7 @@ namespace MWRender //Normal map. This should be removed but it would require alterations to //the material generator. Another option would be to use a 1x1 blank texture - terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + //terrainData->layerList[position].textureNames.push_back("textures\\" + texture); indexes[ltexIndex] = position; } diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 313a4a90c..61a7cdb19 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -46,16 +46,16 @@ namespace Ogre // in the albedo texture to store specular reflection // similarly we double-up the normal and height (for parallax) mLayerDecl.samplers.push_back(TerrainLayerSampler("albedo_specular", PF_BYTE_RGBA)); - mLayerDecl.samplers.push_back(TerrainLayerSampler("normal_height", PF_BYTE_RGBA)); + //mLayerDecl.samplers.push_back(TerrainLayerSampler("normal_height", PF_BYTE_RGBA)); mLayerDecl.elements.push_back( TerrainLayerSamplerElement(0, TLSS_ALBEDO, 0, 3)); - mLayerDecl.elements.push_back( - TerrainLayerSamplerElement(0, TLSS_SPECULAR, 3, 1)); - mLayerDecl.elements.push_back( - TerrainLayerSamplerElement(1, TLSS_NORMAL, 0, 3)); - mLayerDecl.elements.push_back( - TerrainLayerSamplerElement(1, TLSS_HEIGHT, 3, 1)); + //mLayerDecl.elements.push_back( + // TerrainLayerSamplerElement(0, TLSS_SPECULAR, 3, 1)); + //mLayerDecl.elements.push_back( + // TerrainLayerSamplerElement(1, TLSS_NORMAL, 0, 3)); + //mLayerDecl.elements.push_back( + // TerrainLayerSamplerElement(1, TLSS_HEIGHT, 3, 1)); mProfiles.push_back(OGRE_NEW SM2Profile(this, "SM2", "Profile for rendering on Shader Model 2 capable cards")); @@ -212,8 +212,8 @@ namespace Ogre freeTextureUnits -= numShadowTextures; } - // each layer needs 2.25 units (1xdiffusespec, 1xnormalheight, 0.25xblend) - return static_cast(freeTextureUnits / 2.25f); + // each layer needs 2.25 units (1xdiffusespec, (1xnormalheight), 0.25xblend) + return static_cast(freeTextureUnits / (1.25f + (mLayerNormalMappingEnabled||mLayerParallaxMappingEnabled))); } @@ -368,8 +368,10 @@ namespace Ogre { // diffuse / specular tu = pass->createTextureUnitState(terrain->getLayerTextureName(i, 0)); + // normal / height - tu = pass->createTextureUnitState(terrain->getLayerTextureName(i, 1)); + if (mLayerNormalMappingEnabled || mLayerParallaxMappingEnabled) + tu = pass->createTextureUnitState(terrain->getLayerTextureName(i, 1)); } } @@ -739,8 +741,10 @@ namespace Ogre if(prof->isLayerNormalMappingEnabled() || prof->isLayerParallaxMappingEnabled()) ret->setParameter("profiles", "ps_3_0 ps_2_x fp40 arbfp1"); - else - ret->setParameter("profiles", "ps_3_0 ps_2_0 fp30 arbfp1"); + //else + //ret->setParameter("profiles", "ps_3_0 ps_2_0 fp30 arbfp1"); + else // fp30 doesn't work (black terrain) + ret->setParameter("profiles", "ps_3_0 ps_2_x fp40 arbfp1"); ret->setParameter("entry_point", "main_fp"); return ret; @@ -982,7 +986,9 @@ namespace Ogre { outStream << ", uniform sampler2D difftex" << i << " : register(s" << currentSamplerIdx++ << ")\n"; - outStream << ", uniform sampler2D normtex" << i + + if (prof->mLayerNormalMappingEnabled || prof->mLayerParallaxMappingEnabled) + outStream << ", uniform sampler2D normtex" << i << " : register(s" << currentSamplerIdx++ << ")\n"; } } @@ -1238,7 +1244,7 @@ namespace Ogre // specular default if (!prof->isLayerSpecularMappingEnabled()) - outStream << " specular = 1.0;\n"; + outStream << " specular = 0.0;\n"; if (tt == RENDER_COMPOSITE_MAP) { @@ -1266,7 +1272,7 @@ namespace Ogre } // Final return - outStream << " return outputCol;\n" + outStream << " return outputCol;\n" << "}\n"; } From 5b5e8ba4fdb0fdd6bf0c62787b8cb32736bca7f9 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 28 Feb 2012 16:20:57 +0100 Subject: [PATCH 018/586] fix a typo that caused SPLIT_TERRAIN=true blendmap to be too detailed (causing insane loading times) --- apps/openmw/mwrender/terrain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index f3104ef59..e25b4b189 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -18,7 +18,7 @@ namespace MWRender mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions(); mTerrainGlobals->setMaxPixelError(8); - mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 1024 : 256); + mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 256 : 1024); Ogre::TerrainMaterialGeneratorPtr matGen; TerrainMaterialGeneratorB* matGenP = new TerrainMaterialGeneratorB(); From abcf25ead21909d6f9f0f6ac33ed98b31526d686 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 28 Feb 2012 16:41:05 +0100 Subject: [PATCH 019/586] terrain shader performance improvement (tested on opengl only, please test on directx) --- apps/openmw/mwrender/terrainmaterial.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 61a7cdb19..2b1eb2604 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -1113,10 +1113,17 @@ namespace Ogre "." + blendChannel; // generate early-out conditional - /* Disable - causing some issues even when trying to force the use of texldd + // Disable - causing some issues even when trying to force the use of texldd + + // comment by scrawl: + // on a NVIDIA card in opengl mode, didn't produce any problems, + // while increasing FPS from 170 to 185 (!!!) in the same area + // so let's try this out - if something does cause problems for + // someone else (with a different card / renderer) we can just + // add a vendor-specific check here if (layer && prof->_isSM3Available()) outStream << " if (" << blendWeightStr << " > 0.0003)\n { \n"; - */ + // generate UV outStream << " float2 uv" << layer << " = layerUV" << uvIdx << uvChannels << ";\n"; @@ -1165,10 +1172,17 @@ namespace Ogre } // End early-out - /* Disable - causing some issues even when trying to force the use of texldd + // Disable - causing some issues even when trying to force the use of texldd + + // comment by scrawl: + // on a NVIDIA card in opengl mode, didn't produce any problems, + // while increasing FPS from 170 to 185 (!!!) in the same area + // so let's try this out - if something does cause problems for + // someone else (with a different card / renderer) we can just + // add a vendor-specific check here if (layer && prof->_isSM3Available()) outStream << " } // early-out blend value\n"; - */ + } //--------------------------------------------------------------------- void TerrainMaterialGeneratorB::SM2Profile::ShaderHelperCg::generateVpFooter( From f55905609f21036cfbf265194171acc9de47cedb Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 28 Feb 2012 17:18:07 +0100 Subject: [PATCH 020/586] fixed the terrain normals - they had to be adjusted because we use Morrowind's coordinate system --- apps/openmw/mwrender/terrain.cpp | 2 +- apps/openmw/mwrender/terrainmaterial.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index e25b4b189..d5f768428 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -31,7 +31,7 @@ namespace MWRender TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast(activeProfile); - matProfile->setLightmapEnabled(false); // this doesn't disable the lightmap, although it should ?? + matProfile->setLightmapEnabled(false); matProfile->setReceiveDynamicShadowsEnabled(false); matProfile->setLayerNormalMappingEnabled(false); matProfile->setLayerParallaxMappingEnabled(false); diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 2b1eb2604..541fcb91e 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -196,7 +196,8 @@ namespace Ogre // count the texture units free uint8 freeTextureUnits = 16; // lightmap - --freeTextureUnits; + if (mLightmapEnabled) + --freeTextureUnits; // normalmap --freeTextureUnits; // colourmap @@ -1019,7 +1020,8 @@ namespace Ogre { outStream << // global normal - " float3 normal = expand(tex2D(globalNormal, uv)).rgb;\n"; + " float3 normal = expand(tex2D(globalNormal, uv)).rgb;\n" + " normal = float3(normal.x, normal.z, -normal.y); \n"; // convert Ogre to MW coordinate system } From be5555956ced6012bba5937accc9043bfbc425bd Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 28 Feb 2012 22:04:44 +0100 Subject: [PATCH 021/586] improved composite map, now adapts to the ambient/diffuse light --- apps/openmw/mwrender/renderingmanager.cpp | 8 +++++--- apps/openmw/mwrender/terrain.cpp | 14 ++++++++++++++ apps/openmw/mwrender/terrain.hpp | 3 +++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 04ddc2cf8..7fcfc2a8d 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -232,17 +232,17 @@ void RenderingManager::setAmbientMode() { case 0: - mRendering.getScene()->setAmbientLight(mAmbientColor); + setAmbientColour(mAmbientColor); break; case 1: - mRendering.getScene()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); + setAmbientColour(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); break; case 2: - mRendering.getScene()->setAmbientLight(ColourValue(1,1,1)); + setAmbientColour(ColourValue(1,1,1)); break; } } @@ -297,11 +297,13 @@ void RenderingManager::skipAnimation (const MWWorld::Ptr& ptr) void RenderingManager::setSunColour(const Ogre::ColourValue& colour) { mSun->setDiffuseColour(colour); + mTerrainManager->setDiffuse(colour); } void RenderingManager::setAmbientColour(const Ogre::ColourValue& colour) { mRendering.getScene()->setAmbientLight(colour); + mTerrainManager->setAmbient(colour); } void RenderingManager::sunEnable() diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index d5f768428..dd05bf333 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -73,6 +73,20 @@ namespace MWRender OGRE_DELETE mTerrainGroup; OGRE_DELETE mTerrainGlobals; } + + //---------------------------------------------------------------------------------------------- + + void TerrainManager::setDiffuse(const Ogre::ColourValue& diffuse) + { + mTerrainGlobals->setCompositeMapDiffuse(diffuse); + } + + //---------------------------------------------------------------------------------------------- + + void TerrainManager::setAmbient(const Ogre::ColourValue& ambient) + { + mTerrainGlobals->setCompositeMapAmbient(ambient); + } //---------------------------------------------------------------------------------------------- diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 195741b0f..3f2633ff9 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -31,6 +31,9 @@ namespace MWRender{ TerrainManager(Ogre::SceneManager*); virtual ~TerrainManager(); + void setDiffuse(const Ogre::ColourValue& diffuse); + void setAmbient(const Ogre::ColourValue& ambient); + void cellAdded(MWWorld::Ptr::CellStore* store); void cellRemoved(MWWorld::Ptr::CellStore* store); private: From f2b807142a8f1be856c88a62eab9cfaec70f213c Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 29 Feb 2012 11:08:25 +0100 Subject: [PATCH 022/586] update mangle --- libs/mangle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/mangle b/libs/mangle index f3c9694bf..14b2851e7 160000 --- a/libs/mangle +++ b/libs/mangle @@ -1 +1 @@ -Subproject commit f3c9694bf249a34eae05f0304e6bfc120014ce8c +Subproject commit 14b2851e72f610ae81dd296598867e6fb0babd2a From 1d0ae9c8d122ea168b9515bb696a74e6d8c9aa05 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Wed, 29 Feb 2012 23:05:22 +0000 Subject: [PATCH 023/586] Start of a basic implementation of fake vertex colours --- apps/openmw/mwrender/terrain.cpp | 146 ++++++++++++++++++++++++++++--- apps/openmw/mwrender/terrain.hpp | 26 +++++- components/esm/loadland.cpp | 5 +- components/esm/loadland.hpp | 2 + 4 files changed, 167 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 710a3ad05..89c362c4c 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -2,6 +2,8 @@ #include #include +#include + #include "terrain.hpp" #include "components/esm/loadland.hpp" @@ -104,6 +106,9 @@ namespace MWRender const int terrainX = cellX * 2 + x; const int terrainY = cellY * 2 + y; + //it makes far more sense to reallocate the memory here, + //and let Ogre deal with it due to the issues with deleting + //it at the wrong time if using threads (Which Ogre::Terrain does) terrainData.inputFloat = OGRE_ALLOC_T(float, mLandSize*mLandSize, Ogre::MEMCATEGORY_GEOMETRY); @@ -122,10 +127,16 @@ namespace MWRender mLandSize*sizeof(float)); } + //this should really be 33*33 + Ogre::uchar* vertexColourAlpha = OGRE_ALLOC_T(Ogre::uchar, + mLandSize*mLandSize, + Ogre::MEMCATEGORY_GENERAL); + std::map indexes; initTerrainTextures(&terrainData, store, x * numTextures, y * numTextures, - numTextures, indexes); + numTextures, vertexColourAlpha, + indexes); assert( mTerrainGroup->getTerrain(cellX, cellY) == NULL && "The terrain for this cell already existed" ); @@ -133,9 +144,20 @@ namespace MWRender mTerrainGroup->loadTerrain(terrainX, terrainY, true); Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); + + Ogre::Image vertexColourBlendMap = Ogre::Image(); + vertexColourBlendMap.loadDynamicImage(vertexColourAlpha, + mLandSize, mLandSize, 1, + Ogre::PF_A8, true) + .resize(mTerrainGlobals->getLayerBlendMapSize(), + mTerrainGlobals->getLayerBlendMapSize(), + Ogre::Image::FILTER_BOX); + initTerrainBlendMaps(terrain, store, x * numTextures, y * numTextures, - numTextures, indexes); + numTextures, + vertexColourBlendMap.getData(), + indexes); } } @@ -154,16 +176,30 @@ namespace MWRender &store->land[1][1]->landData->heights[0], mLandSize*mLandSize*sizeof(float)); + Ogre::uchar* vertexColourAlpha = OGRE_ALLOC_T(Ogre::uchar, + mLandSize*mLandSize, + Ogre::MEMCATEGORY_GENERAL); + std::map indexes; initTerrainTextures(&terrainData, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, indexes); + ESM::Land::LAND_TEXTURE_SIZE, vertexColourAlpha, indexes); mTerrainGroup->defineTerrain(cellX, cellY, &terrainData); mTerrainGroup->loadTerrain(cellX, cellY, true); Ogre::Terrain* terrain = mTerrainGroup->getTerrain(cellX, cellY); + + Ogre::Image vertexColourBlendMap = Ogre::Image(); + vertexColourBlendMap.loadDynamicImage(vertexColourAlpha, + mLandSize, mLandSize, 1, + Ogre::PF_A8, true) + .resize(mTerrainGlobals->getLayerBlendMapSize(), + mTerrainGlobals->getLayerBlendMapSize(), + Ogre::Image::FILTER_BOX); + initTerrainBlendMaps(terrain, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, indexes); + ESM::Land::LAND_TEXTURE_SIZE, + vertexColourBlendMap.getData(), indexes); } mTerrainGroup->freeTemporaryResources(); @@ -196,6 +232,7 @@ namespace MWRender void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, + Ogre::uchar* vertexColourAlpha, std::map& indexes) { assert(store != NULL && "store must be a valid pointer"); @@ -227,7 +264,7 @@ namespace MWRender { //NB: All vtex ids are +1 compared to the ltex ids assert((int)ltexIndex >= 0 && - store->landTextures->ltex.size() > (size_t)ltexIndex - 1 && + (int)store->landTextures->ltex.size() >= (int)ltexIndex - 1 && "LAND.VTEX must be within the bounds of the LTEX array"); std::string texture; @@ -262,6 +299,17 @@ namespace MWRender } } } + + //add the vertex colour overlay + //TODO sort the *4 bit + Ogre::TexturePtr vclr = getVertexColours(store, vertexColourAlpha, fromX*4, fromY*4, mLandSize); + Ogre::TexturePtr normDisp = getNormalDisp("DOES_NOT_EXIST"); + + const size_t position = terrainData->layerList.size(); + terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); + terrainData->layerList[position].worldSize = mRealSize; + terrainData->layerList[position].textureNames.push_back(vclr->getName()); + terrainData->layerList[position].textureNames.push_back(normDisp->getName()); } //---------------------------------------------------------------------------------------------- @@ -269,6 +317,7 @@ namespace MWRender void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, + Ogre::uchar* vertexColourAlpha, const std::map& indexes) { assert(store != NULL && "store must be a valid pointer"); @@ -294,6 +343,15 @@ namespace MWRender ->getBlendPointer(); memset(pBlend, 0, sizeof(float) * blendSize * blendSize); } + //except the overlay, which we will just splat over the top + { + //the overlay is always the last texture layer + float* pBlend = terrain->getLayerBlendMap(terrain->getLayerCount() - 1) + ->getBlendPointer(); + for ( int i = 0; i < blendSize * blendSize; i++ ){ + *pBlend++ = (*vertexColourAlpha++)/255.0f; + } + } //covert the ltex data into a set of blend maps for ( int texY = fromY - 1; texY < fromY + size + 1; texY++ ) @@ -354,10 +412,9 @@ namespace MWRender } } - //update the maps - for ( iter = indexes.begin(); iter != indexes.end(); ++iter ) + for ( int i = 1; i < terrain->getLayerCount(); i++ ) { - Ogre::TerrainLayerBlendMap* blend = terrain->getLayerBlendMap(iter->second); + Ogre::TerrainLayerBlendMap* blend = terrain->getLayerBlendMap(i); blend->dirty(); blend->update(); } @@ -424,8 +481,7 @@ namespace MWRender return texMgr->getByName(normalTextureName); } - const std::string textureName = "default_terrain_normal"; - if ( !texMgr->getByName(textureName).isNull() ) + const std::string textureName = "default_terrain_normal"; if ( !texMgr->getByName(textureName).isNull() ) { return texMgr->getByName(textureName); } @@ -451,4 +507,74 @@ namespace MWRender return tex; } + //---------------------------------------------------------------------------------------------- + + Ogre::TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, + Ogre::uchar* alpha, + int fromX, int fromY, int size) + { + Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); + const char* const colours = store->land[1][1]->landData->colours; + + const std::string colourTextureName = "VtexColours_" + + boost::lexical_cast(store->cell->getGridX()) + + "_" + + boost::lexical_cast(store->cell->getGridY()) + + "_" + + boost::lexical_cast(fromX) + + "_" + + boost::lexical_cast(fromY); + + Ogre::TexturePtr tex = texMgr->getByName(colourTextureName); + if ( !tex.isNull() ) + { + return tex; + } + + tex = texMgr->createManual(colourTextureName, + Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGRA); + + Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); + + pixelBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL); + const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); + + Ogre::uint8* pDest = static_cast(pixelBox.data); + + for ( int y = 0; y < size; y++ ) + { + for ( int x = 0; x < size; x++ ) + { + const size_t colourOffset = (y+fromY)*3*65 + (x+fromX)*3; + + assert( colourOffset >= 0 && colourOffset < 65*65*3 && + "Colour offset is out of the expected bounds of record" ); + + const unsigned char r = colours[colourOffset + 0]; + const unsigned char g = colours[colourOffset + 1]; + const unsigned char b = colours[colourOffset + 2]; + + //as is the case elsewhere we need to flip the y + const size_t imageOffset = (size - 1 - y)*size*4 + x*4; + pDest[imageOffset + 0] = b; + pDest[imageOffset + 1] = g; + pDest[imageOffset + 2] = r; + pDest[imageOffset + 3] = 255; //Alpha, TODO this needs to be removed + + const size_t alphaOffset = (size - 1 - y)*size + x; + if ( r == 255 && g == 255 && b == 255 ){ + alpha[alphaOffset] = 0; + }else{ + alpha[alphaOffset] = 128; + } + + } + } + + pixelBuffer->unlock(); + + return tex; + } + } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 548d00eab..a201fdb61 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -74,12 +74,16 @@ namespace MWRender{ * @param fromX the ltex index in the current cell to start making the texture from * @param fromY the ltex index in the current cell to start making the texture from * @param size the size (number of splats) to get + * @param vertexColourAlpha this should be an empty array containing the number of + * vertexes in this terrain segment. It is filled with the + * alpha values for the vertex colours * @param indexes a mapping of ltex index to the terrain texture layer that * can be used by initTerrainBlendMaps */ void initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, + Ogre::uchar* vertexColourAlpha, std::map& indexes); /** @@ -90,11 +94,16 @@ namespace MWRender{ * @param fromX the ltex index in the current cell to start making the texture from * @param fromY the ltex index in the current cell to start making the texture from * @param size the size (number of splats) to get + * @param vertexColourAlpha this should be an array containing the alpha values + * for the vertex colours. NOTE: This should be the + * size of a splat map, which is NOT the same size + * as retured from initTerrainTextures. * @param indexes the mapping of ltex to blend map produced by initTerrainTextures */ void initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, + Ogre::uchar* vertexColourAlpha, const std::map& indexes); /** @@ -118,7 +127,22 @@ namespace MWRender{ * @param fileName the name of the *diffuse* texture */ Ogre::TexturePtr getNormalDisp(const std::string& fileName); - + + /** + * Due to the fact that Ogre terrain doesn't support vertex colours + * we have to generate them manually + * + * @param store the cell store for the given terrain cell + * @param vertexColourAlpha this should be an empty array containing the number of + * vertexes in this terrain segment. It is filled with the + * alpha values for the vertex colours + * @param fromX the *vertex* index in the current cell to start making texture from + * @param fromY the *vertex* index in the current cell to start making the texture from + * @param size the size (number of vertexes) to get + */ + Ogre::TexturePtr getVertexColours(MWWorld::Ptr::CellStore* store, + Ogre::uchar* alpha, + int fromX, int fromY, int size); }; } diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 1d670036e..3bca8692b 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -93,7 +93,10 @@ void Land::loadData(ESMReader &esm) } if (esm.isNextSub("VCLR")) { - esm.skipHSubSize(12675); + landData->usingColours = true; + esm.getHExact(&landData->colours, 3*LAND_NUM_VERTS); + }else{ + landData->usingColours = false; } //TODO fix magic numbers uint16_t vtex[512]; diff --git a/components/esm/loadland.hpp b/components/esm/loadland.hpp index 4219f3eb6..eeb198e90 100644 --- a/components/esm/loadland.hpp +++ b/components/esm/loadland.hpp @@ -58,6 +58,8 @@ struct Land float heights[LAND_NUM_VERTS]; //float normals[LAND_NUM_VERTS * 3]; uint16_t textures[LAND_NUM_TEXTURES]; + + bool usingColours; char colours[3 * LAND_NUM_VERTS]; }; From 69243486960bb9b4ab8bed03d591dcbf04a0f085 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Wed, 29 Feb 2012 23:33:54 +0000 Subject: [PATCH 024/586] Fixed some texture splatting issues with loading empty terrain cells --- apps/openmw/mwrender/terrain.cpp | 3 +-- components/esm/loadland.cpp | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 89c362c4c..0e6fdff01 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -263,8 +263,7 @@ namespace MWRender if ( it == indexes.end() ) { //NB: All vtex ids are +1 compared to the ltex ids - assert((int)ltexIndex >= 0 && - (int)store->landTextures->ltex.size() >= (int)ltexIndex - 1 && + assert( (int)store->landTextures->ltex.size() >= (int)ltexIndex - 1 && "LAND.VTEX must be within the bounds of the LTEX array"); std::string texture; diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 3bca8692b..4fe6279d3 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -111,6 +111,8 @@ void Land::loadData(ESMReader &esm) } else { + landData->usingColours = false; + memset(&landData->textures, 0, 512 * sizeof(uint16_t)); for (int i = 0; i < LAND_NUM_VERTS; i++) { landData->heights[i] = -256.0f * HEIGHT_SCALE; From 611f336d0731bdff53203c6aa93fa5b9af087522 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Wed, 29 Feb 2012 23:38:21 +0000 Subject: [PATCH 025/586] Now doesn't attempt to use fake vertex colours with cells that don't have vertex colours --- apps/openmw/mwrender/terrain.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 0e6fdff01..59f2f2082 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -300,15 +300,18 @@ namespace MWRender } //add the vertex colour overlay - //TODO sort the *4 bit - Ogre::TexturePtr vclr = getVertexColours(store, vertexColourAlpha, fromX*4, fromY*4, mLandSize); - Ogre::TexturePtr normDisp = getNormalDisp("DOES_NOT_EXIST"); - - const size_t position = terrainData->layerList.size(); - terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); - terrainData->layerList[position].worldSize = mRealSize; - terrainData->layerList[position].textureNames.push_back(vclr->getName()); - terrainData->layerList[position].textureNames.push_back(normDisp->getName()); + if ( store->land[1][1]->landData->usingColours ) + { + //TODO sort the *4 bit + Ogre::TexturePtr vclr = getVertexColours(store, vertexColourAlpha, fromX*4, fromY*4, mLandSize); + Ogre::TexturePtr normDisp = getNormalDisp("DOES_NOT_EXIST"); + + const size_t position = terrainData->layerList.size(); + terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); + terrainData->layerList[position].worldSize = mRealSize; + terrainData->layerList[position].textureNames.push_back(vclr->getName()); + terrainData->layerList[position].textureNames.push_back(normDisp->getName()); + } } //---------------------------------------------------------------------------------------------- @@ -343,6 +346,7 @@ namespace MWRender memset(pBlend, 0, sizeof(float) * blendSize * blendSize); } //except the overlay, which we will just splat over the top + if ( store->land[1][1]->landData->usingColours ) { //the overlay is always the last texture layer float* pBlend = terrain->getLayerBlendMap(terrain->getLayerCount() - 1) From fddf7b4dd059eae8c0b0a536d8914471d7869642 Mon Sep 17 00:00:00 2001 From: scrawl Date: Thu, 1 Mar 2012 14:35:39 +0100 Subject: [PATCH 026/586] terrain material now supports point lights --- apps/openmw/mwrender/terrain.cpp | 10 +-- apps/openmw/mwrender/terrainmaterial.cpp | 93 ++++++++++++++++++++---- apps/openmw/mwrender/terrainmaterial.hpp | 2 + 3 files changed, 84 insertions(+), 21 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 30e0823f9..df5bba7c4 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -29,10 +29,10 @@ namespace MWRender static_cast(activeProfile); mTerrainGlobals->setMaxPixelError(8); - //mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 256 : 1024); - //mTerrainGlobals->setLightMapSize(SPLIT_TERRAIN ? 256 : 1024); - //mTerrainGlobals->setCompositeMapSize(SPLIT_TERRAIN ? 256 : 1024); - //mTerrainGlobals->setDefaultGlobalColourMapSize(256); + mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setLightMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setCompositeMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setDefaultGlobalColourMapSize(256); //10 (default) didn't seem to be quite enough mTerrainGlobals->setSkirtSize(128); @@ -266,7 +266,7 @@ namespace MWRender Ogre::TexturePtr normDisp = getNormalDisp("textures\\" + texture); - //terrainData->layerList[position].worldSize = 256; + terrainData->layerList[position].worldSize = 256; terrainData->layerList[position].textureNames.push_back("textures\\" + texture); //Normal map. This should be removed but it would require alterations to diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 8985fc8ae..9121da793 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -36,6 +36,8 @@ THE SOFTWARE. #include "OgreHardwarePixelBuffer.h" #include "OgreShadowCameraSetupPSSM.h" +#define POINTLIGHTS + namespace Ogre { //--------------------------------------------------------------------- @@ -218,6 +220,22 @@ namespace Ogre } + int TerrainMaterialGeneratorB::SM2Profile::getNumberOfLightsSupported() const + { + #ifndef POINTLIGHTS + return 1; + #else + // number of supported lights depends on the number of available constant registers, + // which in turn depends on the shader profile used + if (GpuProgramManager::getSingleton().isSyntaxSupported("ps_3_0") + || GpuProgramManager::getSingleton().isSyntaxSupported("ps_4_0") + || GpuProgramManager::getSingleton().isSyntaxSupported("fp40") + ) + return 32; + else + return 8; + #endif + } //--------------------------------------------------------------------- MaterialPtr TerrainMaterialGeneratorB::SM2Profile::generate(const Terrain* terrain) { @@ -542,9 +560,15 @@ namespace Ogre params->setIgnoreMissingParams(true); params->setNamedAutoConstant("ambient", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR); - params->setNamedAutoConstant("lightPosObjSpace", GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE, 0); - params->setNamedAutoConstant("lightDiffuseColour", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, 0); - //params->setNamedAutoConstant("lightSpecularColour", GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR, 0); + + for (int i=0; igetNumberOfLightsSupported(); ++i) + { + params->setNamedAutoConstant("lightPosObjSpace"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE, i); + params->setNamedAutoConstant("lightDiffuseColour"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, i); + params->setNamedAutoConstant("lightAttenuation"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_ATTENUATION, i); + //params->setNamedAutoConstant("lightSpecularColour"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR, i); + } + params->setNamedAutoConstant("eyePosObjSpace", GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE); params->setNamedAutoConstant("fogColour", GpuProgramParameters::ACT_FOG_COLOUR); @@ -945,10 +969,25 @@ namespace Ogre outStream << // Only 1 light supported in this version // deferred shading profile / generator later, ok? :) - "uniform float3 ambient,\n" - "uniform float4 lightPosObjSpace,\n" - "uniform float3 lightDiffuseColour,\n" - //"uniform float3 lightSpecularColour,\n" + "uniform float3 ambient,\n"; + + + for (int i=0; igetNumberOfLightsSupported(); ++i) + { + outStream << + "uniform float4 lightPosObjSpace"<getNumberOfLightsSupported(); ++i) + outStream << + " float3 lightDir"<getNumberOfLightsSupported(); ++i) + { + outStream << " float3 halfAngle"<getNumberOfLightsSupported(); ++i) + outStream << " outputCol.rgb += litRes"<isLayerSpecularMappingEnabled()) diff --git a/apps/openmw/mwrender/terrainmaterial.hpp b/apps/openmw/mwrender/terrainmaterial.hpp index eaa5572ee..7c0b87ce4 100644 --- a/apps/openmw/mwrender/terrainmaterial.hpp +++ b/apps/openmw/mwrender/terrainmaterial.hpp @@ -142,6 +142,8 @@ namespace Ogre */ bool getReceiveDynamicShadowsLowLod() const { return mLowLodShadows; } + int getNumberOfLightsSupported() const; + /// Internal bool _isSM3Available() const { return mSM3Available; } From 562cc7aa30f96cabf3d8380696f777f622dcd45c Mon Sep 17 00:00:00 2001 From: scrawl Date: Thu, 1 Mar 2012 15:03:43 +0100 Subject: [PATCH 027/586] fixed 2 assertions that caused crashes --- apps/openmw/mwrender/terrain.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index df5bba7c4..5925ad82a 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -146,16 +146,16 @@ namespace MWRender x * numTextures, y * numTextures, numTextures, indexes); - assert( mTerrainGroup->getTerrain(cellX, cellY) == NULL && - "The terrain for this cell already existed" ); - mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); - - mTerrainGroup->loadTerrain(terrainX, terrainY, true); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); - initTerrainBlendMaps(terrain, store, - x * numTextures, y * numTextures, - numTextures, indexes); - + if (mTerrainGroup->getTerrain(cellX, cellY) == NULL) + { + mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); + + mTerrainGroup->loadTerrain(terrainX, terrainY, true); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); + initTerrainBlendMaps(terrain, store, + x * numTextures, y * numTextures, + numTextures, indexes); + } } } } @@ -246,7 +246,7 @@ namespace MWRender { //NB: All vtex ids are +1 compared to the ltex ids assert((int)ltexIndex >= 0 && - store->landTextures->ltex.size() > (size_t)ltexIndex - 1 && + (int)store->landTextures->ltex.size() > (int)ltexIndex - 1 && "LAND.VTEX must be within the bounds of the LTEX array"); std::string texture; From 8dd6e75ae1437f9db6db52e0d9fab5498f78624b Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Fri, 2 Mar 2012 11:56:51 +0000 Subject: [PATCH 028/586] Vertex colours now uses the Ogre::Terrain colour map --- apps/openmw/mwrender/terrain.cpp | 134 +++++++------------------------ apps/openmw/mwrender/terrain.hpp | 17 +--- 2 files changed, 34 insertions(+), 117 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 59f2f2082..2d433d52f 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -2,8 +2,6 @@ #include #include -#include - #include "terrain.hpp" #include "components/esm/loadland.hpp" @@ -127,38 +125,29 @@ namespace MWRender mLandSize*sizeof(float)); } - //this should really be 33*33 - Ogre::uchar* vertexColourAlpha = OGRE_ALLOC_T(Ogre::uchar, - mLandSize*mLandSize, - Ogre::MEMCATEGORY_GENERAL); - std::map indexes; initTerrainTextures(&terrainData, store, x * numTextures, y * numTextures, - numTextures, vertexColourAlpha, - indexes); + numTextures, indexes); assert( mTerrainGroup->getTerrain(cellX, cellY) == NULL && "The terrain for this cell already existed" ); mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); mTerrainGroup->loadTerrain(terrainX, terrainY, true); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); - - Ogre::Image vertexColourBlendMap = Ogre::Image(); - vertexColourBlendMap.loadDynamicImage(vertexColourAlpha, - mLandSize, mLandSize, 1, - Ogre::PF_A8, true) - .resize(mTerrainGlobals->getLayerBlendMapSize(), - mTerrainGlobals->getLayerBlendMapSize(), - Ogre::Image::FILTER_BOX); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); initTerrainBlendMaps(terrain, store, x * numTextures, y * numTextures, numTextures, - vertexColourBlendMap.getData(), indexes); - + + if ( store->land[1][1]->landData->usingColours ) + { + Ogre::Image vertex = getVertexColours(store, x*32, y*32, mLandSize); + terrain->setGlobalColourMapEnabled(true); + terrain->getGlobalColourMap()->loadImage(vertex); + } } } } @@ -176,30 +165,25 @@ namespace MWRender &store->land[1][1]->landData->heights[0], mLandSize*mLandSize*sizeof(float)); - Ogre::uchar* vertexColourAlpha = OGRE_ALLOC_T(Ogre::uchar, - mLandSize*mLandSize, - Ogre::MEMCATEGORY_GENERAL); - std::map indexes; initTerrainTextures(&terrainData, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, vertexColourAlpha, indexes); + ESM::Land::LAND_TEXTURE_SIZE, indexes); mTerrainGroup->defineTerrain(cellX, cellY, &terrainData); mTerrainGroup->loadTerrain(cellX, cellY, true); Ogre::Terrain* terrain = mTerrainGroup->getTerrain(cellX, cellY); - Ogre::Image vertexColourBlendMap = Ogre::Image(); - vertexColourBlendMap.loadDynamicImage(vertexColourAlpha, - mLandSize, mLandSize, 1, - Ogre::PF_A8, true) - .resize(mTerrainGlobals->getLayerBlendMapSize(), - mTerrainGlobals->getLayerBlendMapSize(), - Ogre::Image::FILTER_BOX); - initTerrainBlendMaps(terrain, store, 0, 0, ESM::Land::LAND_TEXTURE_SIZE, - vertexColourBlendMap.getData(), indexes); + indexes); + + if ( store->land[1][1]->landData->usingColours ) + { + Ogre::Image vertex = getVertexColours(store, 0, 0, mLandSize); + terrain->setGlobalColourMapEnabled(true); + terrain->getGlobalColourMap()->loadImage(vertex); + } } mTerrainGroup->freeTemporaryResources(); @@ -232,7 +216,6 @@ namespace MWRender void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, - Ogre::uchar* vertexColourAlpha, std::map& indexes) { assert(store != NULL && "store must be a valid pointer"); @@ -298,20 +281,6 @@ namespace MWRender } } } - - //add the vertex colour overlay - if ( store->land[1][1]->landData->usingColours ) - { - //TODO sort the *4 bit - Ogre::TexturePtr vclr = getVertexColours(store, vertexColourAlpha, fromX*4, fromY*4, mLandSize); - Ogre::TexturePtr normDisp = getNormalDisp("DOES_NOT_EXIST"); - - const size_t position = terrainData->layerList.size(); - terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); - terrainData->layerList[position].worldSize = mRealSize; - terrainData->layerList[position].textureNames.push_back(vclr->getName()); - terrainData->layerList[position].textureNames.push_back(normDisp->getName()); - } } //---------------------------------------------------------------------------------------------- @@ -319,7 +288,6 @@ namespace MWRender void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, - Ogre::uchar* vertexColourAlpha, const std::map& indexes) { assert(store != NULL && "store must be a valid pointer"); @@ -345,16 +313,6 @@ namespace MWRender ->getBlendPointer(); memset(pBlend, 0, sizeof(float) * blendSize * blendSize); } - //except the overlay, which we will just splat over the top - if ( store->land[1][1]->landData->usingColours ) - { - //the overlay is always the last texture layer - float* pBlend = terrain->getLayerBlendMap(terrain->getLayerCount() - 1) - ->getBlendPointer(); - for ( int i = 0; i < blendSize * blendSize; i++ ){ - *pBlend++ = (*vertexColourAlpha++)/255.0f; - } - } //covert the ltex data into a set of blend maps for ( int texY = fromY - 1; texY < fromY + size + 1; texY++ ) @@ -484,7 +442,8 @@ namespace MWRender return texMgr->getByName(normalTextureName); } - const std::string textureName = "default_terrain_normal"; if ( !texMgr->getByName(textureName).isNull() ) + const std::string textureName = "default_terrain_normal"; + if ( !texMgr->getByName(textureName).isNull() ) { return texMgr->getByName(textureName); } @@ -512,38 +471,14 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - Ogre::TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, - Ogre::uchar* alpha, + Ogre::Image TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size) { - Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); const char* const colours = store->land[1][1]->landData->colours; - const std::string colourTextureName = "VtexColours_" + - boost::lexical_cast(store->cell->getGridX()) + - "_" + - boost::lexical_cast(store->cell->getGridY()) + - "_" + - boost::lexical_cast(fromX) + - "_" + - boost::lexical_cast(fromY); - - Ogre::TexturePtr tex = texMgr->getByName(colourTextureName); - if ( !tex.isNull() ) - { - return tex; - } - - tex = texMgr->createManual(colourTextureName, - Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, - Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGRA); - - Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); - - pixelBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL); - const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); - - Ogre::uint8* pDest = static_cast(pixelBox.data); + Ogre::uchar* imgData = OGRE_ALLOC_T(Ogre::uchar, + size*size*sizeof(Ogre::uchar)*3, + Ogre::MEMCATEGORY_GENERAL); for ( int y = 0; y < size; y++ ) { @@ -559,25 +494,18 @@ namespace MWRender const unsigned char b = colours[colourOffset + 2]; //as is the case elsewhere we need to flip the y - const size_t imageOffset = (size - 1 - y)*size*4 + x*4; - pDest[imageOffset + 0] = b; - pDest[imageOffset + 1] = g; - pDest[imageOffset + 2] = r; - pDest[imageOffset + 3] = 255; //Alpha, TODO this needs to be removed - - const size_t alphaOffset = (size - 1 - y)*size + x; - if ( r == 255 && g == 255 && b == 255 ){ - alpha[alphaOffset] = 0; - }else{ - alpha[alphaOffset] = 128; - } + const size_t imageOffset = (size - 1 - y)*size*3 + x*3; + imgData[imageOffset + 0] = r; + imgData[imageOffset + 1] = g; + imgData[imageOffset + 2] = b; } } - pixelBuffer->unlock(); + Ogre::Image img; + img.loadDynamicImage(imgData, size, size, 1, Ogre::PF_R8G8B8, true); - return tex; + return img; } } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index a201fdb61..232c1d103 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -74,16 +74,12 @@ namespace MWRender{ * @param fromX the ltex index in the current cell to start making the texture from * @param fromY the ltex index in the current cell to start making the texture from * @param size the size (number of splats) to get - * @param vertexColourAlpha this should be an empty array containing the number of - * vertexes in this terrain segment. It is filled with the - * alpha values for the vertex colours * @param indexes a mapping of ltex index to the terrain texture layer that * can be used by initTerrainBlendMaps */ void initTerrainTextures(Ogre::Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, - Ogre::uchar* vertexColourAlpha, std::map& indexes); /** @@ -94,16 +90,11 @@ namespace MWRender{ * @param fromX the ltex index in the current cell to start making the texture from * @param fromY the ltex index in the current cell to start making the texture from * @param size the size (number of splats) to get - * @param vertexColourAlpha this should be an array containing the alpha values - * for the vertex colours. NOTE: This should be the - * size of a splat map, which is NOT the same size - * as retured from initTerrainTextures. * @param indexes the mapping of ltex to blend map produced by initTerrainTextures */ void initTerrainBlendMaps(Ogre::Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, - Ogre::uchar* vertexColourAlpha, const std::map& indexes); /** @@ -133,15 +124,13 @@ namespace MWRender{ * we have to generate them manually * * @param store the cell store for the given terrain cell - * @param vertexColourAlpha this should be an empty array containing the number of - * vertexes in this terrain segment. It is filled with the - * alpha values for the vertex colours * @param fromX the *vertex* index in the current cell to start making texture from * @param fromY the *vertex* index in the current cell to start making the texture from * @param size the size (number of vertexes) to get + * + * @TODO FIXME the return of this function possibly copies the image data */ - Ogre::TexturePtr getVertexColours(MWWorld::Ptr::CellStore* store, - Ogre::uchar* alpha, + Ogre::Image getVertexColours(MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size); }; From 2bea4c47242420b8d0b5db4661745a410186a727 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 2 Mar 2012 15:29:12 +0100 Subject: [PATCH 029/586] fixed the global colour map, apparently Ogre::Terrain was corrupting it somehow, now we are just bypassing Ogre::Terrain for the colour map and passing it directly to the material, which makes more sense performance-wise anyway --- apps/openmw/mwrender/terrain.cpp | 68 +++++++++++++++++------- apps/openmw/mwrender/terrain.hpp | 4 +- apps/openmw/mwrender/terrainmaterial.cpp | 10 ++-- 3 files changed, 55 insertions(+), 27 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 4dd03c097..8d82cb296 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -6,6 +6,8 @@ #include "components/esm/loadland.hpp" +#include + using namespace Ogre; namespace MWRender @@ -48,6 +50,7 @@ namespace MWRender matProfile->setLayerNormalMappingEnabled(false); matProfile->setLayerParallaxMappingEnabled(false); matProfile->setReceiveDynamicShadowsEnabled(false); + matProfile->setGlobalColourMapEnabled(true); mLandSize = ESM::Land::LAND_SIZE; mRealSize = ESM::Land::REAL_SIZE; @@ -163,9 +166,12 @@ namespace MWRender if ( store->land[1][1]->landData->usingColours ) { - Ogre::Image vertex = getVertexColours(store, x*32, y*32, mLandSize); - terrain->setGlobalColourMapEnabled(true); - terrain->getGlobalColourMap()->loadImage(vertex); + Ogre::TexturePtr vertex = getVertexColours(store, x*32, y*32, mLandSize); + + MaterialPtr mat = terrain->_getMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); + mat = terrain->_getCompositeMapMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); } } } @@ -200,9 +206,12 @@ namespace MWRender if ( store->land[1][1]->landData->usingColours ) { - Ogre::Image vertex = getVertexColours(store, 0, 0, mLandSize); - terrain->setGlobalColourMapEnabled(true); - terrain->getGlobalColourMap()->loadImage(vertex); + Ogre::TexturePtr vertex = getVertexColours(store, 0, 0, mLandSize); + + MaterialPtr mat = terrain->_getMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); + mat = terrain->_getCompositeMapMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); } } @@ -495,14 +504,37 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - Ogre::Image TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, - int fromX, int fromY, int size) + Ogre::TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, + int fromX, int fromY, int size) { + Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); const char* const colours = store->land[1][1]->landData->colours; - Ogre::uchar* imgData = OGRE_ALLOC_T(Ogre::uchar, - size*size*sizeof(Ogre::uchar)*3, - Ogre::MEMCATEGORY_GENERAL); + const std::string colourTextureName = "VtexColours_" + + boost::lexical_cast(store->cell->getGridX()) + + "_" + + boost::lexical_cast(store->cell->getGridY()) + + "_" + + boost::lexical_cast(fromX) + + "_" + + boost::lexical_cast(fromY); + + Ogre::TexturePtr tex = texMgr->getByName(colourTextureName); + if ( !tex.isNull() ) + { + return tex; + } + + tex = texMgr->createManual(colourTextureName, + Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGRA); + + Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); + + pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); + const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); + + Ogre::uint8* pDest = static_cast(pixelBox.data); for ( int y = 0; y < size; y++ ) { @@ -518,18 +550,16 @@ namespace MWRender const unsigned char b = colours[colourOffset + 2]; //as is the case elsewhere we need to flip the y - const size_t imageOffset = (size - 1 - y)*size*3 + x*3; - imgData[imageOffset + 0] = r; - imgData[imageOffset + 1] = g; - imgData[imageOffset + 2] = b; - + const size_t imageOffset = (size - 1 - y)*size*4 + x*4; + pDest[imageOffset + 0] = b; + pDest[imageOffset + 1] = g; + pDest[imageOffset + 2] = r; } } - Ogre::Image img; - img.loadDynamicImage(imgData, size, size, 1, Ogre::PF_R8G8B8, true); + pixelBuffer->unlock(); - return img; + return tex; } } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 923f4fc2b..a0a48fb37 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -130,10 +130,8 @@ namespace MWRender{ * @param fromX the *vertex* index in the current cell to start making texture from * @param fromY the *vertex* index in the current cell to start making the texture from * @param size the size (number of vertexes) to get - * - * @TODO FIXME the return of this function possibly copies the image data */ - Ogre::Image getVertexColours(MWWorld::Ptr::CellStore* store, + Ogre::TexturePtr getVertexColours(MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size); }; diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 9121da793..0edc23a71 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -203,7 +203,7 @@ namespace Ogre // normalmap --freeTextureUnits; // colourmap - if (terrain->getGlobalColourMapEnabled()) + //if (terrain->getGlobalColourMapEnabled()) --freeTextureUnits; if (isShadowingEnabled(HIGH_LOD, terrain)) { @@ -359,9 +359,9 @@ namespace Ogre tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); // global colour map - if (terrain->getGlobalColourMapEnabled() && isGlobalColourMapEnabled()) + //if (terrain->getGlobalColourMapEnabled() && isGlobalColourMapEnabled()) { - tu = pass->createTextureUnitState(terrain->getGlobalColourMap()->getName()); + tu = pass->createTextureUnitState(""); tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); } @@ -1004,7 +1004,7 @@ namespace Ogre "uniform sampler2D globalNormal : register(s" << currentSamplerIdx++ << ")\n"; - if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + //if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) { outStream << ", uniform sampler2D globalColourMap : register(s" << currentSamplerIdx++ << ")\n"; @@ -1299,7 +1299,7 @@ namespace Ogre } else { - if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + //if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) { // sample colour map and apply to diffuse outStream << " diffuse *= tex2D(globalColourMap, uv).rgb;\n"; From 0d4e3b8e758ba916f83e3b4ddc496348df3d79e1 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 2 Mar 2012 18:33:05 +0100 Subject: [PATCH 030/586] remove alpha channel from colour map --- apps/openmw/mwrender/terrain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 8d82cb296..325892563 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -527,7 +527,7 @@ namespace MWRender tex = texMgr->createManual(colourTextureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, - Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGRA); + Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGR); Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); @@ -550,7 +550,7 @@ namespace MWRender const unsigned char b = colours[colourOffset + 2]; //as is the case elsewhere we need to flip the y - const size_t imageOffset = (size - 1 - y)*size*4 + x*4; + const size_t imageOffset = (size - 1 - y)*size*3 + x*3; pDest[imageOffset + 0] = b; pDest[imageOffset + 1] = g; pDest[imageOffset + 2] = r; From 461ec9f3d6ddfb3642644d85af925c2c7518e642 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 2 Mar 2012 18:50:55 +0100 Subject: [PATCH 031/586] fix regarding last commit --- apps/openmw/mwrender/terrain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 325892563..ee7175465 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -550,7 +550,7 @@ namespace MWRender const unsigned char b = colours[colourOffset + 2]; //as is the case elsewhere we need to flip the y - const size_t imageOffset = (size - 1 - y)*size*3 + x*3; + const size_t imageOffset = (size - 1 - y)*size*4 + x*4; pDest[imageOffset + 0] = b; pDest[imageOffset + 1] = g; pDest[imageOffset + 2] = r; From 3ecc427b9606f8f7d85adee4b528c0dc6bb12a80 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Fri, 2 Mar 2012 20:27:20 +0000 Subject: [PATCH 032/586] Implemented slightly better texture splatting --- apps/openmw/mwrender/terrain.cpp | 162 ++++++++++++++++--------------- apps/openmw/mwrender/terrain.hpp | 6 -- 2 files changed, 85 insertions(+), 83 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index ee7175465..39aeb6437 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -31,7 +31,7 @@ namespace MWRender static_cast(activeProfile); mTerrainGlobals->setMaxPixelError(8); - mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 32 : 1024); mTerrainGlobals->setLightMapSize(SPLIT_TERRAIN ? 256 : 1024); mTerrainGlobals->setCompositeMapSize(SPLIT_TERRAIN ? 256 : 1024); mTerrainGlobals->setDefaultGlobalColourMapSize(256); @@ -255,62 +255,75 @@ namespace MWRender fromY+size <= ESM::Land::LAND_TEXTURE_SIZE && "Can't get a terrain texture on terrain outside the current cell"); + //this ensures that the ltex indexes are sorted (or retrived as sorted + //which simplifies shading between cells). + // + //If we don't sort the ltex indexes, the splatting order may differ between + //cells which may lead to inconsistent results when shading between cells + std::set ltexIndexes; + for ( int y = fromY - 1; y < fromY + size + 1; y++ ) + { + for ( int x = fromX - 1; x < fromX + size + 1; x++ ) + { + ltexIndexes.insert(getLtexIndexAt(store, x, y)); + } + } + //there is one texture that we want to use as a base (i.e. it won't have //a blend map). This holds the ltex index of that base texture so that //we know not to include it in the output map int baseTexture = -1; - for ( int y = fromY - 1; y < fromY + size + 1; y++ ) + for ( std::set::iterator iter = ltexIndexes.begin(); + iter != ltexIndexes.end(); + ++iter ) { - for ( int x = fromX - 1; x < fromX + size + 1; x++ ) + const uint16_t ltexIndex = *iter; + //this is the base texture, so we can ignore this at present + if ( ltexIndex == baseTexture ) { - const uint16_t ltexIndex = getLtexIndexAt(store, x, y); - //this is the base texture, so we can ignore this at present - if ( ltexIndex == baseTexture ) - { - continue; - } + continue; + } - const std::map::const_iterator it = indexes.find(ltexIndex); + const std::map::const_iterator it = indexes.find(ltexIndex); - if ( it == indexes.end() ) - { - //NB: All vtex ids are +1 compared to the ltex ids + if ( it == indexes.end() ) + { + //NB: All vtex ids are +1 compared to the ltex ids - assert( (int)store->landTextures->ltex.size() >= (int)ltexIndex - 1 && - "LAND.VTEX must be within the bounds of the LTEX array"); - - std::string texture; - if ( ltexIndex == 0 ) - { - texture = "_land_default.dds"; - } - else - { - texture = store->landTextures->ltex[ltexIndex-1].texture; - //TODO this is needed due to MWs messed up texture handling - texture = texture.substr(0, texture.rfind(".")) + ".dds"; - } + assert( (int)store->landTextures->ltex.size() >= (int)ltexIndex - 1 && + "LAND.VTEX must be within the bounds of the LTEX array"); + + std::string texture; + if ( ltexIndex == 0 ) + { + texture = "_land_default.dds"; + } + else + { + texture = store->landTextures->ltex[ltexIndex-1].texture; + //TODO this is needed due to MWs messed up texture handling + texture = texture.substr(0, texture.rfind(".")) + ".dds"; + } - const size_t position = terrainData->layerList.size(); - terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); + const size_t position = terrainData->layerList.size(); + terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); - Ogre::TexturePtr normDisp = getNormalDisp("textures\\" + texture); + Ogre::TexturePtr normDisp = getNormalDisp("textures\\" + texture); - terrainData->layerList[position].worldSize = 256; - terrainData->layerList[position].textureNames.push_back("textures\\" + texture); + terrainData->layerList[position].worldSize = 256; + terrainData->layerList[position].textureNames.push_back("textures\\" + texture); - //Normal map. This should be removed but it would require alterations to - //the material generator. Another option would be to use a 1x1 blank texture - //terrainData->layerList[position].textureNames.push_back(normDisp->getName()); + //Normal map. This should be removed but it would require alterations to + //the material generator. Another option would be to use a 1x1 blank texture + //terrainData->layerList[position].textureNames.push_back(normDisp->getName()); - if ( baseTexture == -1 ) - { - baseTexture = ltexIndex; - } - else - { - indexes[ltexIndex] = position; - } + if ( baseTexture == -1 ) + { + baseTexture = ltexIndex; + } + else + { + indexes[ltexIndex] = position; } } } @@ -335,8 +348,8 @@ namespace MWRender //that need to result in an integer for correct splatting assert( (size & (size - 1)) == 0 && "Size must be a power of 2"); - const int blendSize = terrain->getLayerBlendMapSize(); - const int blendDist = TERRAIN_SHADE_DISTANCE * (blendSize / size); + const int blendMapSize = terrain->getLayerBlendMapSize(); + const int splatSize = blendMapSize / size; //zero out every map std::map::const_iterator iter; @@ -344,7 +357,7 @@ namespace MWRender { float* pBlend = terrain->getLayerBlendMap(iter->second) ->getBlendPointer(); - memset(pBlend, 0, sizeof(float) * blendSize * blendSize); + memset(pBlend, 0, sizeof(float) * blendMapSize * blendMapSize); } //covert the ltex data into a set of blend maps @@ -354,11 +367,6 @@ namespace MWRender { const uint16_t ltexIndex = getLtexIndexAt(store, texX, texY); - //whilte texX is the splat index relative to the entire cell, - //relX is relative to the current segment we are splatting - const int relX = texX - fromX; - const int relY = texY - fromY; - //check if it is the base texture (which isn't in the map) and //if it is don't bother altering the blend map for it if ( indexes.find(ltexIndex) == indexes.end() ) @@ -366,43 +374,43 @@ namespace MWRender continue; } + //while texX is the splat index relative to the entire cell, + //relX is relative to the current segment we are splatting + const int relX = texX - fromX; + const int relY = texY - fromY; + const int layerIndex = indexes.find(ltexIndex)->second; float* const pBlend = terrain->getLayerBlendMap(layerIndex) ->getBlendPointer(); - const int splatSize = blendSize / size; - - //setup the bounds for the shading of this texture splat - const int startX = std::max(0, relX*splatSize - blendDist); - const int endX = std::min(blendSize, (relX+1)*splatSize + blendDist); - - const int startY = std::max(0, relY*splatSize - blendDist); - const int endY = std::min(blendSize, (relY+1)*splatSize + blendDist); - - for ( int blendX = startX; blendX < endX; blendX++ ) - { - for ( int blendY = startY; blendY < endY; blendY++ ) - { - assert(blendX >= 0 && blendX < blendSize && - "index must be within texture bounds"); + for ( int y = -1; y < splatSize + 1; y++ ){ + for ( int x = -1; x < splatSize + 1; x++ ){ - assert(blendY >= 0 && blendY < blendSize && - "index must be within texture bounds"); + //Note: Y is reversed + const int splatY = blendMapSize - 1 - relY * splatSize - y; + const int splatX = relX * splatSize + x; - const int index = blendSize*(blendSize - 1 - blendY) + blendX; - if ( blendX >= relX*splatSize && blendX < (relX+1)*splatSize && - blendY >= relY*splatSize && blendY < (relY+1)*splatSize ) - { - pBlend[index] = 1; - } - else + if ( splatX >= 0 && splatX < blendMapSize && + splatY >= 0 && splatY < blendMapSize ) { - pBlend[index] = std::max((float)pBlend[index], 0.5f); + const int index = (splatY)*blendMapSize + splatX; + + if ( y >= 0 && y < splatSize && + x >= 0 && x < splatSize ) + { + pBlend[index] = 1; + } + else + { + //this provides a transition shading but also + //rounds off the corners slightly + pBlend[index] = std::min(1.0f, pBlend[index] + 0.5f); + } } + } } - } } diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index a0a48fb37..c298b7fc1 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -61,12 +61,6 @@ namespace MWRender{ */ int mRealSize; - /** - * The distance that the current cell should be shaded into the neighbouring - * texture. The distance is in terms of the splat size of a texture - */ - static const float TERRAIN_SHADE_DISTANCE = 0.25f; - /** * Setups up the list of textures for part of a cell, using indexes as * an output to create a mapping of MW LtexIndex to the relevant terrain From 0f705eaca580da7bf11bc773529b9fc54c9d2b28 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Fri, 2 Mar 2012 21:03:53 +0000 Subject: [PATCH 033/586] Removed the option of not splitting terrain as it was slower and adding to code complexity. The only real reason for keeping it, which was that it made debugging some texture issues easier is now gone. --- apps/openmw/mwrender/terrain.cpp | 179 +++++++++++-------------------- apps/openmw/mwrender/terrain.hpp | 25 +---- 2 files changed, 67 insertions(+), 137 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 39aeb6437..113a4a831 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -31,9 +31,9 @@ namespace MWRender static_cast(activeProfile); mTerrainGlobals->setMaxPixelError(8); - mTerrainGlobals->setLayerBlendMapSize(SPLIT_TERRAIN ? 32 : 1024); - mTerrainGlobals->setLightMapSize(SPLIT_TERRAIN ? 256 : 1024); - mTerrainGlobals->setCompositeMapSize(SPLIT_TERRAIN ? 256 : 1024); + mTerrainGlobals->setLayerBlendMapSize(32); + mTerrainGlobals->setLightMapSize(256); + mTerrainGlobals->setCompositeMapSize(256); mTerrainGlobals->setDefaultGlobalColourMapSize(256); //10 (default) didn't seem to be quite enough @@ -52,29 +52,21 @@ namespace MWRender matProfile->setReceiveDynamicShadowsEnabled(false); matProfile->setGlobalColourMapEnabled(true); - mLandSize = ESM::Land::LAND_SIZE; - mRealSize = ESM::Land::REAL_SIZE; - if ( SPLIT_TERRAIN ) - { - mLandSize = (mLandSize - 1)/2 + 1; - mRealSize /= 2; - } - mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, Ogre::Terrain::ALIGN_X_Z, mLandSize, - mRealSize); + mWorldSize); - mTerrainGroup->setOrigin(Ogre::Vector3(mRealSize/2, + mTerrainGroup->setOrigin(Ogre::Vector3(mWorldSize/2, 0, - -mRealSize/2)); + -mWorldSize/2)); Ogre::Terrain::ImportData& importSettings = mTerrainGroup->getDefaultImportSettings(); importSettings.inputBias = 0; importSettings.terrainSize = mLandSize; - importSettings.worldSize = mRealSize; + importSettings.worldSize = mWorldSize; importSettings.minBatchSize = 9; importSettings.maxBatchSize = mLandSize; @@ -111,109 +103,72 @@ namespace MWRender const int cellY = store->cell->getGridY(); - if ( SPLIT_TERRAIN ) - { - //split the cell terrain into four segments - const int numTextures = ESM::Land::LAND_TEXTURE_SIZE/2; + //split the cell terrain into four segments + const int numTextures = ESM::Land::LAND_TEXTURE_SIZE/2; - for ( int x = 0; x < 2; x++ ) + for ( int x = 0; x < 2; x++ ) + { + for ( int y = 0; y < 2; y++ ) { - for ( int y = 0; y < 2; y++ ) - { - Ogre::Terrain::ImportData terrainData = - mTerrainGroup->getDefaultImportSettings(); - - const int terrainX = cellX * 2 + x; - const int terrainY = cellY * 2 + y; + Ogre::Terrain::ImportData terrainData = + mTerrainGroup->getDefaultImportSettings(); - //it makes far more sense to reallocate the memory here, - //and let Ogre deal with it due to the issues with deleting - //it at the wrong time if using threads (Which Ogre::Terrain does) - terrainData.inputFloat = OGRE_ALLOC_T(float, - mLandSize*mLandSize, - Ogre::MEMCATEGORY_GEOMETRY); + const int terrainX = cellX * 2 + x; + const int terrainY = cellY * 2 + y; - //copy the height data row by row - for ( int terrainCopyY = 0; terrainCopyY < mLandSize; terrainCopyY++ ) - { - //the offset of the current segment - const size_t yOffset = y * (mLandSize-1) * ESM::Land::LAND_SIZE + - //offset of the row - terrainCopyY * ESM::Land::LAND_SIZE; - const size_t xOffset = x * (mLandSize-1); - - memcpy(&terrainData.inputFloat[terrainCopyY*mLandSize], - &store->land[1][1]->landData->heights[yOffset + xOffset], - mLandSize*sizeof(float)); - } + //it makes far more sense to reallocate the memory here, + //and let Ogre deal with it due to the issues with deleting + //it at the wrong time if using threads (Which Ogre::Terrain does) + terrainData.inputFloat = OGRE_ALLOC_T(float, + mLandSize*mLandSize, + Ogre::MEMCATEGORY_GEOMETRY); - std::map indexes; - initTerrainTextures(&terrainData, store, - x * numTextures, y * numTextures, - numTextures, indexes); + //copy the height data row by row + for ( int terrainCopyY = 0; terrainCopyY < mLandSize; terrainCopyY++ ) + { + //the offset of the current segment + const size_t yOffset = y * (mLandSize-1) * ESM::Land::LAND_SIZE + + //offset of the row + terrainCopyY * ESM::Land::LAND_SIZE; + const size_t xOffset = x * (mLandSize-1); + + memcpy(&terrainData.inputFloat[terrainCopyY*mLandSize], + &store->land[1][1]->landData->heights[yOffset + xOffset], + mLandSize*sizeof(float)); + } - if (mTerrainGroup->getTerrain(cellX, cellY) == NULL) - { - mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); + std::map indexes; + initTerrainTextures(&terrainData, store, + x * numTextures, y * numTextures, + numTextures, indexes); - mTerrainGroup->loadTerrain(terrainX, terrainY, true); + if (mTerrainGroup->getTerrain(cellX, cellY) == NULL) + { + mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); - initTerrainBlendMaps(terrain, store, - x * numTextures, y * numTextures, - numTextures, - indexes); + mTerrainGroup->loadTerrain(terrainX, terrainY, true); - if ( store->land[1][1]->landData->usingColours ) - { - Ogre::TexturePtr vertex = getVertexColours(store, x*32, y*32, mLandSize); + Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); + initTerrainBlendMaps(terrain, store, + x * numTextures, y * numTextures, + numTextures, + indexes); - MaterialPtr mat = terrain->_getMaterial(); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); - mat = terrain->_getCompositeMapMaterial(); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); - } + if ( store->land[1][1]->landData->usingColours ) + { + Ogre::TexturePtr vertex = getVertexColours(store, + x*(mLandSize-1), + y*(mLandSize-1), + mLandSize); + + MaterialPtr mat = terrain->_getMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); + mat = terrain->_getCompositeMapMaterial(); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); } } } } - else - { - Ogre::Terrain::ImportData terrainData = - mTerrainGroup->getDefaultImportSettings(); - - //one cell is one terrain segment - terrainData.inputFloat = OGRE_ALLOC_T(float, - mLandSize*mLandSize, - Ogre::MEMCATEGORY_GEOMETRY); - - memcpy(&terrainData.inputFloat[0], - &store->land[1][1]->landData->heights[0], - mLandSize*mLandSize*sizeof(float)); - - std::map indexes; - initTerrainTextures(&terrainData, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, indexes); - - mTerrainGroup->defineTerrain(cellX, cellY, &terrainData); - - mTerrainGroup->loadTerrain(cellX, cellY, true); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(cellX, cellY); - - initTerrainBlendMaps(terrain, store, 0, 0, - ESM::Land::LAND_TEXTURE_SIZE, - indexes); - - if ( store->land[1][1]->landData->usingColours ) - { - Ogre::TexturePtr vertex = getVertexColours(store, 0, 0, mLandSize); - - MaterialPtr mat = terrain->_getMaterial(); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); - mat = terrain->_getCompositeMapMaterial(); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); - } - } mTerrainGroup->freeTemporaryResources(); } @@ -222,22 +177,14 @@ namespace MWRender void TerrainManager::cellRemoved(MWWorld::Ptr::CellStore *store) { - if ( SPLIT_TERRAIN ) + for ( int x = 0; x < 2; x++ ) { - for ( int x = 0; x < 2; x++ ) + for ( int y = 0; y < 2; y++ ) { - for ( int y = 0; y < 2; y++ ) - { - mTerrainGroup->unloadTerrain(store->cell->getGridX() * 2 + x, - store->cell->getGridY() * 2 + y); - } + mTerrainGroup->unloadTerrain(store->cell->getGridX() * 2 + x, + store->cell->getGridY() * 2 + y); } } - else - { - mTerrainGroup->unloadTerrain(store->cell->getGridX(), - store->cell->getGridY()); - } } //---------------------------------------------------------------------------------------------- diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index c298b7fc1..eba437a2d 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -17,14 +17,8 @@ namespace MWRender{ /** * Implements the Morrowind terrain using the Ogre Terrain Component * - * This currently has two options as to how the terrain is rendered, one - * is that one cell is rendered as one Ogre::Terrain and the other that - * it is rendered as 4 Ogre::Terrain segments - * - * Splitting it up into segments has the following advantages - * * Seems to be faster - * * Terrain can now be culled more aggressivly using view frustram culling - * * We don't hit splat limits as much + * Each terrain cell is split into four blocks as this leads to an increase + * in performance and means we don't hit splat limits quite as much */ class TerrainManager{ public: @@ -40,26 +34,15 @@ namespace MWRender{ Ogre::TerrainGlobalOptions* mTerrainGlobals; Ogre::TerrainGroup* mTerrainGroup; - /** - * Should each cell be split into a further four Ogre::Terrain objects - * - * This has the advantage that it is possible to cull more terrain and - * we are more likly to be able to be able to fit all the required splats - * in (Ogre's default material generator only works with about 6 textures) - */ - static const bool SPLIT_TERRAIN = true; - /** * The length in verticies of a single terrain block. - * This takes into account the SPLIT_TERRAIN option */ - int mLandSize; + static const int mLandSize = (ESM::Land::LAND_SIZE - 1)/2 + 1; /** * The length in game units of a single terrain block. - * This takes into account the SPLIT_TERRAIN option */ - int mRealSize; + static const int mWorldSize = ESM::Land::REAL_SIZE/2; /** * Setups up the list of textures for part of a cell, using indexes as From 07a2e5a5be7edea0b0a4e14807202b74d91bbd01 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Fri, 2 Mar 2012 21:20:12 +0000 Subject: [PATCH 034/586] Removed dead code, fixed a error, added comments and tweaked some constants (after trying to find their min/max values) --- apps/openmw/mwrender/terrain.cpp | 65 ++++++-------------------------- apps/openmw/mwrender/terrain.hpp | 11 ------ 2 files changed, 12 insertions(+), 64 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 113a4a831..9cc0a9f37 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -30,7 +30,11 @@ namespace MWRender TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast(activeProfile); - mTerrainGlobals->setMaxPixelError(8); + //The pixel error should be as high as possible without it being noticed + //as it governs how fast mesh quality decreases. 16 was just about Ok + //when tested at the small swamp pond in Seyda Neen + mTerrainGlobals->setMaxPixelError(16); + mTerrainGlobals->setLayerBlendMapSize(32); mTerrainGlobals->setLightMapSize(256); mTerrainGlobals->setCompositeMapSize(256); @@ -39,11 +43,9 @@ namespace MWRender //10 (default) didn't seem to be quite enough mTerrainGlobals->setSkirtSize(128); - /* - * Here we are pushing the composite map distance beyond the edge - * of the rendered terrain due to not having setup lighting - */ - //mTerrainGlobals->setCompositeMapDistance(ESM::Land::REAL_SIZE*4); + //due to the sudden flick between composite and non composite textures, + //this seemed the distance where it wasn't too noticeable + mTerrainGlobals->setCompositeMapDistance(mWorldSize*2); matProfile->setLightmapEnabled(false); matProfile->setLayerSpecularMappingEnabled(false); @@ -142,7 +144,7 @@ namespace MWRender x * numTextures, y * numTextures, numTextures, indexes); - if (mTerrainGroup->getTerrain(cellX, cellY) == NULL) + if (mTerrainGroup->getTerrain(terrainX, terrainY) == NULL) { mTerrainGroup->defineTerrain(terrainX, terrainY, &terrainData); @@ -161,6 +163,8 @@ namespace MWRender y*(mLandSize-1), mLandSize); + //this is a hack to get around the fact that Ogre seems to + //corrupt the composite map leading to rendering errors MaterialPtr mat = terrain->_getMaterial(); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); mat = terrain->_getCompositeMapMaterial(); @@ -255,15 +259,9 @@ namespace MWRender const size_t position = terrainData->layerList.size(); terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); - Ogre::TexturePtr normDisp = getNormalDisp("textures\\" + texture); - terrainData->layerList[position].worldSize = 256; terrainData->layerList[position].textureNames.push_back("textures\\" + texture); - //Normal map. This should be removed but it would require alterations to - //the material generator. Another option would be to use a 1x1 blank texture - //terrainData->layerList[position].textureNames.push_back(normDisp->getName()); - if ( baseTexture == -1 ) { baseTexture = ltexIndex; @@ -418,52 +416,12 @@ namespace MWRender ->textures[y * ESM::Land::LAND_TEXTURE_SIZE + x]; } - //---------------------------------------------------------------------------------------------- - - Ogre::TexturePtr TerrainManager::getNormalDisp(const std::string& fileName) - { - Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); - const std::string normalTextureName = fileName.substr(0, fileName.rfind(".")) - + "_n.dds"; - if ( !texMgr->getByName(normalTextureName).isNull() ) - { - return texMgr->getByName(normalTextureName); - } - - const std::string textureName = "default_terrain_normal"; - if ( !texMgr->getByName(textureName).isNull() ) - { - return texMgr->getByName(textureName); - } - - Ogre::TexturePtr tex = texMgr->createManual( - textureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, - Ogre::TEX_TYPE_2D, 1, 1, 0, Ogre::PF_BYTE_BGRA); - - Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); - - pixelBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL); - const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); - - Ogre::uint8* pDest = static_cast(pixelBox.data); - - *pDest++ = 128; // B - *pDest++ = 128; // G - *pDest++ = 128; // R - *pDest++ = 0; // A - - pixelBuffer->unlock(); - - return tex; - } - //---------------------------------------------------------------------------------------------- Ogre::TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size) { Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); - const char* const colours = store->land[1][1]->landData->colours; const std::string colourTextureName = "VtexColours_" + boost::lexical_cast(store->cell->getGridX()) + @@ -491,6 +449,7 @@ namespace MWRender Ogre::uint8* pDest = static_cast(pixelBox.data); + const char* const colours = store->land[1][1]->landData->colours; for ( int y = 0; y < size; y++ ) { for ( int x = 0; x < size; x++ ) diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index eba437a2d..6d9865540 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -88,17 +88,6 @@ namespace MWRender{ */ int getLtexIndexAt(MWWorld::Ptr::CellStore* store, int x, int y); - /** - * Retrives the texture that is the normal and parallax map for the - * terrain. If it doesn't exist a blank texture is used - * - * The file name of the texture should be the same as the file name of - * the base diffuse texture, but with _n appended before the extension - * - * @param fileName the name of the *diffuse* texture - */ - Ogre::TexturePtr getNormalDisp(const std::string& fileName); - /** * Due to the fact that Ogre terrain doesn't support vertex colours * we have to generate them manually From 3c934e3e44ae0a3cc87beb51a2dc2e1fe378bb33 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Fri, 2 Mar 2012 22:31:17 +0000 Subject: [PATCH 035/586] Fixed a bug with fog not being applied to initially created terrain when starting in exteriors. --- apps/openmw/mwrender/renderingmanager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index e204b5856..1c7edb7da 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -25,6 +25,10 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mRendering.createScene("PlayerCam", 55, 5); mTerrainManager = new TerrainManager(mRendering.getScene()); + //The fog type must be set before any terrain objects are created as if the + //fog type is set to FOG_NONE then the initially created terrain won't have any fog + configureFog(1, ColourValue(1,1,1)); + // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); From b882c03adc95d5ed9a6b888d69084aff2b5bc2d2 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 2 Mar 2012 23:36:48 +0100 Subject: [PATCH 036/586] fixed terrain regions without vertexcolours, tweaked maxPixelError --- apps/openmw/mwrender/terrain.cpp | 32 +++++++++++++++--------- apps/openmw/mwrender/terrain.hpp | 3 +++ apps/openmw/mwrender/terrainmaterial.cpp | 8 +++--- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 9cc0a9f37..ca218388f 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -27,13 +27,12 @@ namespace MWRender Ogre::TerrainMaterialGenerator::Profile* const activeProfile = mTerrainGlobals->getDefaultMaterialGenerator() ->getActiveProfile(); - TerrainMaterialGeneratorB::SM2Profile* matProfile = + mActiveProfile = static_cast(activeProfile); //The pixel error should be as high as possible without it being noticed - //as it governs how fast mesh quality decreases. 16 was just about Ok - //when tested at the small swamp pond in Seyda Neen - mTerrainGlobals->setMaxPixelError(16); + //as it governs how fast mesh quality decreases. + mTerrainGlobals->setMaxPixelError(8); mTerrainGlobals->setLayerBlendMapSize(32); mTerrainGlobals->setLightMapSize(256); @@ -47,12 +46,11 @@ namespace MWRender //this seemed the distance where it wasn't too noticeable mTerrainGlobals->setCompositeMapDistance(mWorldSize*2); - matProfile->setLightmapEnabled(false); - matProfile->setLayerSpecularMappingEnabled(false); - matProfile->setLayerNormalMappingEnabled(false); - matProfile->setLayerParallaxMappingEnabled(false); - matProfile->setReceiveDynamicShadowsEnabled(false); - matProfile->setGlobalColourMapEnabled(true); + mActiveProfile->setLightmapEnabled(false); + mActiveProfile->setLayerSpecularMappingEnabled(false); + mActiveProfile->setLayerNormalMappingEnabled(false); + mActiveProfile->setLayerParallaxMappingEnabled(false); + mActiveProfile->setReceiveDynamicShadowsEnabled(false); mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, Ogre::Terrain::ALIGN_X_Z, @@ -156,15 +154,25 @@ namespace MWRender numTextures, indexes); + // disable or enable global colour map (depends on available vertex colours) if ( store->land[1][1]->landData->usingColours ) - { + mActiveProfile->setGlobalColourMapEnabled(true); + else + mActiveProfile->setGlobalColourMapEnabled(false); + + /// \todo are we possibly generating the materials twice? + mActiveProfile->generate(terrain); + mActiveProfile->generateForCompositeMap(terrain); + + if ( store->land[1][1]->landData->usingColours ) + { Ogre::TexturePtr vertex = getVertexColours(store, x*(mLandSize-1), y*(mLandSize-1), mLandSize); //this is a hack to get around the fact that Ogre seems to - //corrupt the composite map leading to rendering errors + //corrupt the global colour map leading to rendering errors MaterialPtr mat = terrain->_getMaterial(); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); mat = terrain->_getCompositeMapMaterial(); diff --git a/apps/openmw/mwrender/terrain.hpp b/apps/openmw/mwrender/terrain.hpp index 6d9865540..397c0c473 100644 --- a/apps/openmw/mwrender/terrain.hpp +++ b/apps/openmw/mwrender/terrain.hpp @@ -2,6 +2,7 @@ #define _GAME_RENDER_TERRAIN_H #include +#include "terrainmaterial.hpp" #include "../mwworld/ptr.hpp" @@ -34,6 +35,8 @@ namespace MWRender{ Ogre::TerrainGlobalOptions* mTerrainGlobals; Ogre::TerrainGroup* mTerrainGroup; + Ogre::TerrainMaterialGeneratorB::SM2Profile* mActiveProfile; + /** * The length in verticies of a single terrain block. */ diff --git a/apps/openmw/mwrender/terrainmaterial.cpp b/apps/openmw/mwrender/terrainmaterial.cpp index 0edc23a71..67ebf45af 100644 --- a/apps/openmw/mwrender/terrainmaterial.cpp +++ b/apps/openmw/mwrender/terrainmaterial.cpp @@ -134,7 +134,7 @@ namespace Ogre if (enabled != mGlobalColourMapEnabled) { mGlobalColourMapEnabled = enabled; - mParent->_markChanged(); + //mParent->_markChanged(); } } //--------------------------------------------------------------------- @@ -359,7 +359,7 @@ namespace Ogre tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); // global colour map - //if (terrain->getGlobalColourMapEnabled() && isGlobalColourMapEnabled()) + if (isGlobalColourMapEnabled()) { tu = pass->createTextureUnitState(""); tu->setTextureAddressingMode(TextureUnitState::TAM_CLAMP); @@ -1004,7 +1004,7 @@ namespace Ogre "uniform sampler2D globalNormal : register(s" << currentSamplerIdx++ << ")\n"; - //if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + if (prof->isGlobalColourMapEnabled()) { outStream << ", uniform sampler2D globalColourMap : register(s" << currentSamplerIdx++ << ")\n"; @@ -1299,7 +1299,7 @@ namespace Ogre } else { - //if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) + if (prof->isGlobalColourMapEnabled()) { // sample colour map and apply to diffuse outStream << " diffuse *= tex2D(globalColourMap, uv).rgb;\n"; From a8939bc3180a8475be9dd38878228c924a31e9b0 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 4 Mar 2012 00:08:56 +0100 Subject: [PATCH 037/586] disabled the composite map, improves loading time a lot --- apps/openmw/mwrender/terrain.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index ca218388f..a66b4ad3f 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -51,6 +51,7 @@ namespace MWRender mActiveProfile->setLayerNormalMappingEnabled(false); mActiveProfile->setLayerParallaxMappingEnabled(false); mActiveProfile->setReceiveDynamicShadowsEnabled(false); + mActiveProfile->setCompositeMapEnabled(false); mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, Ogre::Terrain::ALIGN_X_Z, @@ -160,10 +161,6 @@ namespace MWRender else mActiveProfile->setGlobalColourMapEnabled(false); - /// \todo are we possibly generating the materials twice? - mActiveProfile->generate(terrain); - mActiveProfile->generateForCompositeMap(terrain); - if ( store->land[1][1]->landData->usingColours ) { Ogre::TexturePtr vertex = getVertexColours(store, @@ -173,10 +170,10 @@ namespace MWRender //this is a hack to get around the fact that Ogre seems to //corrupt the global colour map leading to rendering errors - MaterialPtr mat = terrain->_getMaterial(); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); - mat = terrain->_getCompositeMapMaterial(); + MaterialPtr mat = terrain->getMaterial(); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); + //mat = terrain->_getCompositeMapMaterial(); + //mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); } } } From bcd2371baa318b9393ccec684a34d1b1a5bc3f53 Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Sun, 4 Mar 2012 11:21:47 +0000 Subject: [PATCH 038/586] Code cleanup: Removed unneeded Ogre namespace --- apps/openmw/mwrender/terrain.cpp | 56 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index 9cc0a9f37..3db5dfc8c 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -15,16 +15,16 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - TerrainManager::TerrainManager(Ogre::SceneManager* mgr) + TerrainManager::TerrainManager(SceneManager* mgr) { - mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions(); + mTerrainGlobals = OGRE_NEW TerrainGlobalOptions(); - Ogre::TerrainMaterialGeneratorPtr matGen; + TerrainMaterialGeneratorPtr matGen; TerrainMaterialGeneratorB* matGenP = new TerrainMaterialGeneratorB(); matGen.bind(matGenP); mTerrainGlobals->setDefaultMaterialGenerator(matGen); - Ogre::TerrainMaterialGenerator::Profile* const activeProfile = + TerrainMaterialGenerator::Profile* const activeProfile = mTerrainGlobals->getDefaultMaterialGenerator() ->getActiveProfile(); TerrainMaterialGeneratorB::SM2Profile* matProfile = @@ -54,16 +54,16 @@ namespace MWRender matProfile->setReceiveDynamicShadowsEnabled(false); matProfile->setGlobalColourMapEnabled(true); - mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mgr, - Ogre::Terrain::ALIGN_X_Z, + mTerrainGroup = OGRE_NEW TerrainGroup(mgr, + Terrain::ALIGN_X_Z, mLandSize, mWorldSize); - mTerrainGroup->setOrigin(Ogre::Vector3(mWorldSize/2, + mTerrainGroup->setOrigin(Vector3(mWorldSize/2, 0, -mWorldSize/2)); - Ogre::Terrain::ImportData& importSettings = + Terrain::ImportData& importSettings = mTerrainGroup->getDefaultImportSettings(); importSettings.inputBias = 0; @@ -85,14 +85,14 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - void TerrainManager::setDiffuse(const Ogre::ColourValue& diffuse) + void TerrainManager::setDiffuse(const ColourValue& diffuse) { mTerrainGlobals->setCompositeMapDiffuse(diffuse); } //---------------------------------------------------------------------------------------------- - void TerrainManager::setAmbient(const Ogre::ColourValue& ambient) + void TerrainManager::setAmbient(const ColourValue& ambient) { mTerrainGlobals->setCompositeMapAmbient(ambient); } @@ -112,7 +112,7 @@ namespace MWRender { for ( int y = 0; y < 2; y++ ) { - Ogre::Terrain::ImportData terrainData = + Terrain::ImportData terrainData = mTerrainGroup->getDefaultImportSettings(); const int terrainX = cellX * 2 + x; @@ -120,10 +120,10 @@ namespace MWRender //it makes far more sense to reallocate the memory here, //and let Ogre deal with it due to the issues with deleting - //it at the wrong time if using threads (Which Ogre::Terrain does) + //it at the wrong time if using threads (Which Terrain does) terrainData.inputFloat = OGRE_ALLOC_T(float, mLandSize*mLandSize, - Ogre::MEMCATEGORY_GEOMETRY); + MEMCATEGORY_GEOMETRY); //copy the height data row by row for ( int terrainCopyY = 0; terrainCopyY < mLandSize; terrainCopyY++ ) @@ -150,7 +150,7 @@ namespace MWRender mTerrainGroup->loadTerrain(terrainX, terrainY, true); - Ogre::Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); + Terrain* terrain = mTerrainGroup->getTerrain(terrainX, terrainY); initTerrainBlendMaps(terrain, store, x * numTextures, y * numTextures, numTextures, @@ -158,7 +158,7 @@ namespace MWRender if ( store->land[1][1]->landData->usingColours ) { - Ogre::TexturePtr vertex = getVertexColours(store, + TexturePtr vertex = getVertexColours(store, x*(mLandSize-1), y*(mLandSize-1), mLandSize); @@ -193,7 +193,7 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - void TerrainManager::initTerrainTextures(Ogre::Terrain::ImportData* terrainData, + void TerrainManager::initTerrainTextures(Terrain::ImportData* terrainData, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, std::map& indexes) @@ -257,7 +257,7 @@ namespace MWRender } const size_t position = terrainData->layerList.size(); - terrainData->layerList.push_back(Ogre::Terrain::LayerInstance()); + terrainData->layerList.push_back(Terrain::LayerInstance()); terrainData->layerList[position].worldSize = 256; terrainData->layerList[position].textureNames.push_back("textures\\" + texture); @@ -276,7 +276,7 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - void TerrainManager::initTerrainBlendMaps(Ogre::Terrain* terrain, + void TerrainManager::initTerrainBlendMaps(Terrain* terrain, MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size, const std::map& indexes) @@ -361,7 +361,7 @@ namespace MWRender for ( int i = 1; i < terrain->getLayerCount(); i++ ) { - Ogre::TerrainLayerBlendMap* blend = terrain->getLayerBlendMap(i); + TerrainLayerBlendMap* blend = terrain->getLayerBlendMap(i); blend->dirty(); blend->update(); } @@ -418,10 +418,10 @@ namespace MWRender //---------------------------------------------------------------------------------------------- - Ogre::TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, + TexturePtr TerrainManager::getVertexColours(MWWorld::Ptr::CellStore* store, int fromX, int fromY, int size) { - Ogre::TextureManager* const texMgr = Ogre::TextureManager::getSingletonPtr(); + TextureManager* const texMgr = TextureManager::getSingletonPtr(); const std::string colourTextureName = "VtexColours_" + boost::lexical_cast(store->cell->getGridX()) + @@ -432,22 +432,22 @@ namespace MWRender "_" + boost::lexical_cast(fromY); - Ogre::TexturePtr tex = texMgr->getByName(colourTextureName); + TexturePtr tex = texMgr->getByName(colourTextureName); if ( !tex.isNull() ) { return tex; } tex = texMgr->createManual(colourTextureName, - Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, - Ogre::TEX_TYPE_2D, size, size, 0, Ogre::PF_BYTE_BGR); + ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + TEX_TYPE_2D, size, size, 0, PF_BYTE_BGR); - Ogre::HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); + HardwarePixelBufferSharedPtr pixelBuffer = tex->getBuffer(); - pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); - const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); + pixelBuffer->lock(HardwareBuffer::HBL_DISCARD); + const PixelBox& pixelBox = pixelBuffer->getCurrentLock(); - Ogre::uint8* pDest = static_cast(pixelBox.data); + uint8* pDest = static_cast(pixelBox.data); const char* const colours = store->land[1][1]->landData->colours; for ( int y = 0; y < size; y++ ) From eca91d17bb823a6f0fda3b88764b9a8a8c84274a Mon Sep 17 00:00:00 2001 From: Jacob Essex Date: Sun, 4 Mar 2012 11:46:33 +0000 Subject: [PATCH 039/586] Indentation tweaks and code cleanup --- apps/openmw/mwrender/terrain.cpp | 42 +++++++++++++++----------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/apps/openmw/mwrender/terrain.cpp b/apps/openmw/mwrender/terrain.cpp index d9e6c1cf6..64acd9fe3 100644 --- a/apps/openmw/mwrender/terrain.cpp +++ b/apps/openmw/mwrender/terrain.cpp @@ -27,17 +27,14 @@ namespace MWRender TerrainMaterialGenerator::Profile* const activeProfile = mTerrainGlobals->getDefaultMaterialGenerator() ->getActiveProfile(); - mActiveProfile = - static_cast(activeProfile); + mActiveProfile = static_cast(activeProfile); //The pixel error should be as high as possible without it being noticed //as it governs how fast mesh quality decreases. mTerrainGlobals->setMaxPixelError(8); mTerrainGlobals->setLayerBlendMapSize(32); - mTerrainGlobals->setLightMapSize(256); - mTerrainGlobals->setCompositeMapSize(256); - mTerrainGlobals->setDefaultGlobalColourMapSize(256); + mTerrainGlobals->setDefaultGlobalColourMapSize(65); //10 (default) didn't seem to be quite enough mTerrainGlobals->setSkirtSize(128); @@ -51,19 +48,21 @@ namespace MWRender mActiveProfile->setLayerNormalMappingEnabled(false); mActiveProfile->setLayerParallaxMappingEnabled(false); mActiveProfile->setReceiveDynamicShadowsEnabled(false); + + //composite maps lead to a drastic reduction in loading time so are + //disabled mActiveProfile->setCompositeMapEnabled(false); mTerrainGroup = OGRE_NEW TerrainGroup(mgr, - Terrain::ALIGN_X_Z, - mLandSize, - mWorldSize); + Terrain::ALIGN_X_Z, + mLandSize, + mWorldSize); mTerrainGroup->setOrigin(Vector3(mWorldSize/2, - 0, - -mWorldSize/2)); + 0, + -mWorldSize/2)); - Terrain::ImportData& importSettings = - mTerrainGroup->getDefaultImportSettings(); + Terrain::ImportData& importSettings = mTerrainGroup->getDefaultImportSettings(); importSettings.inputBias = 0; importSettings.terrainSize = mLandSize; @@ -103,7 +102,6 @@ namespace MWRender const int cellX = store->cell->getGridX(); const int cellY = store->cell->getGridY(); - //split the cell terrain into four segments const int numTextures = ESM::Land::LAND_TEXTURE_SIZE/2; @@ -155,18 +153,14 @@ namespace MWRender numTextures, indexes); - // disable or enable global colour map (depends on available vertex colours) if ( store->land[1][1]->landData->usingColours ) + { + // disable or enable global colour map (depends on available vertex colours) mActiveProfile->setGlobalColourMapEnabled(true); - else - mActiveProfile->setGlobalColourMapEnabled(false); - - if ( store->land[1][1]->landData->usingColours ) - { TexturePtr vertex = getVertexColours(store, - x*(mLandSize-1), - y*(mLandSize-1), - mLandSize); + x*(mLandSize-1), + y*(mLandSize-1), + mLandSize); //this is a hack to get around the fact that Ogre seems to //corrupt the global colour map leading to rendering errors @@ -175,6 +169,10 @@ namespace MWRender //mat = terrain->_getCompositeMapMaterial(); //mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); } + else + { + mActiveProfile->setGlobalColourMapEnabled(false); + } } } } From 8910b0d471b52c52b1391d386b5b78d9da659881 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 4 Mar 2012 20:59:23 +0100 Subject: [PATCH 040/586] use shaders for all NIF materials. this has numerous advantages: - vertex colours are now working as they should (and they have a huge impact on the look) - the lighting is per pixel and looks a lot better - by using shaders, we can use more lights at a time (fixed function has max of 8) --- apps/openmw/mwrender/sky.cpp | 1 + components/nifogre/ogre_nif_loader.cpp | 131 +++++++++++++++++++++++++ 2 files changed, 132 insertions(+) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index b8bd588c4..dda95c188 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -439,6 +439,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); vshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); mAtmosphereMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName()); + mAtmosphereMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(""); // Clouds NifOgre::NIFLoader::load("meshes\\sky_clouds_01.nif"); diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 8b5540019..7ffc9561f 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -297,7 +297,138 @@ void NIFLoader::createMaterial(const String &name, material->setSelfIllumination(emissive.array[0], emissive.array[1], emissive.array[2]); material->setShininess(glossiness); + // Create shader for the material + // vertex + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); + HighLevelGpuProgramPtr vertex; + if (mgr.getByName("main_vp").isNull()) + { + vertex = mgr.createProgram("main_vp", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_VERTEX_PROGRAM); + vertex->setParameter("profiles", "vs_4_0 vs_2_x vp40 arbvp1"); + vertex->setParameter("entry_point", "main_vp"); + StringUtil::StrStreamType outStream; + outStream << + "void main_vp( \n" + " float4 position : POSITION, \n" + " float4 normal : NORMAL, \n" + " float4 colour : COLOR, \n" + " in float2 uv : TEXCOORD0, \n" + " out float2 oUV : TEXCOORD0, \n" + " out float4 oPosition : POSITION, \n" + " out float4 oPositionObjSpace : TEXCOORD1, \n" + " out float4 oNormal : TEXCOORD2, \n" + " out float oFogValue : TEXCOORD3, \n" + " out float4 oVertexColour : TEXCOORD4, \n" + " uniform float4 fogParams, \n" + " uniform float4x4 worldViewProj \n" + ") \n" + "{ \n" + " oVertexColour = colour; \n" + " oUV = uv; \n" + " oNormal = normal; \n" + " oPosition = mul( worldViewProj, position ); \n" + " oFogValue = saturate((oPosition.z - fogParams.y) * fogParams.w); \n" + " oPositionObjSpace = position; \n" + "}"; + vertex->setSource(outStream.str()); + vertex->load(); + vertex->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); + vertex->getDefaultParameters()->setNamedAutoConstant("fogParams", GpuProgramParameters::ACT_FOG_PARAMS); + } + else + vertex = mgr.getByName("main_vp"); + material->getTechnique(0)->getPass(0)->setVertexProgram(vertex->getName()); + + // the number of lights to support. + // when rendering an object, OGRE automatically picks the lights that are + // closest to the object being rendered. unfortunately this mechanism does + // not work perfectly for objects batched together (they will all use the same + // lights). to work around this, we are simply pushing the maximum number + // of lights here in order to minimize disappearing lights. + float num_lights; + if (GpuProgramManager::getSingleton().isSyntaxSupported("fp40") || + GpuProgramManager::getSingleton().isSyntaxSupported("ps_4_0")) + num_lights = 16 /* 32 */; + else + num_lights = 8; + + // fragment + HighLevelGpuProgramPtr fragment; + if (mgr.getByName("main_fp").isNull()) + { + fragment = mgr.createProgram("main_fp", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + "cg", GPT_FRAGMENT_PROGRAM); + fragment->setParameter("profiles", "ps_4_0 ps_2_x fp40 arbfp1"); + fragment->setParameter("entry_point", "main_fp"); + StringUtil::StrStreamType outStream; + outStream << + "void main_fp( \n" + " in float2 uv : TEXCOORD0, \n" + " out float4 oColor : COLOR, \n" + " uniform sampler2D texture : TEXUNIT0, \n" + " float4 positionObjSpace : TEXCOORD1, \n" + " float4 normal : TEXCOORD2, \n" + " float fogValue : TEXCOORD3, \n" + " float4 vertexColour : TEXCOORD4, \n" + " uniform float4 fogColour, \n"; + + for (int i=0; isetSource(outStream.str()); + fragment->load(); + + for (int i=0; igetDefaultParameters()->setNamedAutoConstant("lightPositionObjSpace"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE, i); + fragment->getDefaultParameters()->setNamedAutoConstant("lightDiffuse"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, i); + fragment->getDefaultParameters()->setNamedAutoConstant("lightAttenuation"+StringConverter::toString(i), GpuProgramParameters::ACT_LIGHT_ATTENUATION, i); + } + fragment->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); + fragment->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR); + fragment->getDefaultParameters()->setNamedAutoConstant("ambient", GpuProgramParameters::ACT_SURFACE_AMBIENT_COLOUR); + fragment->getDefaultParameters()->setNamedAutoConstant("lightAmbient", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR); + fragment->getDefaultParameters()->setNamedAutoConstant("fogColour", GpuProgramParameters::ACT_FOG_COLOUR); + } + else + fragment = mgr.getByName("main_fp"); + material->getTechnique(0)->getPass(0)->setFragmentProgram(fragment->getName()); } // Takes a name and adds a unique part to it. This is just used to From b2109a13028513bf4f81759b5cc880fd687f925d Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 4 Mar 2012 22:01:02 +0100 Subject: [PATCH 041/586] make the vertex colours only affect diffuse, this caused some areas to be darker than they should be --- components/nifogre/ogre_nif_loader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 7ffc9561f..3e11eda66 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -407,8 +407,8 @@ void NIFLoader::createMaterial(const String &name, } outStream << - " float3 lightingFinal = lightColour.xyz * diffuse.xyz + ambient.xyz * lightAmbient.xyz + emissive.xyz; \n" - " oColor.xyz = lerp(lightingFinal * tex.xyz * vertexColour.xyz, fogColour, fogValue); \n" + " float3 lightingFinal = lightColour.xyz * diffuse.xyz * vertexColour.xyz + ambient.xyz * lightAmbient.xyz + emissive.xyz; \n" + " oColor.xyz = lerp(lightingFinal * tex.xyz, fogColour, fogValue); \n" " oColor.a = tex.a * diffuse.a * vertexColour.a; \n" "}"; fragment->setSource(outStream.str()); From 332671b43d15f6859c4aebb3dda4399f7f678fc8 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 4 Mar 2012 22:26:40 +0100 Subject: [PATCH 042/586] lighting fix --- components/nifogre/ogre_nif_loader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 3e11eda66..91ac3918e 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -396,7 +396,7 @@ void NIFLoader::createMaterial(const String &name, for (int i=0; i Date: Sun, 4 Mar 2012 23:18:40 +0100 Subject: [PATCH 043/586] fix batch lighting, removed the "bumping number of lights" hack --- apps/openmw/mwrender/objects.cpp | 9 ++++++++- components/nifogre/ogre_nif_loader.cpp | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 4e2a3caab..896d78385 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -101,6 +101,14 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); //Create the scenenode and put it in the map mStaticGeometry[ptr.getCell()] = sg; + + // This specifies the size of a single batch region. + // If it is set too high: + // - there will be problems choosing the correct lights + // - the culling will be more inefficient + // If it is set too low: + // - there will be too many batches. + sg->setRegionDimensions(Ogre::Vector3(1000,1000,1000)); } else { @@ -108,7 +116,6 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) } sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); - sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); mRenderer.getScene()->destroyEntity(ent); } diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 91ac3918e..baf33d51f 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -350,7 +350,7 @@ void NIFLoader::createMaterial(const String &name, float num_lights; if (GpuProgramManager::getSingleton().isSyntaxSupported("fp40") || GpuProgramManager::getSingleton().isSyntaxSupported("ps_4_0")) - num_lights = 16 /* 32 */; + num_lights = 8 /* 32 */; else num_lights = 8; From 5328853445fbe2dc7b35df12e06167b973ea803e Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Thu, 8 Mar 2012 01:03:46 +0400 Subject: [PATCH 044/586] Feature #37 (In Progress) Render Path Grid added "togglepathgrid" script command --- CMakeLists.txt | 10 +++++-- apps/openmw/mwscript/docs/vmformat.txt | 5 ++-- apps/openmw/mwscript/miscextensions.cpp | 36 +++++++++++++++++++------ apps/openmw/mwworld/world.hpp | 15 ++++++----- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e116d875..60731c092 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,8 +255,14 @@ if (APPLE) "${APP_BUNDLE_DIR}/Contents/Resources/OpenMW.icns" COPYONLY) # prepare plugins - if (${CMAKE_BUILD_TYPE} MATCHES "Release" OR - ${CMAKE_BUILD_TYPE} MATCHES "RelWithDebugInfo") + if (${CMAKE_BUILD_TYPE} MATCHES "Release") + set(OPENMW_RELEASE_BUILD 1) + endif() + if (${CMAKE_BUILD_TYPE} MATCHES "Release") + set(OPENMW_RELEASE_BUILD 1) + endif() + + if (${OPENMW_RELEASE_BUILD}) set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_REL}) else() set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_DBG}) diff --git a/apps/openmw/mwscript/docs/vmformat.txt b/apps/openmw/mwscript/docs/vmformat.txt index 09b0c0482..efdc63a2d 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -115,10 +115,11 @@ op 0x2000136: GetPCCell op 0x2000137: GetButtonPressed op 0x2000138: SkipAnim op 0x2000139: SkipAnim, expplicit reference -op 0x200013b: twf +op 0x200013b: ToggleWireframe op 0x200013c: FadeIn op 0x200013d: FadeOut op 0x200013e: FadeTo op 0x200013f: GetCurrentWeather op 0x2000140: ChangeWeather -opcodes 0x2000141-0x3ffffff unused +op 0x2000141: TogglePathgrid +opcodes 0x2000142-0x3ffffff unused diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 5bfffd3a2..45189e698 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -106,7 +106,7 @@ namespace MWScript "Collision Mesh Rendering -> On" : "Collision Mesh Rendering -> Off"); } }; - + class OpToggleWireframe : public Interpreter::Opcode0 { public: @@ -123,7 +123,23 @@ namespace MWScript "Wireframe Rendering -> On" : "Wireframe Rendering -> Off"); } }; - + + class OpTogglePathgrind : public Interpreter::Opcode0 + { + public: + virtual void execute (Interpreter::Runtime& runtime) + { + InterpreterContext& context = + static_cast (runtime.getContext()); + + bool enabled = + context.getWorld().toggleRenderMode (MWWorld::World::Render_Wireframe); + + context.report (enabled ? + "Path Grid rendering -> On" : "Path Grid Rendering -> Off"); + } + }; + class OpFadeIn : public Interpreter::Opcode0 { public: @@ -135,11 +151,11 @@ namespace MWScript Interpreter::Type_Float time = runtime[0].mFloat; runtime.pop(); - + context.getWorld().getFader()->fadeIn(time); } }; - + class OpFadeOut : public Interpreter::Opcode0 { public: @@ -151,11 +167,11 @@ namespace MWScript Interpreter::Type_Float time = runtime[0].mFloat; runtime.pop(); - + context.getWorld().getFader()->fadeOut(time); } }; - + class OpFadeTo : public Interpreter::Opcode0 { public: @@ -167,10 +183,10 @@ namespace MWScript Interpreter::Type_Float alpha = runtime[0].mFloat; runtime.pop(); - + Interpreter::Type_Float time = runtime[0].mFloat; runtime.pop(); - + context.getWorld().getFader()->fadeTo(alpha, time); } }; @@ -187,6 +203,7 @@ namespace MWScript const int opcodeFadeIn = 0x200013c; const int opcodeFadeOut = 0x200013d; const int opcodeFadeTo = 0x200013e; + const int opcodeTogglePathgrid = 0x2000141; void registerExtensions (Compiler::Extensions& extensions) { @@ -204,6 +221,8 @@ namespace MWScript extensions.registerInstruction ("fadein", "f", opcodeFadeIn); extensions.registerInstruction ("fadeout", "f", opcodeFadeOut); extensions.registerInstruction ("fadeto", "ff", opcodeFadeTo); + extensions.registerInstruction ("togglepathgrid", "", opcodeTogglePathgrid); + extensions.registerInstruction ("tpg", "", opcodeTogglePathgrid); } void installOpcodes (Interpreter::Interpreter& interpreter) @@ -220,6 +239,7 @@ namespace MWScript interpreter.installSegment5 (opcodeFadeIn, new OpFadeIn); interpreter.installSegment5 (opcodeFadeOut, new OpFadeOut); interpreter.installSegment5 (opcodeFadeTo, new OpFadeTo); + interpreter.installSegment5 (opcodeTogglePathgrid, new OpTogglePathgrind); } } } diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 71cca3545..bd62be415 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -63,13 +63,14 @@ namespace MWWorld enum RenderMode { Render_CollisionDebug, - Render_Wireframe + Render_Wireframe, + Render_Pathgrid }; private: MWRender::RenderingManager* mRendering; - + MWWorld::WeatherManager* mWeatherManager; MWWorld::Scene *mWorldScene; @@ -106,13 +107,13 @@ namespace MWWorld Environment& environment, const std::string& encoding); ~World(); - + OEngine::Render::Fader* getFader(); Ptr::CellStore *getExterior (int x, int y); Ptr::CellStore *getInterior (const std::string& name); - + void adjustSky(); MWWorld::Player& getPlayer(); @@ -125,7 +126,7 @@ namespace MWWorld bool hasCellChanged() const; ///< Has the player moved to a different cell, since the last frame? - + bool isCellExterior() const; bool isCellQuasiExterior() const; @@ -163,9 +164,9 @@ namespace MWWorld bool toggleSky(); ///< \return Resulting mode - + void changeWeather(const std::string& region, const unsigned int id); - + int getCurrentWeather() const; int getMasserPhase() const; From 6357adffcf11da817d449a4aefd61a0f026cd89e Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Thu, 8 Mar 2012 01:09:06 +0400 Subject: [PATCH 045/586] Fixed typo --- apps/openmw/mwscript/miscextensions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 45189e698..36b8df70b 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -124,7 +124,7 @@ namespace MWScript } }; - class OpTogglePathgrind : public Interpreter::Opcode0 + class OpTogglePathgrid : public Interpreter::Opcode0 { public: virtual void execute (Interpreter::Runtime& runtime) @@ -239,7 +239,7 @@ namespace MWScript interpreter.installSegment5 (opcodeFadeIn, new OpFadeIn); interpreter.installSegment5 (opcodeFadeOut, new OpFadeOut); interpreter.installSegment5 (opcodeFadeTo, new OpFadeTo); - interpreter.installSegment5 (opcodeTogglePathgrid, new OpTogglePathgrind); + interpreter.installSegment5 (opcodeTogglePathgrid, new OpTogglePathgrid); } } } From 5b38b17baf090976496825446dbe9bbd6a20252e Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 10 Mar 2012 15:28:18 +0100 Subject: [PATCH 046/586] local map rendering (nothing to see yet, as it is not displayed in GUI) --- apps/openmw/CMakeLists.txt | 3 +- apps/openmw/mwrender/localmap.cpp | 160 ++++++++++++++++++++++ apps/openmw/mwrender/localmap.hpp | 48 +++++++ apps/openmw/mwrender/objects.cpp | 12 ++ apps/openmw/mwrender/objects.hpp | 4 + apps/openmw/mwrender/renderingmanager.cpp | 11 ++ apps/openmw/mwrender/renderingmanager.hpp | 6 + apps/openmw/mwworld/scene.cpp | 3 +- 8 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 apps/openmw/mwrender/localmap.cpp create mode 100644 apps/openmw/mwrender/localmap.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 39cd99cf6..2af808e9a 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -14,7 +14,8 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging sky player animation npcanimation creatureanimation actors objects renderinginterface + renderingmanager debugging sky player animation npcanimation creatureanimation actors objects + renderinginterface localmap ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp new file mode 100644 index 000000000..3e3ff77db --- /dev/null +++ b/apps/openmw/mwrender/localmap.cpp @@ -0,0 +1,160 @@ +#include "localmap.hpp" +#include "renderingmanager.hpp" + +#include +#include + +#include + +using namespace MWRender; +using namespace Ogre; + +#define CACHE_EXTENSION ".jpg" + +#define MAP_RESOLUTION 1024 // 1024*1024 pixels for a 8192*8192 area in world units + +LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) +{ + mRendering = rend; + + mCellCamera = mRendering->getScene()->createCamera("CellCamera"); + mCellCamera->setProjectionType(PT_ORTHOGRAPHIC); + // look down -y + const float sqrt0pt5 = 0.707106781; + mCellCamera->setOrientation(Quaternion(sqrt0pt5, -sqrt0pt5, 0, 0)); + + // Debug overlay to view the maps + /* + render(0, 0, 10000, 10000, 8192, 8192, "Cell_0_0"); + + MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0"); + + OverlayManager& ovm = OverlayManager::getSingleton(); + + Overlay* mOverlay = ovm.create( "testOverlay" ); + + OverlayContainer* overlay_panel; + overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel"); + + overlay_panel->_setPosition(0, 0); + overlay_panel->_setDimensions(0.5, 0.5); + + overlay_panel->setMaterialName( "testMaterial" ); + overlay_panel->show(); + mOverlay->add2D(overlay_panel); + mOverlay->show(); + */ +} + +void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell) +{ + std::string name = "Cell_" + StringConverter::toString(cell->cell->data.gridX) + + "_" + StringConverter::toString(cell->cell->data.gridY); + + const int x = cell->cell->data.gridX; + const int y = cell->cell->data.gridY; + + render((x+0.5)*8192, (-y-0.5)*8192, -10000, 10000, 8192, 8192, name); +} + +void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, + AxisAlignedBox bounds) +{ + Vector2 z(bounds.getMaximum().y, bounds.getMinimum().y); + Vector2 min(bounds.getMinimum().x, bounds.getMinimum().z); + Vector2 max(bounds.getMaximum().x, bounds.getMaximum().z); + + /// \todo why is this workaround needed? + min *= 1.3; + max *= 1.3; + + Vector2 length = max-min; + Vector2 center(bounds.getCenter().x, bounds.getCenter().z); + + // divide into 8192*8192 segments + const int segsX = std::ceil( length.x / 8192 ); + const int segsY = std::ceil( length.y / 8192 ); + + for (int x=0; xcell->name + "_" + StringConverter::toString(x) + "_" + StringConverter::toString(y)); + } + } +} + +void LocalMap::render(const float x, const float y, + const float zlow, const float zhigh, + const float xw, const float yw, const std::string& texture) +{ + // disable fog + // changing FOG_MODE is not a solution when using shaders, thus we have to push linear start/end + const float fStart = mRendering->getScene()->getFogStart(); + const float fEnd = mRendering->getScene()->getFogEnd(); + const ColourValue& clr = mRendering->getScene()->getFogColour(); + mRendering->getScene()->setFog(FOG_LINEAR, clr, 0, 1000000, 10000000); + + // make everything visible + mRendering->getScene()->setAmbientLight(ColourValue(1,1,1)); + + mCellCamera->setPosition(Vector3(x, zhigh, y)); + mCellCamera->setFarClipDistance( (zhigh-zlow) * 1.1 ); + + mCellCamera->setOrthoWindow(xw, yw); + + TexturePtr tex; + // try loading from memory + tex = TextureManager::getSingleton().getByName(texture); + if (tex.isNull()) + { + // try loading from disk + //if (boost::filesystem::exists(texture+CACHE_EXTENSION)) + //{ + /// \todo + //} + //else + { + // render + tex = TextureManager::getSingleton().createManual( + texture, + ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + TEX_TYPE_2D, + xw*MAP_RESOLUTION/8192, yw*MAP_RESOLUTION/8192, + 0, + PF_R8G8B8, + TU_RENDERTARGET); + + RenderTarget* rtt = tex->getBuffer()->getRenderTarget(); + rtt->setAutoUpdated(false); + Viewport* vp = rtt->addViewport(mCellCamera); + vp->setOverlaysEnabled(false); + vp->setShadowsEnabled(false); + vp->setBackgroundColour(ColourValue(0, 0, 0)); + //vp->setVisibilityMask( ... ); + + rtt->update(); + + /// \todo + // save to cache for next time + //rtt->writeContentsToFile("./" + texture + CACHE_EXTENSION); + } + } + + + /* + if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) + { + MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texture); + } + */ + + // re-enable fog + mRendering->getScene()->setFog(FOG_LINEAR, clr, 0, fStart, fEnd); +} diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp new file mode 100644 index 000000000..ac62031f4 --- /dev/null +++ b/apps/openmw/mwrender/localmap.hpp @@ -0,0 +1,48 @@ +#ifndef _GAME_RENDER_LOCALMAP_H +#define _GAME_RENDER_LOCALMAP_H + +#include "../mwworld/ptr.hpp" + +#include + +namespace MWRender +{ + /// + /// \brief Local map rendering + /// + class LocalMap + { + public: + LocalMap(OEngine::Render::OgreRenderer*); + + /** + * Request the local map for an exterior cell. + * It will either be loaded from a disk cache, + * or rendered if it is not already cached. + * @param exterior cell + */ + void requestMap (MWWorld::Ptr::CellStore* cell); + + /** + * Request the local map for an interior cell. + * It will either be loaded from a disk cache, + * or rendered if it is not already cached. + * @param interior cell + * @param bounding box of the cell + */ + void requestMap (MWWorld::Ptr::CellStore* cell, + Ogre::AxisAlignedBox bounds); + + private: + OEngine::Render::OgreRenderer* mRendering; + + Ogre::Camera* mCellCamera; + + void render(const float x, const float y, + const float zlow, const float zhigh, + const float xw, const float yw, + const std::string& texture); + }; + +} +#endif diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 717064ada..e4e721227 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -109,6 +109,9 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) // If it is set too low: // - there will be too many batches. sg->setRegionDimensions(Ogre::Vector3(2500,2500,2500)); + + mBounds[ptr.getCell()] = Ogre::AxisAlignedBox::BOX_NULL; + mBounds[ptr.getCell()].merge(ent->getBoundingBox()); } else { @@ -116,6 +119,7 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) } sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); + mBounds[ptr.getCell()].merge(insert->_getDerivedPosition()); mRenderer.getScene()->destroyEntity(ent); } @@ -202,6 +206,9 @@ void Objects::removeCell(MWWorld::Ptr::CellStore* store) mRenderer.getScene()->destroyStaticGeometry (sg); sg = 0; } + + if(mBounds.find(store) != mBounds.end()) + mBounds.erase(store); } void Objects::buildStaticGeometry(ESMS::CellStore& cell) @@ -212,3 +219,8 @@ void Objects::buildStaticGeometry(ESMS::CellStore& cell) sg->build(); } } + +Ogre::AxisAlignedBox Objects::getDimensions(MWWorld::Ptr::CellStore* cell) +{ + return mBounds[cell]; +} diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index d58455b9f..1ca81331d 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -14,6 +14,7 @@ class Objects{ OEngine::Render::OgreRenderer &mRenderer; std::map mCellSceneNodes; std::map mStaticGeometry; + std::map mBounds; Ogre::SceneNode* mMwRoot; bool mIsStatic; static int uniqueID; @@ -42,6 +43,9 @@ public: void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); + Ogre::AxisAlignedBox getDimensions(MWWorld::Ptr::CellStore*); + ///< get a bounding box that encloses all objects in the specified cell + bool deleteObject (const MWWorld::Ptr& ptr); ///< \return found? diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 7b58a80d7..41f4e72d6 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -55,6 +55,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; + + mLocalMap = new MWRender::LocalMap(&mRendering); } RenderingManager::~RenderingManager () @@ -62,6 +64,7 @@ RenderingManager::~RenderingManager () //TODO: destroy mSun? delete mPlayer; delete mSkyManager; + delete mLocalMap; } MWRender::SkyManager* RenderingManager::getSkyManager() @@ -322,4 +325,12 @@ void RenderingManager::setGlare(bool glare) mSkyManager->setGlare(glare); } +void RenderingManager::requestMap(MWWorld::Ptr::CellStore* cell) +{ + if (!(cell->cell->data.flags & ESM::Cell::Interior)) + mLocalMap->requestMap(cell); + else + mLocalMap->requestMap(cell, mObjects.getDimensions(cell)); +} + } // namespace diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index d84ee43e0..65aa46b01 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -24,6 +24,7 @@ #include "objects.hpp" #include "actors.hpp" #include "player.hpp" +#include "localmap.hpp" namespace Ogre { @@ -102,6 +103,9 @@ class RenderingManager: private RenderingInterface { int skyGetSecundaPhase() const; void skySetMoonColour (bool red); void configureAmbient(ESMS::CellStore &mCell); + + void requestMap (MWWorld::Ptr::CellStore* cell); + ///< request the local map for a cell /// configure fog according to cell void configureFog(ESMS::CellStore &mCell); @@ -148,6 +152,8 @@ class RenderingManager: private RenderingInterface { MWRender::Player *mPlayer; MWRender::Debugging mDebugging; + + MWRender::LocalMap* mLocalMap; }; } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 47d5f1a2d..e7a3f2d5d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -101,7 +101,8 @@ namespace MWWorld insertCell(*cell, mEnvironment); mRendering.cellAdded (cell); mRendering.configureAmbient(*cell); - + mRendering.requestMap(cell); + mRendering.configureAmbient(*cell); } From fa68be2b190919eb43d0219d849bbcbd1280ff7b Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 10 Mar 2012 16:05:12 +0100 Subject: [PATCH 047/586] set map window cell name --- apps/openmw/mwgui/window_manager.cpp | 5 +++++ apps/openmw/mwgui/window_manager.hpp | 2 ++ apps/openmw/mwworld/scene.cpp | 13 +++++++++++++ 3 files changed, 20 insertions(+) diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index aca9fbd9a..347db09e2 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -401,3 +401,8 @@ const ESMS::ESMStore& WindowManager::getStore() const { return environment.mWorld->getStore(); } + +void WindowManager::setCellName(const std::string& cellName) +{ + map->setCellName(cellName); +} diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 89ff4b9bb..258ab7993 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -151,6 +151,8 @@ namespace MWGui void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty + void setCellName(const std::string& cellName); ///< set the cell name to display in the map window + template void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted. diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index e7a3f2d5d..a63f6d150 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -6,6 +6,8 @@ #include "../mwsound/soundmanager.hpp" +#include "../mwgui/window_manager.hpp" + #include "ptr.hpp" #include "environment.hpp" #include "player.hpp" @@ -118,6 +120,17 @@ namespace MWWorld // TODO orientation mEnvironment.mMechanicsManager->addActor (mWorld->getPlayer().getPlayer()); mEnvironment.mMechanicsManager->watchActor (mWorld->getPlayer().getPlayer()); + + // set map window cell name + if (!(mCurrentCell->cell->data.flags & ESM::Cell::Interior)) + { + if (mCurrentCell->cell->name != "") + mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->name ); + else + mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->region ); + } + else + mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->name ); } void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos) From 11f957a64d677d0b1bed3574dc61eb378e090261 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Thu, 8 Mar 2012 10:46:34 +0400 Subject: [PATCH 048/586] Feature #37 (In Progress) Render Path Grid cubes for path grid points strange crash when trying to get path grids from Debugging --- apps/openmw/mwrender/debugging.cpp | 124 +++++++++++++++++++++- apps/openmw/mwrender/debugging.hpp | 35 ++++-- apps/openmw/mwrender/renderingmanager.cpp | 31 +++--- apps/openmw/mwrender/renderingmanager.hpp | 18 ++-- apps/openmw/mwscript/miscextensions.cpp | 2 +- components/esm_store/cell_store.hpp | 4 + components/esm_store/reclists.hpp | 8 +- 7 files changed, 186 insertions(+), 36 deletions(-) diff --git a/apps/openmw/mwrender/debugging.cpp b/apps/openmw/mwrender/debugging.cpp index 60b299acd..f1e601af5 100644 --- a/apps/openmw/mwrender/debugging.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -12,27 +12,141 @@ #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/ptr.hpp" #include +#include #include "player.hpp" using namespace MWRender; using namespace Ogre; -Debugging::Debugging(OEngine::Physic::PhysicEngine* engine){ - eng = engine; +Debugging::Debugging(const ESMS::ESMStore &store, SceneManager* sceneMgr, OEngine::Physic::PhysicEngine *engine) : + mStore(store), mSceneMgr(sceneMgr), mEngine(engine), pathgridEnabled(false) +{ } bool Debugging::toggleRenderMode (int mode){ - switch (mode) + switch (mode) { case MWWorld::World::Render_CollisionDebug: // TODO use a proper function instead of accessing the member variable // directly. - eng->setDebugRenderingMode (!eng->isDebugCreated); - return eng->isDebugCreated; + mEngine->setDebugRenderingMode (!mEngine->isDebugCreated); + return mEngine->isDebugCreated; + case MWWorld::World::Render_Pathgrid: + togglePathgrid(); + return pathgridEnabled; } return false; } + +void Debugging::cellAdded(MWWorld::Ptr::CellStore *store) +{ + std::cout << "Cell added to debugging" << std::endl; + mActiveCells.push_back(store); + if (pathgridEnabled) + togglePathgridForCell(store, true); +} + +void Debugging::cellRemoved(MWWorld::Ptr::CellStore *store) +{ + mActiveCells.erase(std::remove(mActiveCells.begin(), mActiveCells.end(), store), mActiveCells.end()); + std::cout << "Cell removed from debugging, active cells count: " << mActiveCells.size() << std::endl; + if (pathgridEnabled) + togglePathgridForCell(store, false); +} + +void Debugging::togglePathgrid() +{ + pathgridEnabled = !pathgridEnabled; + if (pathgridEnabled) + { + // add path grid meshes to already loaded cells + mPathGridRoot = mSceneMgr->getRootSceneNode()->createChildSceneNode(); + for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) + { + togglePathgridForCell(*it, true); + } + } + else { + // remove path grid meshes from already loaded cells + for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) + { + togglePathgridForCell(*it, false); + } + mPathGridRoot->removeAndDestroyAllChildren(); + mSceneMgr->destroySceneNode(mPathGridRoot); + } +} + +void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled) +{ + ESM::Pathgrid *pathgrid = mStore.pathgrids.search(*store->cell); + if (!pathgrid) + { + std::cout << "No path grid :(" << std::endl; + return; + } + std::cout << "Path grid exists!" << std::endl; + + if (enabled) + { + Vector3 cellPathGridPos; + if (!(store->cell->data.flags & ESM::Cell::Interior)) + { + /// \todo Replace with ESM::Land::REAL_SIZE after merging with terrain branch + cellPathGridPos.x = store->cell->data.gridX * 8192; + cellPathGridPos.z = -store->cell->data.gridY * 8192; + } + SceneNode *cellPathGrid = mPathGridRoot->createChildSceneNode(cellPathGridPos); + ESM::Pathgrid::PointList points = pathgrid->points; + for (ESM::Pathgrid::PointList::iterator it = points.begin(); it != points.end(); it++) + { + Vector3 position(it->x, it->z, -it->y); + SceneNode* pointNode = cellPathGrid->createChildSceneNode(position); + pointNode->setScale(0.5, 0.5, 0.5); + Entity *pointMesh = mSceneMgr->createEntity(SceneManager::PT_CUBE); + pointNode->attachObject(pointMesh); + } + + if (!(store->cell->data.flags & ESM::Cell::Interior)) + { + mExteriorPathgridNodes[std::make_pair(store->cell->data.gridX, store->cell->data.gridY)] = cellPathGrid; + } + else + { + assert(mInteriorPathgridNode == NULL); + mInteriorPathgridNode = cellPathGrid; + } + } + else + { + /// \todo Don't forget to destroy cubes too! + SceneNode *cellPathGridNode; + if (!(store->cell->data.flags & ESM::Cell::Interior)) + { + ExteriorPathgridNodes::iterator it = + mExteriorPathgridNodes.find(std::make_pair(store->cell->data.gridX, store->cell->data.gridY)); + if (it != mExteriorPathgridNodes.end()) + { + cellPathGridNode = it->second; + mPathGridRoot->removeChild(cellPathGridNode); + cellPathGridNode->removeAndDestroyAllChildren(); + mSceneMgr->destroySceneNode(cellPathGridNode); + mExteriorPathgridNodes.erase(it); + } + } + else + { + if (mInteriorPathgridNode) + { + mPathGridRoot->removeChild(mInteriorPathgridNode); + mInteriorPathgridNode->removeAndDestroyAllChildren(); + mSceneMgr->destroySceneNode(mInteriorPathgridNode); + mInteriorPathgridNode = NULL; + } + } + } +} diff --git a/apps/openmw/mwrender/debugging.hpp b/apps/openmw/mwrender/debugging.hpp index b48cfaee2..2258fec21 100644 --- a/apps/openmw/mwrender/debugging.hpp +++ b/apps/openmw/mwrender/debugging.hpp @@ -4,6 +4,7 @@ #include #include #include +#include "../mwworld/ptr.hpp" #include #include @@ -28,14 +29,36 @@ namespace MWRender { class Player; - class Debugging{ - OEngine::Physic::PhysicEngine* eng; + class Debugging + { + OEngine::Physic::PhysicEngine* mEngine; + Ogre::SceneManager* mSceneMgr; + const ESMS::ESMStore& mStore; + // Path grid stuff + bool pathgridEnabled; - public: - Debugging(OEngine::Physic::PhysicEngine* engine); - bool toggleRenderMode (int mode); - }; + void togglePathgrid(); + + typedef std::vector CellList; + + CellList mActiveCells; + + Ogre::SceneNode *mPathGridRoot; + Ogre::SceneNode *mInteriorPathgridNode; + + typedef std::map, Ogre::SceneNode *> ExteriorPathgridNodes; + ExteriorPathgridNodes mExteriorPathgridNodes; + + void togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled); + + public: + Debugging(const ESMS::ESMStore &store, Ogre::SceneManager *mSceneMgr, OEngine::Physic::PhysicEngine* engine); + bool toggleRenderMode (int mode); + + void cellAdded(MWWorld::Ptr::CellStore* store); + void cellRemoved(MWWorld::Ptr::CellStore* store); + }; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 7b58a80d7..94197108d 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -20,10 +20,12 @@ using namespace Ogre; namespace MWRender { RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine, MWWorld::Environment& environment) -:mRendering(_rend), mObjects(mRendering), mActors(mRendering, environment), mAmbientMode(0), mDebugging(engine) + :mRendering(_rend), mObjects(mRendering), mActors(mRendering, environment), mAmbientMode(0) { mRendering.createScene("PlayerCam", 55, 5); + mDebugging = new Debugging(environment.mWorld->getStore(), mRendering.getScene(), engine); + // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -40,7 +42,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mMwRoot->pitch(Degree(-90)); mObjects.setMwRoot(mMwRoot); mActors.setMwRoot(mMwRoot); - + //used to obtain ingame information of ogre objects (which are faced or selected) mRaySceneQuery = mRendering.getScene()->createRayQuery(Ray()); @@ -49,7 +51,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); cameraPitchNode->attachObject(mRendering.getCamera()); - + //mSkyManager = 0; mSkyManager = new SkyManager(mMwRoot, mRendering.getCamera()); @@ -62,6 +64,7 @@ RenderingManager::~RenderingManager () //TODO: destroy mSun? delete mPlayer; delete mSkyManager; + delete mDebugging; } MWRender::SkyManager* RenderingManager::getSkyManager() @@ -88,11 +91,13 @@ OEngine::Render::Fader* RenderingManager::getFader() void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ mObjects.removeCell(store); mActors.removeCell(store); + mDebugging->cellRemoved(store); } void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store) { mObjects.buildStaticGeometry (*store); + mDebugging->cellAdded(store); } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ @@ -133,9 +138,9 @@ void RenderingManager::moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Ve void RenderingManager::update (float duration){ mActors.update (duration); - + mSkyManager->update(duration); - + mRendering.update(duration); } @@ -166,7 +171,7 @@ void RenderingManager::skySetDate (int day, int month) int RenderingManager::skyGetMasserPhase() const { - + return mSkyManager->getMasserPhase(); } @@ -182,8 +187,8 @@ void RenderingManager::skySetMoonColour (bool red){ bool RenderingManager::toggleRenderMode(int mode) { - if (mode == MWWorld::World::Render_CollisionDebug) - return mDebugging.toggleRenderMode(mode); + if (mode != MWWorld::World::Render_Wireframe) + return mDebugging->toggleRenderMode(mode); else // if (mode == MWWorld::World::Render_Wireframe) { if (mRendering.getCamera()->getPolygonMode() == PM_SOLID) @@ -208,13 +213,13 @@ void RenderingManager::configureFog(ESMS::CellStore &mCell) } void RenderingManager::configureFog(const float density, const Ogre::ColourValue& colour) -{ +{ /// \todo make the viewing distance and fog start/end configurable float low = 3000 / density; float high = 6200 / density; - + mRendering.getScene()->setFog (FOG_LINEAR, colour, 0, low, high); - + mRendering.getCamera()->setFarClipDistance ( high ); mRendering.getViewport()->setBackgroundColour (colour); } @@ -310,10 +315,10 @@ void RenderingManager::sunDisable() void RenderingManager::setSunDirection(const Ogre::Vector3& direction) { - // direction * -1 (because 'direction' is camera to sun vector and not sun to camera), + // direction * -1 (because 'direction' is camera to sun vector and not sun to camera), // then convert from MW to ogre coordinates (swap y,z and make y negative) if (mSun) mSun->setDirection(Vector3(-direction.x, -direction.z, direction.y)); - + mSkyManager->setSunDirection(direction); } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index d84ee43e0..9be389272 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -66,7 +66,7 @@ class RenderingManager: private RenderingInterface { void toggleLight(); bool toggleRenderMode(int mode); - + OEngine::Render::Fader* getFader(); void removeCell (MWWorld::Ptr::CellStore *store); @@ -86,13 +86,13 @@ class RenderingManager: private RenderingInterface { void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); void update (float duration); - + void setAmbientColour(const Ogre::ColourValue& colour); void setSunColour(const Ogre::ColourValue& colour); void setSunDirection(const Ogre::Vector3& direction); void sunEnable(); void sunDisable(); - + void setGlare(bool glare); void skyEnable (); void skyDisable (); @@ -102,13 +102,13 @@ class RenderingManager: private RenderingInterface { int skyGetSecundaPhase() const; void skySetMoonColour (bool red); void configureAmbient(ESMS::CellStore &mCell); - + /// configure fog according to cell void configureFog(ESMS::CellStore &mCell); - + /// configure fog manually void configureFog(const float density, const Ogre::ColourValue& colour); - + void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number = 1); ///< Run animation for a MW-reference. Calls to this function for references that are currently not @@ -124,9 +124,9 @@ class RenderingManager: private RenderingInterface { private: void setAmbientMode(); - + SkyManager* mSkyManager; - + OEngine::Render::OgreRenderer &mRendering; MWRender::Objects mObjects; @@ -147,7 +147,7 @@ class RenderingManager: private RenderingInterface { OEngine::Physic::PhysicEngine* mPhysicsEngine; MWRender::Player *mPlayer; - MWRender::Debugging mDebugging; + MWRender::Debugging *mDebugging; }; } diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 36b8df70b..425fa3727 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -133,7 +133,7 @@ namespace MWScript static_cast (runtime.getContext()); bool enabled = - context.getWorld().toggleRenderMode (MWWorld::World::Render_Wireframe); + context.getWorld().toggleRenderMode (MWWorld::World::Render_Pathgrid); context.report (enabled ? "Path Grid rendering -> On" : "Path Grid Rendering -> Off"); diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index c4bcf84d8..4f5b6b6ec 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -123,6 +123,8 @@ namespace ESMS CellRefList statics; CellRefList weapons; + ESM::Pathgrid *pathgrid; + void load (const ESMStore &store, ESMReader &esm) { if (mState!=State_Loaded) @@ -134,6 +136,8 @@ namespace ESMS loadRefs (store, esm); + pathgrid = store.pathgrids.search(*cell); + mState = State_Loaded; } } diff --git a/components/esm_store/reclists.hpp b/components/esm_store/reclists.hpp index 4aacf2332..da6e9b3d5 100644 --- a/components/esm_store/reclists.hpp +++ b/components/esm_store/reclists.hpp @@ -428,14 +428,16 @@ namespace ESMS if (grid->data.x == 0 && grid->data.y == 0) { intGrids[grid->cell] = grid; + std::cout << "int grids size " << intGrids.size() << std::endl; } else { extGrids[std::make_pair(grid->data.x, grid->data.y)] = grid; + std::cout << "ext grids size " << extGrids.size() << std::endl; } } - Pathgrid *find(int cellX, int cellY, std::string cellName) const + Pathgrid *find(int cellX, int cellY, const std::string &cellName) const { Pathgrid *result = search(cellX, cellY, cellName); if (!result) @@ -445,8 +447,10 @@ namespace ESMS return result; } - Pathgrid *search(int cellX, int cellY, std::string cellName) const + Pathgrid *search(int cellX, int cellY, const std::string &cellName) const { + std::cout << "int grids size " << intGrids.size() << std::endl; + std::cout << "ext grids size " << extGrids.size() << std::endl; Pathgrid *result = NULL; if (cellX == 0 && cellY == 0) // possibly interior { From 4659076129de9185e3b0f6e7d11ff28c1fe9df61 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Sat, 10 Mar 2012 20:45:55 +0400 Subject: [PATCH 049/586] Feature #37 (In Progress) Render Path Grid workaround for strange ESMStore bug --- apps/openmw/mwrender/debugging.cpp | 7 ++++--- apps/openmw/mwrender/debugging.hpp | 6 ++++-- apps/openmw/mwrender/renderingmanager.cpp | 2 +- components/esm_store/cell_store.hpp | 4 ---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwrender/debugging.cpp b/apps/openmw/mwrender/debugging.cpp index f1e601af5..8df4850db 100644 --- a/apps/openmw/mwrender/debugging.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -10,6 +10,7 @@ #include "OgreTextureManager.h" #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone +#include "../mwworld/environment.hpp" #include "../mwworld/ptr.hpp" #include #include @@ -19,8 +20,8 @@ using namespace MWRender; using namespace Ogre; -Debugging::Debugging(const ESMS::ESMStore &store, SceneManager* sceneMgr, OEngine::Physic::PhysicEngine *engine) : - mStore(store), mSceneMgr(sceneMgr), mEngine(engine), pathgridEnabled(false) +Debugging::Debugging(MWWorld::Environment &env, SceneManager* sceneMgr, OEngine::Physic::PhysicEngine *engine) : + mEnvironment(env), mSceneMgr(sceneMgr), mEngine(engine), pathgridEnabled(false) { } @@ -83,7 +84,7 @@ void Debugging::togglePathgrid() void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled) { - ESM::Pathgrid *pathgrid = mStore.pathgrids.search(*store->cell); + ESM::Pathgrid *pathgrid = mEnvironment.mWorld->getStore().pathgrids.search(*store->cell); if (!pathgrid) { std::cout << "No path grid :(" << std::endl; diff --git a/apps/openmw/mwrender/debugging.hpp b/apps/openmw/mwrender/debugging.hpp index 2258fec21..2b47eb773 100644 --- a/apps/openmw/mwrender/debugging.hpp +++ b/apps/openmw/mwrender/debugging.hpp @@ -23,6 +23,7 @@ namespace Ogre namespace MWWorld { class World; + class Environment; } namespace MWRender @@ -33,7 +34,8 @@ namespace MWRender { OEngine::Physic::PhysicEngine* mEngine; Ogre::SceneManager* mSceneMgr; - const ESMS::ESMStore& mStore; + MWWorld::Environment& mEnvironment; + //const ESMS::ESMStore& mStore; // Path grid stuff bool pathgridEnabled; @@ -53,7 +55,7 @@ namespace MWRender void togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled); public: - Debugging(const ESMS::ESMStore &store, Ogre::SceneManager *mSceneMgr, OEngine::Physic::PhysicEngine* engine); + Debugging(MWWorld::Environment &env, Ogre::SceneManager *mSceneMgr, OEngine::Physic::PhysicEngine* engine); bool toggleRenderMode (int mode); void cellAdded(MWWorld::Ptr::CellStore* store); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 94197108d..4cb8b42fa 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -24,7 +24,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const { mRendering.createScene("PlayerCam", 55, 5); - mDebugging = new Debugging(environment.mWorld->getStore(), mRendering.getScene(), engine); + mDebugging = new Debugging(environment, mRendering.getScene(), engine); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index 4f5b6b6ec..c4bcf84d8 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -123,8 +123,6 @@ namespace ESMS CellRefList statics; CellRefList weapons; - ESM::Pathgrid *pathgrid; - void load (const ESMStore &store, ESMReader &esm) { if (mState!=State_Loaded) @@ -136,8 +134,6 @@ namespace ESMS loadRefs (store, esm); - pathgrid = store.pathgrids.search(*cell); - mState = State_Loaded; } } From 387c84e60631399ac86dcd24e4b5cd53e4bd510d Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Sun, 11 Mar 2012 18:46:32 +0400 Subject: [PATCH 050/586] small fix in CMakeLists, thx ace13 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 60731c092..ce0354290 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,7 +258,7 @@ if (APPLE) if (${CMAKE_BUILD_TYPE} MATCHES "Release") set(OPENMW_RELEASE_BUILD 1) endif() - if (${CMAKE_BUILD_TYPE} MATCHES "Release") + if (${CMAKE_BUILD_TYPE} MATCHES "RelWithDebugInfo") set(OPENMW_RELEASE_BUILD 1) endif() From f292a5a7ca8295d61b6bf6c9f6fd9850b750ae6c Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Mon, 12 Mar 2012 02:12:56 +0400 Subject: [PATCH 051/586] Feature #37 (In Progress) Render Path Grid now using mwRoot instead of ogre's root, so no more messing with coordinates. --- apps/openmw/mwrender/debugging.cpp | 55 ++++++++++++++--------- apps/openmw/mwrender/debugging.hpp | 8 ++-- apps/openmw/mwrender/renderingmanager.cpp | 4 +- components/esm_store/reclists.hpp | 4 -- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/apps/openmw/mwrender/debugging.cpp b/apps/openmw/mwrender/debugging.cpp index 8df4850db..ebaab5703 100644 --- a/apps/openmw/mwrender/debugging.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -2,12 +2,8 @@ #include -#include "OgreRoot.h" -#include "OgreRenderWindow.h" -#include "OgreSceneManager.h" -#include "OgreViewport.h" -#include "OgreCamera.h" -#include "OgreTextureManager.h" +#include +#include #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/environment.hpp" @@ -20,8 +16,11 @@ using namespace MWRender; using namespace Ogre; -Debugging::Debugging(MWWorld::Environment &env, SceneManager* sceneMgr, OEngine::Physic::PhysicEngine *engine) : - mEnvironment(env), mSceneMgr(sceneMgr), mEngine(engine), pathgridEnabled(false) +Debugging::Debugging(SceneNode *mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine) : + mMwRoot(mwRoot), mEnvironment(env), mEngine(engine), + mSceneMgr(mwRoot->getCreator()), + pathgridEnabled(false), + mInteriorPathgridNode(NULL), mPathGridRoot(NULL) { } @@ -65,7 +64,7 @@ void Debugging::togglePathgrid() if (pathgridEnabled) { // add path grid meshes to already loaded cells - mPathGridRoot = mSceneMgr->getRootSceneNode()->createChildSceneNode(); + mPathGridRoot = mMwRoot->createChildSceneNode(); for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) { togglePathgridForCell(*it, true); @@ -79,6 +78,7 @@ void Debugging::togglePathgrid() } mPathGridRoot->removeAndDestroyAllChildren(); mSceneMgr->destroySceneNode(mPathGridRoot); + mPathGridRoot = NULL; } } @@ -87,25 +87,24 @@ void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabl ESM::Pathgrid *pathgrid = mEnvironment.mWorld->getStore().pathgrids.search(*store->cell); if (!pathgrid) { - std::cout << "No path grid :(" << std::endl; return; } - std::cout << "Path grid exists!" << std::endl; if (enabled) { Vector3 cellPathGridPos; + /// \todo replace tests like this with isExterior method of ESM::Cell after merging with terrain branch if (!(store->cell->data.flags & ESM::Cell::Interior)) { /// \todo Replace with ESM::Land::REAL_SIZE after merging with terrain branch cellPathGridPos.x = store->cell->data.gridX * 8192; - cellPathGridPos.z = -store->cell->data.gridY * 8192; + cellPathGridPos.y = store->cell->data.gridY * 8192; } SceneNode *cellPathGrid = mPathGridRoot->createChildSceneNode(cellPathGridPos); ESM::Pathgrid::PointList points = pathgrid->points; for (ESM::Pathgrid::PointList::iterator it = points.begin(); it != points.end(); it++) { - Vector3 position(it->x, it->z, -it->y); + Vector3 position(it->x, it->y, it->z); SceneNode* pointNode = cellPathGrid->createChildSceneNode(position); pointNode->setScale(0.5, 0.5, 0.5); Entity *pointMesh = mSceneMgr->createEntity(SceneManager::PT_CUBE); @@ -124,18 +123,13 @@ void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabl } else { - /// \todo Don't forget to destroy cubes too! - SceneNode *cellPathGridNode; if (!(store->cell->data.flags & ESM::Cell::Interior)) { ExteriorPathgridNodes::iterator it = mExteriorPathgridNodes.find(std::make_pair(store->cell->data.gridX, store->cell->data.gridY)); if (it != mExteriorPathgridNodes.end()) { - cellPathGridNode = it->second; - mPathGridRoot->removeChild(cellPathGridNode); - cellPathGridNode->removeAndDestroyAllChildren(); - mSceneMgr->destroySceneNode(cellPathGridNode); + destroyCellPathgridNode(it->second); mExteriorPathgridNodes.erase(it); } } @@ -143,11 +137,28 @@ void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabl { if (mInteriorPathgridNode) { - mPathGridRoot->removeChild(mInteriorPathgridNode); - mInteriorPathgridNode->removeAndDestroyAllChildren(); - mSceneMgr->destroySceneNode(mInteriorPathgridNode); + destroyCellPathgridNode(mInteriorPathgridNode); mInteriorPathgridNode = NULL; } } } } + +void Debugging::destroyCellPathgridNode(SceneNode *node) +{ + mPathGridRoot->removeChild(node); + + SceneNode::ChildNodeIterator childIt = node->getChildIterator(); + while (childIt.hasMoreElements()) + { + SceneNode *child = static_cast(childIt.getNext()); + SceneNode::ObjectIterator objIt = child->getAttachedObjectIterator(); + while (objIt.hasMoreElements()) + { + MovableObject *mesh = static_cast(objIt.getNext()); + child->getCreator()->destroyMovableObject(mesh); + } + } + node->removeAndDestroyAllChildren(); + mSceneMgr->destroySceneNode(node); +} diff --git a/apps/openmw/mwrender/debugging.hpp b/apps/openmw/mwrender/debugging.hpp index 2b47eb773..eb592b98d 100644 --- a/apps/openmw/mwrender/debugging.hpp +++ b/apps/openmw/mwrender/debugging.hpp @@ -33,9 +33,8 @@ namespace MWRender class Debugging { OEngine::Physic::PhysicEngine* mEngine; - Ogre::SceneManager* mSceneMgr; + Ogre::SceneManager *mSceneMgr; MWWorld::Environment& mEnvironment; - //const ESMS::ESMStore& mStore; // Path grid stuff bool pathgridEnabled; @@ -46,6 +45,7 @@ namespace MWRender CellList mActiveCells; + Ogre::SceneNode *mMwRoot; Ogre::SceneNode *mPathGridRoot; Ogre::SceneNode *mInteriorPathgridNode; @@ -54,8 +54,10 @@ namespace MWRender void togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled); + void destroyCellPathgridNode(Ogre::SceneNode *node); + public: - Debugging(MWWorld::Environment &env, Ogre::SceneManager *mSceneMgr, OEngine::Physic::PhysicEngine* engine); + Debugging(Ogre::SceneNode* mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine); bool toggleRenderMode (int mode); void cellAdded(MWWorld::Ptr::CellStore* store); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 4cb8b42fa..888012280 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -24,8 +24,6 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const { mRendering.createScene("PlayerCam", 55, 5); - mDebugging = new Debugging(environment, mRendering.getScene(), engine); - // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -57,6 +55,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; + + mDebugging = new Debugging(mMwRoot, environment, engine); } RenderingManager::~RenderingManager () diff --git a/components/esm_store/reclists.hpp b/components/esm_store/reclists.hpp index da6e9b3d5..f2c07dda5 100644 --- a/components/esm_store/reclists.hpp +++ b/components/esm_store/reclists.hpp @@ -428,12 +428,10 @@ namespace ESMS if (grid->data.x == 0 && grid->data.y == 0) { intGrids[grid->cell] = grid; - std::cout << "int grids size " << intGrids.size() << std::endl; } else { extGrids[std::make_pair(grid->data.x, grid->data.y)] = grid; - std::cout << "ext grids size " << extGrids.size() << std::endl; } } @@ -449,8 +447,6 @@ namespace ESMS Pathgrid *search(int cellX, int cellY, const std::string &cellName) const { - std::cout << "int grids size " << intGrids.size() << std::endl; - std::cout << "ext grids size " << extGrids.size() << std::endl; Pathgrid *result = NULL; if (cellX == 0 && cellY == 0) // possibly interior { From d22678faab028d31283d4ef0ccbd26c14f19d5ef Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 13 Mar 2012 17:14:02 +0100 Subject: [PATCH 052/586] fixed wrong merge --- CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc1dea25c..18c312229 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,6 +255,20 @@ if (APPLE) configure_file(${OpenMW_SOURCE_DIR}/files/mac/openmw.icns "${APP_BUNDLE_DIR}/Contents/Resources/OpenMW.icns" COPYONLY) + # prepare plugins + if (${CMAKE_BUILD_TYPE} MATCHES "Release") + set(OPENMW_RELEASE_BUILD 1) + endif() + if (${CMAKE_BUILD_TYPE} MATCHES "RelWithDebugInfo") + set(OPENMW_RELEASE_BUILD 1) + endif() + + if (${OPENMW_RELEASE_BUILD}) + set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_REL}) + else() + set(OGRE_PLUGIN_DIR ${OGRE_PLUGIN_DIR_DBG}) + endif() + foreach(plugin ${USED_OGRE_PLUGINS}) configure_file("${OGRE_PLUGIN_DIR}/${plugin}.dylib" "${APP_BUNDLE_DIR}/Contents/Plugins/${plugin}.dylib" From 3a705baa29c9887057a20ee5f4586121e53efee9 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Wed, 14 Mar 2012 03:06:56 +0400 Subject: [PATCH 053/586] Feature #37 (In Progress) Render Path Grid added simple pathgrid edges --- apps/openmw/mwrender/debugging.cpp | 162 +++++++++++++++++++---------- apps/openmw/mwrender/debugging.hpp | 6 +- 2 files changed, 113 insertions(+), 55 deletions(-) diff --git a/apps/openmw/mwrender/debugging.cpp b/apps/openmw/mwrender/debugging.cpp index ebaab5703..3b01d4b36 100644 --- a/apps/openmw/mwrender/debugging.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -13,15 +13,51 @@ #include "player.hpp" -using namespace MWRender; using namespace Ogre; +namespace MWRender +{ + +static const std::string PATHGRID_LINE_MATERIAL = "pathgridLineMaterial"; +static const std::string DEBUGGING_GROUP = "debugging"; + +ManualObject *createPathgridLine(SceneManager* sceneMgr, const Vector3& from, const Vector3& to) +{ + ManualObject *line = sceneMgr->createManualObject(); + if (MaterialManager::getSingleton().getByName(PATHGRID_LINE_MATERIAL, DEBUGGING_GROUP).isNull()) + { + MaterialPtr lineMatPtr = MaterialManager::getSingleton().create(PATHGRID_LINE_MATERIAL, DEBUGGING_GROUP); + lineMatPtr->setReceiveShadows(false); + lineMatPtr->getTechnique(0)->setLightingEnabled(true); + lineMatPtr->getTechnique(0)->getPass(0)->setDiffuse(1,1,0,0); + lineMatPtr->getTechnique(0)->getPass(0)->setAmbient(1,1,0); + lineMatPtr->getTechnique(0)->getPass(0)->setSelfIllumination(1,1,0); + } + + line->begin(PATHGRID_LINE_MATERIAL, Ogre::RenderOperation::OT_LINE_LIST); + line->position(from); + line->position(to); + line->end(); + + return line; +} + +ManualObject *createPathgridPoint(SceneManager* sceneMgr, const Vector3& pos) +{ +} + Debugging::Debugging(SceneNode *mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine) : mMwRoot(mwRoot), mEnvironment(env), mEngine(engine), mSceneMgr(mwRoot->getCreator()), pathgridEnabled(false), mInteriorPathgridNode(NULL), mPathGridRoot(NULL) { + ResourceGroupManager::getSingleton().createResourceGroup(DEBUGGING_GROUP); +} + +Debugging::~Debugging() +{ + ResourceGroupManager::getSingleton().destroyResourceGroup(DEBUGGING_GROUP); } @@ -47,7 +83,7 @@ void Debugging::cellAdded(MWWorld::Ptr::CellStore *store) std::cout << "Cell added to debugging" << std::endl; mActiveCells.push_back(store); if (pathgridEnabled) - togglePathgridForCell(store, true); + enableCellPathgrid(store); } void Debugging::cellRemoved(MWWorld::Ptr::CellStore *store) @@ -55,7 +91,7 @@ void Debugging::cellRemoved(MWWorld::Ptr::CellStore *store) mActiveCells.erase(std::remove(mActiveCells.begin(), mActiveCells.end(), store), mActiveCells.end()); std::cout << "Cell removed from debugging, active cells count: " << mActiveCells.size() << std::endl; if (pathgridEnabled) - togglePathgridForCell(store, false); + disableCellPathgrid(store); } void Debugging::togglePathgrid() @@ -67,14 +103,14 @@ void Debugging::togglePathgrid() mPathGridRoot = mMwRoot->createChildSceneNode(); for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) { - togglePathgridForCell(*it, true); + enableCellPathgrid(*it); } } else { // remove path grid meshes from already loaded cells for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) { - togglePathgridForCell(*it, false); + disableCellPathgrid(*it); } mPathGridRoot->removeAndDestroyAllChildren(); mSceneMgr->destroySceneNode(mPathGridRoot); @@ -82,7 +118,7 @@ void Debugging::togglePathgrid() } } -void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled) +void Debugging::enableCellPathgrid(MWWorld::Ptr::CellStore *store) { ESM::Pathgrid *pathgrid = mEnvironment.mWorld->getStore().pathgrids.search(*store->cell); if (!pathgrid) @@ -90,56 +126,65 @@ void Debugging::togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabl return; } - if (enabled) + Vector3 cellPathGridPos; + /// \todo replace tests like this with isExterior method of ESM::Cell after merging with terrain branch + if (!(store->cell->data.flags & ESM::Cell::Interior)) { - Vector3 cellPathGridPos; - /// \todo replace tests like this with isExterior method of ESM::Cell after merging with terrain branch - if (!(store->cell->data.flags & ESM::Cell::Interior)) - { - /// \todo Replace with ESM::Land::REAL_SIZE after merging with terrain branch - cellPathGridPos.x = store->cell->data.gridX * 8192; - cellPathGridPos.y = store->cell->data.gridY * 8192; - } - SceneNode *cellPathGrid = mPathGridRoot->createChildSceneNode(cellPathGridPos); - ESM::Pathgrid::PointList points = pathgrid->points; - for (ESM::Pathgrid::PointList::iterator it = points.begin(); it != points.end(); it++) - { - Vector3 position(it->x, it->y, it->z); - SceneNode* pointNode = cellPathGrid->createChildSceneNode(position); - pointNode->setScale(0.5, 0.5, 0.5); - Entity *pointMesh = mSceneMgr->createEntity(SceneManager::PT_CUBE); - pointNode->attachObject(pointMesh); - } + /// \todo Replace with ESM::Land::REAL_SIZE after merging with terrain branch + cellPathGridPos.x = store->cell->data.gridX * 8192; + cellPathGridPos.y = store->cell->data.gridY * 8192; + } + SceneNode *cellPathGrid = mPathGridRoot->createChildSceneNode(cellPathGridPos); + ESM::Pathgrid::PointList points = pathgrid->points; + for (ESM::Pathgrid::PointList::iterator it = points.begin(); it != points.end(); it++) + { + Vector3 position(it->x, it->y, it->z); + SceneNode* pointNode = cellPathGrid->createChildSceneNode(position); + pointNode->setScale(0.5, 0.5, 0.5); + Entity *pointMesh = mSceneMgr->createEntity(SceneManager::PT_CUBE); + pointNode->attachObject(pointMesh); + } - if (!(store->cell->data.flags & ESM::Cell::Interior)) - { - mExteriorPathgridNodes[std::make_pair(store->cell->data.gridX, store->cell->data.gridY)] = cellPathGrid; - } - else - { - assert(mInteriorPathgridNode == NULL); - mInteriorPathgridNode = cellPathGrid; - } + ESM::Pathgrid::EdgeList edges = pathgrid->edges; + for(ESM::Pathgrid::EdgeList::const_iterator it = edges.begin(); + it != edges.end(); it++) + { + ESM::Pathgrid::Edge edge = *it; + ESM::Pathgrid::Point p1 = points[edge.v0], p2 = points[edge.v1]; + cellPathGrid->attachObject(createPathgridLine(cellPathGrid->getCreator(), + Vector3(p1.x, p1.y, p1.z), + Vector3(p2.x, p2.y, p2.z))); + } + + if (!(store->cell->data.flags & ESM::Cell::Interior)) + { + mExteriorPathgridNodes[std::make_pair(store->cell->data.gridX, store->cell->data.gridY)] = cellPathGrid; } else { - if (!(store->cell->data.flags & ESM::Cell::Interior)) + assert(mInteriorPathgridNode == NULL); + mInteriorPathgridNode = cellPathGrid; + } +} + +void Debugging::disableCellPathgrid(MWWorld::Ptr::CellStore *store) +{ + if (!(store->cell->data.flags & ESM::Cell::Interior)) + { + ExteriorPathgridNodes::iterator it = + mExteriorPathgridNodes.find(std::make_pair(store->cell->data.gridX, store->cell->data.gridY)); + if (it != mExteriorPathgridNodes.end()) { - ExteriorPathgridNodes::iterator it = - mExteriorPathgridNodes.find(std::make_pair(store->cell->data.gridX, store->cell->data.gridY)); - if (it != mExteriorPathgridNodes.end()) - { - destroyCellPathgridNode(it->second); - mExteriorPathgridNodes.erase(it); - } + destroyCellPathgridNode(it->second); + mExteriorPathgridNodes.erase(it); } - else + } + else + { + if (mInteriorPathgridNode) { - if (mInteriorPathgridNode) - { - destroyCellPathgridNode(mInteriorPathgridNode); - mInteriorPathgridNode = NULL; - } + destroyCellPathgridNode(mInteriorPathgridNode); + mInteriorPathgridNode = NULL; } } } @@ -148,17 +193,26 @@ void Debugging::destroyCellPathgridNode(SceneNode *node) { mPathGridRoot->removeChild(node); + /// \todo should object be killed by hand or removeAndDestroyAllChildren is sufficient? SceneNode::ChildNodeIterator childIt = node->getChildIterator(); while (childIt.hasMoreElements()) { SceneNode *child = static_cast(childIt.getNext()); - SceneNode::ObjectIterator objIt = child->getAttachedObjectIterator(); - while (objIt.hasMoreElements()) - { - MovableObject *mesh = static_cast(objIt.getNext()); - child->getCreator()->destroyMovableObject(mesh); - } + destroyAttachedObjects(child); } + destroyAttachedObjects(node); node->removeAndDestroyAllChildren(); mSceneMgr->destroySceneNode(node); } + +void Debugging::destroyAttachedObjects(SceneNode *node) +{ + SceneNode::ObjectIterator objIt = node->getAttachedObjectIterator(); + while (objIt.hasMoreElements()) + { + MovableObject *mesh = static_cast(objIt.getNext()); + node->getCreator()->destroyMovableObject(mesh); + } +} + +} diff --git a/apps/openmw/mwrender/debugging.hpp b/apps/openmw/mwrender/debugging.hpp index eb592b98d..cfa772330 100644 --- a/apps/openmw/mwrender/debugging.hpp +++ b/apps/openmw/mwrender/debugging.hpp @@ -52,12 +52,16 @@ namespace MWRender typedef std::map, Ogre::SceneNode *> ExteriorPathgridNodes; ExteriorPathgridNodes mExteriorPathgridNodes; - void togglePathgridForCell(MWWorld::Ptr::CellStore *store, bool enabled); + void enableCellPathgrid(MWWorld::Ptr::CellStore *store); + void disableCellPathgrid(MWWorld::Ptr::CellStore *store); + // utility void destroyCellPathgridNode(Ogre::SceneNode *node); + void destroyAttachedObjects(Ogre::SceneNode *node); public: Debugging(Ogre::SceneNode* mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine); + ~Debugging(); bool toggleRenderMode (int mode); void cellAdded(MWWorld::Ptr::CellStore* store); From a8e25bc32ce3c862b512b130531db24eb0f9f704 Mon Sep 17 00:00:00 2001 From: Nikolay Kasyanov Date: Wed, 14 Mar 2012 15:03:04 +0400 Subject: [PATCH 054/586] Feature #37 (In Progress) Render Path Grid improved path grid point mesh (closer to vanilla MW) --- apps/openmw/mwrender/debugging.cpp | 96 +++++++++++++++++++++++------- apps/openmw/mwrender/debugging.hpp | 14 ++++- 2 files changed, 86 insertions(+), 24 deletions(-) diff --git a/apps/openmw/mwrender/debugging.cpp b/apps/openmw/mwrender/debugging.cpp index 3b01d4b36..aa98f433f 100644 --- a/apps/openmw/mwrender/debugging.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -4,6 +4,8 @@ #include #include +#include +#include #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/environment.hpp" @@ -18,12 +20,15 @@ using namespace Ogre; namespace MWRender { +static const std::string PATHGRID_POINT_MATERIAL = "pathgridPointMaterial"; static const std::string PATHGRID_LINE_MATERIAL = "pathgridLineMaterial"; static const std::string DEBUGGING_GROUP = "debugging"; +static const int POINT_MESH_BASE = 80; -ManualObject *createPathgridLine(SceneManager* sceneMgr, const Vector3& from, const Vector3& to) +void Debugging::createGridMaterials() { - ManualObject *line = sceneMgr->createManualObject(); + if (mGridMatsCreated) return; + if (MaterialManager::getSingleton().getByName(PATHGRID_LINE_MATERIAL, DEBUGGING_GROUP).isNull()) { MaterialPtr lineMatPtr = MaterialManager::getSingleton().create(PATHGRID_LINE_MATERIAL, DEBUGGING_GROUP); @@ -34,6 +39,31 @@ ManualObject *createPathgridLine(SceneManager* sceneMgr, const Vector3& from, co lineMatPtr->getTechnique(0)->getPass(0)->setSelfIllumination(1,1,0); } + if (MaterialManager::getSingleton().getByName(PATHGRID_POINT_MATERIAL, DEBUGGING_GROUP).isNull()) + { + MaterialPtr pointMatPtr = MaterialManager::getSingleton().create(PATHGRID_POINT_MATERIAL, DEBUGGING_GROUP); + pointMatPtr->setReceiveShadows(false); + pointMatPtr->getTechnique(0)->setLightingEnabled(true); + pointMatPtr->getTechnique(0)->getPass(0)->setDiffuse(1,0,0,0); + pointMatPtr->getTechnique(0)->getPass(0)->setAmbient(1,0,0); + pointMatPtr->getTechnique(0)->getPass(0)->setSelfIllumination(1,0,0); + } + mGridMatsCreated = true; +} + +void Debugging::destroyGridMaterials() +{ + if (mGridMatsCreated) + { + MaterialManager::getSingleton().remove(PATHGRID_POINT_MATERIAL); + MaterialManager::getSingleton().remove(PATHGRID_LINE_MATERIAL); + mGridMatsCreated = false; + } +} + +MovableObject *Debugging::createPathgridLine(const Vector3& from, const Vector3& to) +{ + ManualObject *line = mSceneMgr->createManualObject(); line->begin(PATHGRID_LINE_MATERIAL, Ogre::RenderOperation::OT_LINE_LIST); line->position(from); line->position(to); @@ -42,21 +72,47 @@ ManualObject *createPathgridLine(SceneManager* sceneMgr, const Vector3& from, co return line; } -ManualObject *createPathgridPoint(SceneManager* sceneMgr, const Vector3& pos) +MovableObject *Debugging::createPathgridPoint() { + ManualObject *point = mSceneMgr->createManualObject(); + point->begin(PATHGRID_POINT_MATERIAL, Ogre::RenderOperation::OT_TRIANGLE_FAN); + float height = POINT_MESH_BASE /*/ sqrtf(2)*/; + point->position(0, 0, height); + point->position(-POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->position(POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->position(POINT_MESH_BASE, POINT_MESH_BASE, 0); + point->position(-POINT_MESH_BASE, POINT_MESH_BASE, 0); + point->position(-POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->end(); + point->begin(PATHGRID_POINT_MATERIAL, Ogre::RenderOperation::OT_TRIANGLE_FAN); + point->position(0, 0, -height); + point->position(-POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->position(-POINT_MESH_BASE, POINT_MESH_BASE, 0); + point->position(POINT_MESH_BASE, POINT_MESH_BASE, 0); + point->position(POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->position(-POINT_MESH_BASE, -POINT_MESH_BASE, 0); + point->end(); + + return point; } Debugging::Debugging(SceneNode *mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine) : mMwRoot(mwRoot), mEnvironment(env), mEngine(engine), mSceneMgr(mwRoot->getCreator()), - pathgridEnabled(false), - mInteriorPathgridNode(NULL), mPathGridRoot(NULL) + mPathgridEnabled(false), + mInteriorPathgridNode(NULL), mPathGridRoot(NULL), + mGridMatsCreated(false) { ResourceGroupManager::getSingleton().createResourceGroup(DEBUGGING_GROUP); } Debugging::~Debugging() { + if (mPathgridEnabled) + { + togglePathgrid(); + } + ResourceGroupManager::getSingleton().destroyResourceGroup(DEBUGGING_GROUP); } @@ -72,7 +128,7 @@ bool Debugging::toggleRenderMode (int mode){ return mEngine->isDebugCreated; case MWWorld::World::Render_Pathgrid: togglePathgrid(); - return pathgridEnabled; + return mPathgridEnabled; } return false; @@ -82,7 +138,7 @@ void Debugging::cellAdded(MWWorld::Ptr::CellStore *store) { std::cout << "Cell added to debugging" << std::endl; mActiveCells.push_back(store); - if (pathgridEnabled) + if (mPathgridEnabled) enableCellPathgrid(store); } @@ -90,15 +146,17 @@ void Debugging::cellRemoved(MWWorld::Ptr::CellStore *store) { mActiveCells.erase(std::remove(mActiveCells.begin(), mActiveCells.end(), store), mActiveCells.end()); std::cout << "Cell removed from debugging, active cells count: " << mActiveCells.size() << std::endl; - if (pathgridEnabled) + if (mPathgridEnabled) disableCellPathgrid(store); } void Debugging::togglePathgrid() { - pathgridEnabled = !pathgridEnabled; - if (pathgridEnabled) + mPathgridEnabled = !mPathgridEnabled; + if (mPathgridEnabled) { + createGridMaterials(); + // add path grid meshes to already loaded cells mPathGridRoot = mMwRoot->createChildSceneNode(); for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) @@ -106,7 +164,8 @@ void Debugging::togglePathgrid() enableCellPathgrid(*it); } } - else { + else + { // remove path grid meshes from already loaded cells for(CellList::iterator it = mActiveCells.begin(); it != mActiveCells.end(); it++) { @@ -115,16 +174,14 @@ void Debugging::togglePathgrid() mPathGridRoot->removeAndDestroyAllChildren(); mSceneMgr->destroySceneNode(mPathGridRoot); mPathGridRoot = NULL; + destroyGridMaterials(); } } void Debugging::enableCellPathgrid(MWWorld::Ptr::CellStore *store) { ESM::Pathgrid *pathgrid = mEnvironment.mWorld->getStore().pathgrids.search(*store->cell); - if (!pathgrid) - { - return; - } + if (!pathgrid) return; Vector3 cellPathGridPos; /// \todo replace tests like this with isExterior method of ESM::Cell after merging with terrain branch @@ -141,8 +198,7 @@ void Debugging::enableCellPathgrid(MWWorld::Ptr::CellStore *store) Vector3 position(it->x, it->y, it->z); SceneNode* pointNode = cellPathGrid->createChildSceneNode(position); pointNode->setScale(0.5, 0.5, 0.5); - Entity *pointMesh = mSceneMgr->createEntity(SceneManager::PT_CUBE); - pointNode->attachObject(pointMesh); + pointNode->attachObject(createPathgridPoint()); } ESM::Pathgrid::EdgeList edges = pathgrid->edges; @@ -151,8 +207,7 @@ void Debugging::enableCellPathgrid(MWWorld::Ptr::CellStore *store) { ESM::Pathgrid::Edge edge = *it; ESM::Pathgrid::Point p1 = points[edge.v0], p2 = points[edge.v1]; - cellPathGrid->attachObject(createPathgridLine(cellPathGrid->getCreator(), - Vector3(p1.x, p1.y, p1.z), + cellPathGrid->attachObject(createPathgridLine(Vector3(p1.x, p1.y, p1.z), Vector3(p2.x, p2.y, p2.z))); } @@ -193,7 +248,6 @@ void Debugging::destroyCellPathgridNode(SceneNode *node) { mPathGridRoot->removeChild(node); - /// \todo should object be killed by hand or removeAndDestroyAllChildren is sufficient? SceneNode::ChildNodeIterator childIt = node->getChildIterator(); while (childIt.hasMoreElements()) { @@ -211,7 +265,7 @@ void Debugging::destroyAttachedObjects(SceneNode *node) while (objIt.hasMoreElements()) { MovableObject *mesh = static_cast(objIt.getNext()); - node->getCreator()->destroyMovableObject(mesh); + mSceneMgr->destroyMovableObject(mesh); } } diff --git a/apps/openmw/mwrender/debugging.hpp b/apps/openmw/mwrender/debugging.hpp index cfa772330..c8c19fb8c 100644 --- a/apps/openmw/mwrender/debugging.hpp +++ b/apps/openmw/mwrender/debugging.hpp @@ -37,20 +37,20 @@ namespace MWRender MWWorld::Environment& mEnvironment; // Path grid stuff - bool pathgridEnabled; + bool mPathgridEnabled; void togglePathgrid(); typedef std::vector CellList; - CellList mActiveCells; Ogre::SceneNode *mMwRoot; + Ogre::SceneNode *mPathGridRoot; - Ogre::SceneNode *mInteriorPathgridNode; typedef std::map, Ogre::SceneNode *> ExteriorPathgridNodes; ExteriorPathgridNodes mExteriorPathgridNodes; + Ogre::SceneNode *mInteriorPathgridNode; void enableCellPathgrid(MWWorld::Ptr::CellStore *store); void disableCellPathgrid(MWWorld::Ptr::CellStore *store); @@ -59,6 +59,14 @@ namespace MWRender void destroyCellPathgridNode(Ogre::SceneNode *node); void destroyAttachedObjects(Ogre::SceneNode *node); + // materials + bool mGridMatsCreated; + void createGridMaterials(); + void destroyGridMaterials(); + + // path grid meshes + Ogre::MovableObject* createPathgridLine(const Ogre::Vector3& from, const Ogre::Vector3& to); + Ogre::MovableObject* createPathgridPoint(); public: Debugging(Ogre::SceneNode* mwRoot, MWWorld::Environment &env, OEngine::Physic::PhysicEngine *engine); ~Debugging(); From 583a25f63424f2da8da0f771cd7c751657cc4f28 Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 14 Mar 2012 14:51:58 +0100 Subject: [PATCH 055/586] fog of war rendering (incomplete) --- apps/openmw/mwrender/localmap.cpp | 96 +++++++++++++++++++++-- apps/openmw/mwrender/localmap.hpp | 19 ++++- apps/openmw/mwrender/renderingmanager.cpp | 2 + 3 files changed, 110 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index 3e3ff77db..8c56bb511 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -12,6 +12,7 @@ using namespace Ogre; #define CACHE_EXTENSION ".jpg" #define MAP_RESOLUTION 1024 // 1024*1024 pixels for a 8192*8192 area in world units +#define FOGOFWAR_RESOLUTION 1024 LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) { @@ -24,11 +25,14 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) mCellCamera->setOrientation(Quaternion(sqrt0pt5, -sqrt0pt5, 0, 0)); // Debug overlay to view the maps - /* + render(0, 0, 10000, 10000, 8192, 8192, "Cell_0_0"); MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0"); + mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); + mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); + mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); OverlayManager& ovm = OverlayManager::getSingleton(); @@ -44,23 +48,27 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) overlay_panel->show(); mOverlay->add2D(overlay_panel); mOverlay->show(); - */ + } void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell) { + mInterior = false; + std::string name = "Cell_" + StringConverter::toString(cell->cell->data.gridX) + "_" + StringConverter::toString(cell->cell->data.gridY); const int x = cell->cell->data.gridX; const int y = cell->cell->data.gridY; - + render((x+0.5)*8192, (-y-0.5)*8192, -10000, 10000, 8192, 8192, name); } void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, AxisAlignedBox bounds) { + mInterior = true; + Vector2 z(bounds.getMaximum().y, bounds.getMinimum().y); Vector2 min(bounds.getMinimum().x, bounds.getMinimum().z); Vector2 max(bounds.getMaximum().x, bounds.getMaximum().z); @@ -68,7 +76,7 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, /// \todo why is this workaround needed? min *= 1.3; max *= 1.3; - + Vector2 length = max-min; Vector2 center(bounds.getCenter().x, bounds.getCenter().z); @@ -102,7 +110,7 @@ void LocalMap::render(const float x, const float y, // make everything visible mRendering->getScene()->setAmbientLight(ColourValue(1,1,1)); - + mCellCamera->setPosition(Vector3(x, zhigh, y)); mCellCamera->setFarClipDistance( (zhigh-zlow) * 1.1 ); @@ -140,6 +148,16 @@ void LocalMap::render(const float x, const float y, rtt->update(); + // create "fog of war" texture + TexturePtr tex2 = TextureManager::getSingleton().createManual( + texture + "_fog", + ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + TEX_TYPE_2D, + xw*FOGOFWAR_RESOLUTION/8192, yw*FOGOFWAR_RESOLUTION/8192, + 0, + PF_A8R8G8B8, + TU_DYNAMIC); + /// \todo // save to cache for next time //rtt->writeContentsToFile("./" + texture + CACHE_EXTENSION); @@ -158,3 +176,71 @@ void LocalMap::render(const float x, const float y, // re-enable fog mRendering->getScene()->setFog(FOG_LINEAR, clr, 0, fStart, fEnd); } + +void LocalMap::setPlayerPosition (const Ogre::Vector3& position) +{ + // retrieve the x,y grid coordinates the player is in + int x,y; + Vector2 pos(position.x, -position.z); + if (!mInterior) + { + x = std::ceil(pos.x / 8192.f); + y = std::ceil(pos.y / 8192.f); + } + else + { + /// \todo + } + + // convert from world coordinates to texture UV coordinates + float u,v; + std::string texName; + if (!mInterior) + { + u = std::abs((pos.x - (8192*x))/8192.f); + v = std::abs((pos.y - (8192*y))/8192.f); + texName = "Cell_" + StringConverter::toString(x) + "_" + + StringConverter::toString(y) + "_fog"; + } + else + { + /// \todo + } + + //std::cout << "u " << u<< " v " << v << std::endl; + + // explore radius (squared) + const float sqrExploreRadius = 0.001 * FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION; + + // get the appropriate fog of war texture + TexturePtr tex = TextureManager::getSingleton().getByName(texName); + HardwarePixelBufferSharedPtr buffer = tex->getBuffer(); + + /*void* data = buffer->lock(HardwareBuffer::HBL_NORMAL); + + for (int texU = 0; texU> 24); + uint8 r=0; + uint8 g=0; + uint8 b=0; + alpha = std::max( alpha, (uint8) (std::max(0.f, std::min(1.f, 1.f-(sqrDist/sqrExploreRadius)))*255) ); + *((uint32*)data) = (r) + (g<<8) + (b<<16) + (alpha << 24); + + // move to next texel + data = static_cast (data) + sizeof(uint32); + } + } + + buffer->unlock();*/ + + if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) + { + MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(tex->getName()); + } +} diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp index ac62031f4..afce94c8d 100644 --- a/apps/openmw/mwrender/localmap.hpp +++ b/apps/openmw/mwrender/localmap.hpp @@ -17,7 +17,7 @@ namespace MWRender /** * Request the local map for an exterior cell. - * It will either be loaded from a disk cache, + * @remarks It will either be loaded from a disk cache, * or rendered if it is not already cached. * @param exterior cell */ @@ -25,7 +25,7 @@ namespace MWRender /** * Request the local map for an interior cell. - * It will either be loaded from a disk cache, + * @remarks It will either be loaded from a disk cache, * or rendered if it is not already cached. * @param interior cell * @param bounding box of the cell @@ -33,6 +33,14 @@ namespace MWRender void requestMap (MWWorld::Ptr::CellStore* cell, Ogre::AxisAlignedBox bounds); + /** + * Set the position of the player. + * @remarks This is used to draw a "fog of war" effect + * to hide areas on the map the player has not discovered yet. + * @param position (OGRE coordinates) + */ + void setPlayerPosition (const Ogre::Vector3& position); + private: OEngine::Render::OgreRenderer* mRendering; @@ -42,6 +50,13 @@ namespace MWRender const float zlow, const float zhigh, const float xw, const float yw, const std::string& texture); + + bool mInterior; + + // a buffer for the "fog of war" texture of the current cell. + // interior cells could be divided into multiple textures, + // so we store in a map. + std::map mBuffer; }; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 41f4e72d6..bddf575d9 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -140,6 +140,8 @@ void RenderingManager::update (float duration){ mSkyManager->update(duration); mRendering.update(duration); + + mLocalMap->setPlayerPosition( mRendering.getCamera()->getRealPosition() ); } void RenderingManager::skyEnable () From 5a46d58da5912be269ef7a07cc027bee2f2cda57 Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 14 Mar 2012 17:44:19 +0100 Subject: [PATCH 056/586] fully working fog of war --- apps/openmw/mwrender/localmap.cpp | 157 +++++++++++++++++++++++------- apps/openmw/mwrender/localmap.hpp | 11 ++- 2 files changed, 129 insertions(+), 39 deletions(-) diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index 8c56bb511..496a162dd 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -12,7 +12,13 @@ using namespace Ogre; #define CACHE_EXTENSION ".jpg" #define MAP_RESOLUTION 1024 // 1024*1024 pixels for a 8192*8192 area in world units -#define FOGOFWAR_RESOLUTION 1024 + +// warning: don't set this too high! dynamic textures are a bottleneck +#define FOGOFWAR_RESOLUTION 32 + +// how many frames to skip before rendering the fog of war. +// example: at 60 fps, a value of 2 would mean to render it at 20 fps. +#define FOGOFWAR_SKIP 2 LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) { @@ -25,7 +31,7 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) mCellCamera->setOrientation(Quaternion(sqrt0pt5, -sqrt0pt5, 0, 0)); // Debug overlay to view the maps - + render(0, 0, 10000, 10000, 8192, 8192, "Cell_0_0"); MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); @@ -33,11 +39,17 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); + + mat = MaterialManager::getSingleton().create("testMaterial2", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0"); + mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); + mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); + mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); OverlayManager& ovm = OverlayManager::getSingleton(); Overlay* mOverlay = ovm.create( "testOverlay" ); - + mOverlay->setZOrder(0); OverlayContainer* overlay_panel; overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel"); @@ -48,11 +60,42 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) overlay_panel->show(); mOverlay->add2D(overlay_panel); mOverlay->show(); + + Overlay* mOverlay2 = ovm.create( "testOverlay2" ); + mOverlay2->setZOrder(1); + OverlayContainer* overlay_panel2; + overlay_panel2 = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel2"); + overlay_panel2->_setPosition(0, 0); + overlay_panel2->_setDimensions(0.5, 0.5); + + overlay_panel2->setMaterialName( "testMaterial2" ); + overlay_panel2->show(); + mOverlay2->add2D(overlay_panel2); + + mOverlay2->show(); + +} + +LocalMap::~LocalMap() +{ + deleteBuffers(); +} + +void LocalMap::deleteBuffers() +{ + for (std::map::iterator it=mBuffers.begin(); + it != mBuffers.end(); ++it) + { + delete it->second; + } + mBuffers.clear(); } void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell) { + deleteBuffers(); + mInterior = false; std::string name = "Cell_" + StringConverter::toString(cell->cell->data.gridX) @@ -67,7 +110,10 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell) void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, AxisAlignedBox bounds) { + deleteBuffers(); + mInterior = true; + mBounds = bounds; Vector2 z(bounds.getMaximum().y, bounds.getMinimum().y); Vector2 min(bounds.getMinimum().x, bounds.getMinimum().z); @@ -81,9 +127,12 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, Vector2 center(bounds.getCenter().x, bounds.getCenter().z); // divide into 8192*8192 segments + /// \todo interiors with more than 1 segment are untested const int segsX = std::ceil( length.x / 8192 ); const int segsY = std::ceil( length.y / 8192 ); + mInteriorName = cell->cell->name; + for (int x=0; xgetBuffer()->lock(HardwareBuffer::HBL_DISCARD), buffer, FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION*4); + tex2->getBuffer()->unlock(); + + mBuffers[texture] = buffer; /// \todo // save to cache for next time @@ -165,13 +229,13 @@ void LocalMap::render(const float x, const float y, } - /* + if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) { MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texture); } - */ + // re-enable fog mRendering->getScene()->setFog(FOG_LINEAR, clr, 0, fStart, fEnd); @@ -179,17 +243,28 @@ void LocalMap::render(const float x, const float y, void LocalMap::setPlayerPosition (const Ogre::Vector3& position) { + #if FOGOFWAR_SKIP != 0 + static int count=0; + if (++count % FOGOFWAR_SKIP != 0) + return; + #endif + // retrieve the x,y grid coordinates the player is in int x,y; - Vector2 pos(position.x, -position.z); + Vector2 pos(position.x, position.z); if (!mInterior) { - x = std::ceil(pos.x / 8192.f); - y = std::ceil(pos.y / 8192.f); + x = (int) (pos.x / 8192.f); + y = (int) (pos.y / 8192.f); } else { - /// \todo + Vector2 min(mBounds.getMinimum().x, mBounds.getMinimum().z); + min *= 1.3; + + /// \todo interiors with more than 1 segment are untested + x = (int) ((pos.x - min.x)/8192.f); + y = (int) ((pos.y - min.y)/8192.f); } // convert from world coordinates to texture UV coordinates @@ -200,47 +275,57 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) u = std::abs((pos.x - (8192*x))/8192.f); v = std::abs((pos.y - (8192*y))/8192.f); texName = "Cell_" + StringConverter::toString(x) + "_" - + StringConverter::toString(y) + "_fog"; + + StringConverter::toString(y); } else { - /// \todo + Vector2 min(mBounds.getMinimum().x, mBounds.getMinimum().z); + min *= 1.3; + + u = (pos.x - min.x - 8192*x)/8192.f; + v = (pos.y - min.y - 8192*y)/8192.f; + + texName = mInteriorName + "_" + StringConverter::toString(x) + "_" + + StringConverter::toString(y); } //std::cout << "u " << u<< " v " << v << std::endl; // explore radius (squared) - const float sqrExploreRadius = 0.001 * FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION; + const float sqrExploreRadius = 0.01 * FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION; // get the appropriate fog of war texture - TexturePtr tex = TextureManager::getSingleton().getByName(texName); - HardwarePixelBufferSharedPtr buffer = tex->getBuffer(); - - /*void* data = buffer->lock(HardwareBuffer::HBL_NORMAL); - - for (int texU = 0; texU> 24); - uint8 r=0; - uint8 g=0; - uint8 b=0; - alpha = std::max( alpha, (uint8) (std::max(0.f, std::min(1.f, 1.f-(sqrDist/sqrExploreRadius)))*255) ); - *((uint32*)data) = (r) + (g<<8) + (b<<16) + (alpha << 24); - - // move to next texel - data = static_cast (data) + sizeof(uint32); + for (int texU = 0; texU> 24); + alpha = std::min( alpha, (uint8) (std::max(0.f, std::min(1.f, (sqrDist/sqrExploreRadius)))*255) ); + *((uint32*)pointer) = (alpha << 24); + + // move to next texel + ++pointer; + } } - } - buffer->unlock();*/ + // copy to the texture + memcpy(tex->getBuffer()->lock(HardwareBuffer::HBL_DISCARD), buffer, FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION*4); + tex->getBuffer()->unlock(); - if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(tex->getName()); + if (!MaterialManager::getSingleton().getByName("testMaterial2").isNull()) + { + MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial2"); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(tex->getName()); + } + } } diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp index afce94c8d..588e76633 100644 --- a/apps/openmw/mwrender/localmap.hpp +++ b/apps/openmw/mwrender/localmap.hpp @@ -14,6 +14,7 @@ namespace MWRender { public: LocalMap(OEngine::Render::OgreRenderer*); + ~LocalMap(); /** * Request the local map for an exterior cell. @@ -51,12 +52,16 @@ namespace MWRender const float xw, const float yw, const std::string& texture); - bool mInterior; - // a buffer for the "fog of war" texture of the current cell. // interior cells could be divided into multiple textures, // so we store in a map. - std::map mBuffer; + std::map mBuffers; + + void deleteBuffers(); + + bool mInterior; + Ogre::AxisAlignedBox mBounds; + std::string mInteriorName; }; } From 2edd7e59f407fa21f165fc44b698d3e8dc720837 Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 14 Mar 2012 20:44:06 +0100 Subject: [PATCH 057/586] some fixes and facilities for saving the fog of war to disk --- apps/openmw/mwrender/localmap.cpp | 150 ++++++++++++++-------- apps/openmw/mwrender/localmap.hpp | 13 ++ apps/openmw/mwrender/renderingmanager.cpp | 5 + apps/openmw/mwrender/renderingmanager.hpp | 3 + apps/openmw/mwworld/scene.cpp | 2 + 5 files changed, 118 insertions(+), 55 deletions(-) diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index 496a162dd..fe9b3c191 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -4,14 +4,10 @@ #include #include -#include - using namespace MWRender; using namespace Ogre; -#define CACHE_EXTENSION ".jpg" - -#define MAP_RESOLUTION 1024 // 1024*1024 pixels for a 8192*8192 area in world units +#define MAP_RESOLUTION 1024 // 1024*1024 pixels for a SIZE*SIZE area in world units // warning: don't set this too high! dynamic textures are a bottleneck #define FOGOFWAR_RESOLUTION 32 @@ -20,6 +16,9 @@ using namespace Ogre; // example: at 60 fps, a value of 2 would mean to render it at 20 fps. #define FOGOFWAR_SKIP 2 +// size of a map segment (for exterior regions, this equals 1 cell) +#define SIZE 8192.f + LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) { mRendering = rend; @@ -32,16 +31,16 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) // Debug overlay to view the maps - render(0, 0, 10000, 10000, 8192, 8192, "Cell_0_0"); + render(0, 0, 10000, 10000, SIZE, SIZE, "Cell_0_0_"); MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0"); + mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); mat = MaterialManager::getSingleton().create("testMaterial2", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0"); + mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); @@ -92,26 +91,75 @@ void LocalMap::deleteBuffers() mBuffers.clear(); } -void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell) +void LocalMap::saveTexture(const std::string& texname, const std::string& filename) { - deleteBuffers(); + TexturePtr tex = TextureManager::getSingleton().getByName(texname); + if (tex.isNull()) return; + HardwarePixelBufferSharedPtr readbuffer = tex->getBuffer(); + readbuffer->lock(HardwareBuffer::HBL_NORMAL ); + const PixelBox &readrefpb = readbuffer->getCurrentLock(); + uchar *readrefdata = static_cast(readrefpb.data); + + Image img; + img = img.loadDynamicImage (readrefdata, tex->getWidth(), + tex->getHeight(), tex->getFormat()); + img.save("./" + filename); + + readbuffer->unlock(); +} +std::string LocalMap::coordStr(const int x, const int y) +{ + return StringConverter::toString(x) + "_" + StringConverter::toString(y); +} + +void LocalMap::saveFogOfWar(MWWorld::Ptr::CellStore* cell) +{ + if (!mInterior) + { + /*saveTexture("Cell_"+coordStr(mCellX, mCellY)+"_fog", + "Cell_"+coordStr(mCellX, mCellY)+"_fog.png");*/ + } + else + { + Vector2 min(mBounds.getMinimum().x, mBounds.getMinimum().z); + Vector2 max(mBounds.getMaximum().x, mBounds.getMaximum().z); + /// \todo why is this workaround needed? + min *= 1.3; + max *= 1.3; + Vector2 length = max-min; + + // divide into segments + const int segsX = std::ceil( length.x / SIZE ); + const int segsY = std::ceil( length.y / SIZE ); + + for (int x=0; xcell->data.gridX) - + "_" + StringConverter::toString(cell->cell->data.gridY); + std::string name = "Cell_"+coordStr(cell->cell->data.gridX, cell->cell->data.gridY); - const int x = cell->cell->data.gridX; - const int y = cell->cell->data.gridY; + int x = cell->cell->data.gridX; + int y = cell->cell->data.gridY; - render((x+0.5)*8192, (-y-0.5)*8192, -10000, 10000, 8192, 8192, name); + render((x+0.5)*SIZE, (-y-0.5)*SIZE, -10000, 10000, SIZE, SIZE, name); } void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, AxisAlignedBox bounds) { - deleteBuffers(); - mInterior = true; mBounds = bounds; @@ -126,10 +174,9 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, Vector2 length = max-min; Vector2 center(bounds.getCenter().x, bounds.getCenter().z); - // divide into 8192*8192 segments - /// \todo interiors with more than 1 segment are untested - const int segsX = std::ceil( length.x / 8192 ); - const int segsY = std::ceil( length.y / 8192 ); + // divide into segments + const int segsX = std::ceil( length.x / SIZE ); + const int segsY = std::ceil( length.y / SIZE ); mInteriorName = cell->cell->name; @@ -137,11 +184,11 @@ void LocalMap::requestMap(MWWorld::Ptr::CellStore* cell, { for (int y=0; ycell->name + "_" + StringConverter::toString(x) + "_" + StringConverter::toString(y)); + render(newcenter.x, newcenter.y, z.y, z.x, SIZE, SIZE, + cell->cell->name + "_" + coordStr(x,y)); } } } @@ -171,7 +218,7 @@ void LocalMap::render(const float x, const float y, if (tex.isNull()) { // try loading from disk - //if (boost::filesystem::exists(texture+CACHE_EXTENSION)) + //if (boost::filesystem::exists(texture+".jpg")) //{ /// \todo //} @@ -182,7 +229,7 @@ void LocalMap::render(const float x, const float y, texture, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, - xw*MAP_RESOLUTION/8192, yw*MAP_RESOLUTION/8192, + xw*MAP_RESOLUTION/SIZE, yw*MAP_RESOLUTION/SIZE, 0, PF_R8G8B8, TU_RENDERTARGET); @@ -202,7 +249,7 @@ void LocalMap::render(const float x, const float y, texture + "_fog", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, - xw*FOGOFWAR_RESOLUTION/8192, yw*FOGOFWAR_RESOLUTION/8192, + xw*FOGOFWAR_RESOLUTION/SIZE, yw*FOGOFWAR_RESOLUTION/SIZE, 0, PF_A8R8G8B8, TU_DYNAMIC_WRITE_ONLY); @@ -221,20 +268,11 @@ void LocalMap::render(const float x, const float y, tex2->getBuffer()->unlock(); mBuffers[texture] = buffer; - - /// \todo + // save to cache for next time - //rtt->writeContentsToFile("./" + texture + CACHE_EXTENSION); + //rtt->writeContentsToFile("./" + texture + ".jpg"); } } - - - - if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texture); - } // re-enable fog @@ -254,17 +292,18 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) Vector2 pos(position.x, position.z); if (!mInterior) { - x = (int) (pos.x / 8192.f); - y = (int) (pos.y / 8192.f); + x = std::ceil(pos.x / SIZE)-1; + y = std::ceil(-pos.y / SIZE)-1; + mCellX = x; + mCellY = y; } else { Vector2 min(mBounds.getMinimum().x, mBounds.getMinimum().z); min *= 1.3; - /// \todo interiors with more than 1 segment are untested - x = (int) ((pos.x - min.x)/8192.f); - y = (int) ((pos.y - min.y)/8192.f); + x = std::ceil((pos.x - min.x)/SIZE)-1; + y = std::ceil((pos.y - min.y)/SIZE)-1; } // convert from world coordinates to texture UV coordinates @@ -272,34 +311,30 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) std::string texName; if (!mInterior) { - u = std::abs((pos.x - (8192*x))/8192.f); - v = std::abs((pos.y - (8192*y))/8192.f); - texName = "Cell_" + StringConverter::toString(x) + "_" - + StringConverter::toString(y); + u = std::abs((pos.x - (SIZE*x))/SIZE); + v = 1-std::abs((pos.y + (SIZE*y))/SIZE); + texName = "Cell_"+coordStr(x,y); } else { Vector2 min(mBounds.getMinimum().x, mBounds.getMinimum().z); min *= 1.3; - u = (pos.x - min.x - 8192*x)/8192.f; - v = (pos.y - min.y - 8192*y)/8192.f; + u = (pos.x - min.x - SIZE*x)/SIZE; + v = (pos.y - min.y - SIZE*y)/SIZE; - texName = mInteriorName + "_" + StringConverter::toString(x) + "_" - + StringConverter::toString(y); + texName = mInteriorName + "_" + coordStr(x,y); } - //std::cout << "u " << u<< " v " << v << std::endl; - // explore radius (squared) const float sqrExploreRadius = 0.01 * FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION; // get the appropriate fog of war texture TexturePtr tex = TextureManager::getSingleton().getByName(texName+"_fog"); - if (!tex.isNull()) { // get its buffer + if (mBuffers.find(texName) == mBuffers.end()) return; uint32* buffer = mBuffers[texName]; uint32* pointer = buffer; for (int texV = 0; texV> 24); alpha = std::min( alpha, (uint8) (std::max(0.f, std::min(1.f, (sqrDist/sqrExploreRadius)))*255) ); *((uint32*)pointer) = (alpha << 24); @@ -321,6 +356,11 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) memcpy(tex->getBuffer()->lock(HardwareBuffer::HBL_DISCARD), buffer, FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION*4); tex->getBuffer()->unlock(); + if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) + { + MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); + mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texName); + } if (!MaterialManager::getSingleton().getByName("testMaterial2").isNull()) { MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial2"); diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp index 588e76633..9e06200c1 100644 --- a/apps/openmw/mwrender/localmap.hpp +++ b/apps/openmw/mwrender/localmap.hpp @@ -42,6 +42,14 @@ namespace MWRender */ void setPlayerPosition (const Ogre::Vector3& position); + /** + * Save the fog of war for the current cell to disk. + * @remarks This should be called before loading a + * new cell, as well as when the game is quit. + * @param current cell + */ + void saveFogOfWar(MWWorld::Ptr::CellStore* cell); + private: OEngine::Render::OgreRenderer* mRendering; @@ -52,6 +60,10 @@ namespace MWRender const float xw, const float yw, const std::string& texture); + void saveTexture(const std::string& texname, const std::string& filename); + + std::string coordStr(const int x, const int y); + // a buffer for the "fog of war" texture of the current cell. // interior cells could be divided into multiple textures, // so we store in a map. @@ -60,6 +72,7 @@ namespace MWRender void deleteBuffers(); bool mInterior; + int mCellX, mCellY; Ogre::AxisAlignedBox mBounds; std::string mInteriorName; }; diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index bddf575d9..a8887e64f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -335,4 +335,9 @@ void RenderingManager::requestMap(MWWorld::Ptr::CellStore* cell) mLocalMap->requestMap(cell, mObjects.getDimensions(cell)); } +void RenderingManager::preCellChange(MWWorld::Ptr::CellStore* cell) +{ + mLocalMap->saveFogOfWar(cell); +} + } // namespace diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 65aa46b01..78a1d2fdb 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -76,6 +76,9 @@ class RenderingManager: private RenderingInterface { /// when rebatching is needed and update automatically at the end of each frame. void cellAdded (MWWorld::Ptr::CellStore *store); + void preCellChange (MWWorld::Ptr::CellStore* store); + ///< this event is fired immediately before changing cell + void addObject (const MWWorld::Ptr& ptr); void removeObject (const MWWorld::Ptr& ptr); diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index a63f6d150..84c10072a 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -135,6 +135,8 @@ namespace MWWorld void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos) { + mRendering.preCellChange(mCurrentCell); + // remove active mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); From 91d2031eb7d54a6c0ffdf9c7a0cb666ef4999f33 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 16 Mar 2012 17:09:31 +0100 Subject: [PATCH 058/586] first attempt at map window --- apps/openmw/mwgui/layouts.hpp | 28 ++++++++++- apps/openmw/mwgui/window_manager.cpp | 18 ++++++- apps/openmw/mwgui/window_manager.hpp | 4 +- apps/openmw/mwrender/localmap.cpp | 6 +-- apps/openmw/mwworld/scene.cpp | 11 +---- .../openmw_map_window_layout.xml | 48 +++++++++++++++++-- 6 files changed, 94 insertions(+), 21 deletions(-) diff --git a/apps/openmw/mwgui/layouts.hpp b/apps/openmw/mwgui/layouts.hpp index 9917dcdcc..7b7c84225 100644 --- a/apps/openmw/mwgui/layouts.hpp +++ b/apps/openmw/mwgui/layouts.hpp @@ -67,7 +67,7 @@ namespace MWGui { setCoord(500,0,320,300); setText("WorldButton", "World"); - setImage("Compass", "compass.dds"); + setImage("Compass", "textures\\compass.dds"); // Obviously you should override this later on setCellName("No Cell Loaded"); @@ -77,6 +77,32 @@ namespace MWGui { mMainWidget->setCaption(cellName); } + + // for interiors: cell name, for exteriors: "Cell" + void setCellPrefix(const std::string& prefix) + { + mPrefix = prefix; + } + + void setActiveCell(const int x, const int y) + { + for (int mx=0; mx<3; ++mx) + { + for (int my=0; my<3; ++my) + { + std::string name = "Map_" + boost::lexical_cast(mx) + "_" + + boost::lexical_cast(my); + + std::string image = mPrefix+"_"+ boost::lexical_cast(x + (mx-1)) + "_" + + boost::lexical_cast(y - (my-1)); + setImage(name, image); + setImage(name+"_fog", image+"_fog"); + } + } + } + + private: + std::string mPrefix; }; class MainMenu : public OEngine::GUI::Layout diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 347db09e2..014aa8108 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -402,7 +402,21 @@ const ESMS::ESMStore& WindowManager::getStore() const return environment.mWorld->getStore(); } -void WindowManager::setCellName(const std::string& cellName) +void WindowManager::changeCell(MWWorld::Ptr::CellStore* cell) { - map->setCellName(cellName); + if (!(cell->cell->data.flags & ESM::Cell::Interior)) + { + if (cell->cell->name != "") + map->setCellName( cell->cell->name ); + else + map->setCellName( cell->cell->region ); + map->setCellPrefix("Cell"); + map->setActiveCell( cell->cell->data.gridX, cell->cell->data.gridY ); + } + else + { + map->setCellName( cell->cell->name ); + map->setCellPrefix( cell->cell->name ); + } + } diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index 258ab7993..c867fedbe 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -18,6 +18,7 @@ #include #include #include "../mwmechanics/stat.hpp" +#include "../mwworld/ptr.hpp" #include "mode.hpp" namespace MyGUI @@ -150,8 +151,7 @@ namespace MWGui void setBounty (int bounty); ///< set the current bounty value void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty - - void setCellName(const std::string& cellName); ///< set the cell name to display in the map window + void changeCell(MWWorld::Ptr::CellStore* cell); ///< change the active cell template void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index fe9b3c191..ee5413cab 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -58,7 +58,7 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) overlay_panel->setMaterialName( "testMaterial" ); overlay_panel->show(); mOverlay->add2D(overlay_panel); - mOverlay->show(); + //mOverlay->show(); Overlay* mOverlay2 = ovm.create( "testOverlay2" ); mOverlay2->setZOrder(1); @@ -72,7 +72,7 @@ LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) overlay_panel2->show(); mOverlay2->add2D(overlay_panel2); - mOverlay2->show(); + //mOverlay2->show(); } @@ -252,7 +252,7 @@ void LocalMap::render(const float x, const float y, xw*FOGOFWAR_RESOLUTION/SIZE, yw*FOGOFWAR_RESOLUTION/SIZE, 0, PF_A8R8G8B8, - TU_DYNAMIC_WRITE_ONLY); + TU_DYNAMIC_WRITE_ONLY_DISCARDABLE); // create a buffer to use for dynamic operations uint32* buffer = new uint32[FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION]; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 84c10072a..22955bf32 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -121,16 +121,7 @@ namespace MWWorld mEnvironment.mMechanicsManager->addActor (mWorld->getPlayer().getPlayer()); mEnvironment.mMechanicsManager->watchActor (mWorld->getPlayer().getPlayer()); - // set map window cell name - if (!(mCurrentCell->cell->data.flags & ESM::Cell::Interior)) - { - if (mCurrentCell->cell->name != "") - mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->name ); - else - mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->region ); - } - else - mEnvironment.mWindowManager->setCellName( mCurrentCell->cell->name ); + mEnvironment.mWindowManager->changeCell( mCurrentCell ); } void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos) diff --git a/extern/mygui_3.0.1/openmw_resources/openmw_map_window_layout.xml b/extern/mygui_3.0.1/openmw_resources/openmw_map_window_layout.xml index f4ff50f72..d4b1b5b0a 100644 --- a/extern/mygui_3.0.1/openmw_resources/openmw_map_window_layout.xml +++ b/extern/mygui_3.0.1/openmw_resources/openmw_map_window_layout.xml @@ -2,8 +2,50 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 42b445383f7b3193f12588142f4762ff1af6c72e Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 16 Mar 2012 17:08:13 -0700 Subject: [PATCH 059/586] Remove Mangle- and OpenEngine-related sound code Start of the sound code refactoring. Currently there is no sound, but it will be added back. --- CMakeLists.txt | 19 +- apps/openmw/mwsound/soundmanager.cpp | 509 ++++++------------ apps/openmw/mwsound/soundmanager.hpp | 38 -- libs/mangle/sound/.gitignore | 1 - .../sound/clients/ogre_listener_mover.hpp | 79 --- .../sound/clients/ogre_output_updater.hpp | 31 -- libs/mangle/sound/filters/input_filter.hpp | 68 --- libs/mangle/sound/filters/openal_audiere.hpp | 24 - libs/mangle/sound/filters/openal_ffmpeg.hpp | 23 - libs/mangle/sound/filters/openal_mpg123.hpp | 24 - libs/mangle/sound/filters/openal_sndfile.hpp | 24 - .../sound/filters/openal_sndfile_mpg123.hpp | 33 -- libs/mangle/sound/filters/openal_various.hpp | 39 -- libs/mangle/sound/filters/pure_filter.hpp | 73 --- libs/mangle/sound/filters/source_splicer.hpp | 90 ---- libs/mangle/sound/output.hpp | 183 ------- libs/mangle/sound/outputs/openal_out.cpp | 500 ----------------- libs/mangle/sound/outputs/openal_out.hpp | 44 -- libs/mangle/sound/source.hpp | 62 --- libs/mangle/sound/sources/audiere_source.cpp | 77 --- libs/mangle/sound/sources/audiere_source.hpp | 48 -- libs/mangle/sound/sources/ffmpeg_source.cpp | 189 ------- libs/mangle/sound/sources/ffmpeg_source.hpp | 52 -- libs/mangle/sound/sources/libsndfile.cpp | 48 -- libs/mangle/sound/sources/libsndfile.hpp | 36 -- libs/mangle/sound/sources/loadertemplate.hpp | 28 - libs/mangle/sound/sources/mpg123_source.cpp | 115 ---- libs/mangle/sound/sources/mpg123_source.hpp | 47 -- libs/mangle/sound/sources/sample_reader.cpp | 99 ---- libs/mangle/sound/sources/sample_reader.hpp | 48 -- libs/mangle/sound/sources/stream_source.hpp | 47 -- libs/mangle/sound/sources/wav_source.cpp | 99 ---- libs/mangle/sound/sources/wav_source.hpp | 49 -- libs/mangle/sound/tests/.gitignore | 1 - libs/mangle/sound/tests/Makefile | 38 -- .../sound/tests/audiere_source_test.cpp | 68 --- libs/mangle/sound/tests/cow.raw | Bin 37502 -> 0 bytes libs/mangle/sound/tests/cow.wav | Bin 37546 -> 0 bytes .../mangle/sound/tests/ffmpeg_source_test.cpp | 62 --- .../sound/tests/openal_audiere_test.cpp | 52 -- .../mangle/sound/tests/openal_ffmpeg_test.cpp | 52 -- .../mangle/sound/tests/openal_mpg123_test.cpp | 54 -- .../mangle/sound/tests/openal_output_test.cpp | 59 -- .../sound/tests/openal_sndfile_test.cpp | 52 -- .../sound/tests/openal_various_test.cpp | 51 -- .../tests/output/audiere_source_test.out | 21 - .../sound/tests/output/ffmpeg_source_test.out | 12 - .../tests/output/openal_audiere_test.out | 3 - .../sound/tests/output/openal_ffmpeg_test.out | 2 - .../sound/tests/output/openal_mpg123_test.out | 1 - .../sound/tests/output/openal_output_test.out | 5 - .../tests/output/openal_sndfile_test.out | 2 - .../tests/output/openal_various_test.out | 1 - .../sound/tests/output/wav_source_test.out | 12 - libs/mangle/sound/tests/owl.ogg | Bin 18641 -> 0 bytes libs/mangle/sound/tests/test.sh | 18 - libs/mangle/sound/tests/wav_source_test.cpp | 48 -- libs/openengine/sound/sndmanager.cpp | 219 -------- libs/openengine/sound/sndmanager.hpp | 93 ---- libs/openengine/sound/tests/Makefile | 16 - .../sound/tests/output/sound_3d_test.out | 3 - .../sound/tests/output/sound_manager_test.out | 5 - libs/openengine/sound/tests/sound_3d_test.cpp | 46 -- .../sound/tests/sound_manager_test.cpp | 73 --- libs/openengine/sound/tests/test.sh | 18 - 65 files changed, 167 insertions(+), 3766 deletions(-) delete mode 100644 libs/mangle/sound/.gitignore delete mode 100644 libs/mangle/sound/clients/ogre_listener_mover.hpp delete mode 100644 libs/mangle/sound/clients/ogre_output_updater.hpp delete mode 100644 libs/mangle/sound/filters/input_filter.hpp delete mode 100644 libs/mangle/sound/filters/openal_audiere.hpp delete mode 100644 libs/mangle/sound/filters/openal_ffmpeg.hpp delete mode 100644 libs/mangle/sound/filters/openal_mpg123.hpp delete mode 100644 libs/mangle/sound/filters/openal_sndfile.hpp delete mode 100644 libs/mangle/sound/filters/openal_sndfile_mpg123.hpp delete mode 100644 libs/mangle/sound/filters/openal_various.hpp delete mode 100644 libs/mangle/sound/filters/pure_filter.hpp delete mode 100644 libs/mangle/sound/filters/source_splicer.hpp delete mode 100644 libs/mangle/sound/output.hpp delete mode 100644 libs/mangle/sound/outputs/openal_out.cpp delete mode 100644 libs/mangle/sound/outputs/openal_out.hpp delete mode 100644 libs/mangle/sound/source.hpp delete mode 100644 libs/mangle/sound/sources/audiere_source.cpp delete mode 100644 libs/mangle/sound/sources/audiere_source.hpp delete mode 100644 libs/mangle/sound/sources/ffmpeg_source.cpp delete mode 100644 libs/mangle/sound/sources/ffmpeg_source.hpp delete mode 100644 libs/mangle/sound/sources/libsndfile.cpp delete mode 100644 libs/mangle/sound/sources/libsndfile.hpp delete mode 100644 libs/mangle/sound/sources/loadertemplate.hpp delete mode 100644 libs/mangle/sound/sources/mpg123_source.cpp delete mode 100644 libs/mangle/sound/sources/mpg123_source.hpp delete mode 100644 libs/mangle/sound/sources/sample_reader.cpp delete mode 100644 libs/mangle/sound/sources/sample_reader.hpp delete mode 100644 libs/mangle/sound/sources/stream_source.hpp delete mode 100644 libs/mangle/sound/sources/wav_source.cpp delete mode 100644 libs/mangle/sound/sources/wav_source.hpp delete mode 100644 libs/mangle/sound/tests/.gitignore delete mode 100644 libs/mangle/sound/tests/Makefile delete mode 100644 libs/mangle/sound/tests/audiere_source_test.cpp delete mode 100644 libs/mangle/sound/tests/cow.raw delete mode 100644 libs/mangle/sound/tests/cow.wav delete mode 100644 libs/mangle/sound/tests/ffmpeg_source_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_audiere_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_ffmpeg_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_mpg123_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_output_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_sndfile_test.cpp delete mode 100644 libs/mangle/sound/tests/openal_various_test.cpp delete mode 100644 libs/mangle/sound/tests/output/audiere_source_test.out delete mode 100644 libs/mangle/sound/tests/output/ffmpeg_source_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_audiere_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_ffmpeg_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_mpg123_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_output_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_sndfile_test.out delete mode 100644 libs/mangle/sound/tests/output/openal_various_test.out delete mode 100644 libs/mangle/sound/tests/output/wav_source_test.out delete mode 100644 libs/mangle/sound/tests/owl.ogg delete mode 100755 libs/mangle/sound/tests/test.sh delete mode 100644 libs/mangle/sound/tests/wav_source_test.cpp delete mode 100644 libs/openengine/sound/sndmanager.cpp delete mode 100644 libs/openengine/sound/sndmanager.hpp delete mode 100644 libs/openengine/sound/tests/Makefile delete mode 100644 libs/openengine/sound/tests/output/sound_3d_test.out delete mode 100644 libs/openengine/sound/tests/output/sound_manager_test.out delete mode 100644 libs/openengine/sound/tests/sound_3d_test.cpp delete mode 100644 libs/openengine/sound/tests/sound_manager_test.cpp delete mode 100755 libs/openengine/sound/tests/test.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dbd27a68..d06085322 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,10 +120,6 @@ set(OENGINE_BULLET # Sound setup if (USE_AUDIERE) - set(MANGLE_SOUND_OUTPUT - ${LIBDIR}/mangle/sound/sources/audiere_source.cpp - ${LIBDIR}/mangle/sound/sources/sample_reader.cpp - ${LIBDIR}/mangle/stream/clients/audiere_file.cpp) find_package(Audiere REQUIRED) set(SOUND_INPUT_INCLUDES ${AUDIERE_INCLUDE_DIR}) set(SOUND_INPUT_LIBRARY ${AUDIERE_LIBRARY}) @@ -131,8 +127,6 @@ if (USE_AUDIERE) endif (USE_AUDIERE) if (USE_FFMPEG) - set(MANGLE_SOUND_OUTPUT - ${LIBDIR}/mangle/sound/sources/ffmpeg_source.cpp) find_package(FFMPEG REQUIRED) set(SOUND_INPUT_INCLUDES ${FFMPEG_INCLUDE_DIR}) set(SOUND_INPUT_LIBRARY ${FFMPEG_LIBRARIES}) @@ -140,10 +134,6 @@ if (USE_FFMPEG) endif (USE_FFMPEG) if (USE_MPG123) - set(MANGLE_SOUND_OUTPUT - ${LIBDIR}/mangle/sound/sources/mpg123_source.cpp - ${LIBDIR}/mangle/sound/sources/libsndfile.cpp - ${LIBDIR}/mangle/sound/sources/sample_reader.cpp) find_package(MPG123 REQUIRED) find_package(SNDFILE REQUIRED) set(SOUND_INPUT_INCLUDES ${MPG123_INCLUDE_DIR} ${SNDFILE_INCLUDE_DIR}) @@ -151,14 +141,7 @@ if (USE_MPG123) set(SOUND_DEFINE -DOPENMW_USE_MPG123) endif (USE_MPG123) -set(OENGINE_SOUND - # Mangle and OEngine sound files are sort of intertwined, so put - # them together here - ${LIBDIR}/openengine/sound/sndmanager.cpp - ${LIBDIR}/mangle/sound/outputs/openal_out.cpp - ${MANGLE_SOUND_OUTPUT} -) -set(OENGINE_ALL ${OENGINE_OGRE} ${OENGINE_GUI} ${OENGINE_SOUND} ${OENGINE_BULLET}) +set(OENGINE_ALL ${OENGINE_OGRE} ${OENGINE_GUI} ${OENGINE_BULLET}) source_group(libs\\openengine FILES ${OENGINE_ALL}) set(OPENMW_LIBS ${MANGLE_ALL} ${OENGINE_ALL}) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index a5ba04e26..e0d7167de 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -6,10 +6,6 @@ #include -#include -#include -#include - #include #include "../mwworld/environment.hpp" @@ -21,39 +17,23 @@ CMakeLists.txt. */ #ifdef OPENMW_USE_AUDIERE -#include #define SOUND_FACTORY OpenAL_Audiere_Factory #define SOUND_OUT "OpenAL" #define SOUND_IN "Audiere" #endif #ifdef OPENMW_USE_FFMPEG -#include #define SOUND_FACTORY OpenAL_FFMpeg_Factory #define SOUND_OUT "OpenAL" #define SOUND_IN "FFmpeg" #endif #ifdef OPENMW_USE_MPG123 -#include #define SOUND_FACTORY OpenAL_SndFile_Mpg123_Factory #define SOUND_OUT "OpenAL" #define SOUND_IN "mpg123,sndfile" #endif -using namespace Mangle::Sound; -typedef OEngine::Sound::SoundManager OEManager; - -// Set the position on a sound based on a Ptr. -static void setPos(SoundPtr &snd, const MWWorld::Ptr ref) -{ - // Get sound position from the reference - const float *pos = ref.getCellRef().pos.pos; - - // Move the sound, converting from MW coordinates to Ogre - // coordinates. - snd->setPos(pos[0], pos[2], -pos[1]); -} namespace MWSound { @@ -63,50 +43,36 @@ namespace MWSound bool useSound, bool fsstrict, MWWorld::Environment& environment) : mFSStrict(fsstrict) , mEnvironment(environment) - , mgr(new OEManager(SoundFactoryPtr(new SOUND_FACTORY))) - , updater(mgr) - , cameraTracker(mgr) , mCurrentPlaylist(NULL) { - if(useSound) - { - // The music library will accept these filetypes - // If none is given then it will accept all filetypes - std::vector acceptableExtensions; - acceptableExtensions.push_back(".mp3"); - acceptableExtensions.push_back(".wav"); - acceptableExtensions.push_back(".ogg"); - acceptableExtensions.push_back(".flac"); - - // Makes a list of all sound files, searches in reverse for priority reasons - for (Files::PathContainer::const_reverse_iterator it = dataDirs.rbegin(); it != dataDirs.rend(); ++it) - { - Files::FileLister(*it / std::string("Sound"), mSoundFiles, true); - } + if(!useSound) + return; - // Makes a FileLibrary of all music files, searches in reverse for priority reasons - for (Files::PathContainer::const_reverse_iterator it = dataDirs.rbegin(); it != dataDirs.rend(); ++it) - { - mMusicLibrary.add(*it / std::string("Music"), true, mFSStrict, acceptableExtensions); - } + // The music library will accept these filetypes + // If none is given then it will accept all filetypes + std::vector acceptableExtensions; + acceptableExtensions.push_back(".mp3"); + acceptableExtensions.push_back(".wav"); + acceptableExtensions.push_back(".ogg"); + acceptableExtensions.push_back(".flac"); - std::string anything = "anything"; // anything is better that a segfault - mCurrentPlaylist = mMusicLibrary.section(anything, mFSStrict); // now points to an empty path + // Makes a list of all sound files, searches in reverse for priority reasons + for(Files::PathContainer::const_reverse_iterator it = dataDirs.rbegin(); it != dataDirs.rend(); ++it) + Files::FileLister(*it / std::string("Sound"), mSoundFiles, true); - std::cout << "Sound output: " << SOUND_OUT << std::endl; - std::cout << "Sound decoder: " << SOUND_IN << std::endl; - // Attach the camera to the camera tracker - cameraTracker.followCamera(camera); + // Makes a FileLibrary of all music files, searches in reverse for priority reasons + for(Files::PathContainer::const_reverse_iterator it = dataDirs.rbegin(); it != dataDirs.rend(); ++it) + mMusicLibrary.add(*it / std::string("Music"), true, mFSStrict, acceptableExtensions); - // Tell Ogre to update the sound system each frame - root->addFrameListener(&updater); - } - } + std::string anything = "anything"; // anything is better that a segfault + mCurrentPlaylist = mMusicLibrary.section(anything, mFSStrict); // now points to an empty path + + std::cout << "Sound output: " << SOUND_OUT << std::endl; + std::cout << "Sound decoder: " << SOUND_IN << std::endl; + } SoundManager::~SoundManager() { - Ogre::Root::getSingleton().removeFrameListener(&updater); - cameraTracker.unfollowCamera(); } // Convert a soundId to file name, and modify the volume @@ -115,28 +81,28 @@ namespace MWSound std::string SoundManager::lookup(const std::string &soundId, float &volume, float &min, float &max) { - const ESM::Sound *snd = mEnvironment.mWorld->getStore().sounds.search(soundId); - if(snd == NULL) return ""; - - if(snd->data.volume == 0) - volume = 0.0f; - else - volume *= pow(10.0, (snd->data.volume/255.0f*3348.0 - 3348.0) / 2000.0); - - if(snd->data.minRange == 0 && snd->data.maxRange == 0) - { - min = 100.0f; - max = 2000.0f; - } - else - { - min = snd->data.minRange * 20.0f; - max = snd->data.maxRange * 50.0f; - min = std::max(min, 1.0f); - max = std::max(min, max); - } - - return Files::FileListLocator(mSoundFiles, snd->sound, mFSStrict, false); + const ESM::Sound *snd = mEnvironment.mWorld->getStore().sounds.search(soundId); + if(snd == NULL) return ""; + + if(snd->data.volume == 0) + volume = 0.0f; + else + volume *= pow(10.0, (snd->data.volume/255.0f*3348.0 - 3348.0) / 2000.0); + + if(snd->data.minRange == 0 && snd->data.maxRange == 0) + { + min = 100.0f; + max = 2000.0f; + } + else + { + min = snd->data.minRange * 20.0f; + max = snd->data.maxRange * 50.0f; + min = std::max(min, 1.0f); + max = std::max(min, max); + } + + return Files::FileListLocator(mSoundFiles, snd->sound, mFSStrict, false); } // Add a sound to the list and play it @@ -147,190 +113,79 @@ namespace MWSound float min, float max, bool loop, bool untracked) { - try - { - SoundPtr snd = mgr->load(file); - snd->setRepeat(loop); - snd->setVolume(volume); - snd->setPitch(pitch); - snd->setRange(min,max); - setPos(snd, ptr); - snd->play(); - - if (!untracked) - { - sounds[ptr][id] = WSoundPtr(snd); - } - } - catch(...) - { - std::cout << "Error loading " << file << ", skipping.\n"; - } - } - - // Clears all the sub-elements of a given iterator, and then - // removes it from 'sounds'. - void SoundManager::clearAll(PtrMap::iterator& it) - { - IDMap::iterator sit = it->second.begin(); - - while(sit != it->second.end()) - { - // Get sound pointer, if any - SoundPtr snd = sit->second.lock(); - - // Stop the sound - if(snd) snd->stop(); - - sit++; - } - - // Remove the ptr reference - sounds.erase(it); + //std::cout << "Cannot load " << file << ", skipping.\n"; } // Stop a sound and remove it from the list. If id="" then // remove the entire object and stop all its sounds. void SoundManager::remove(MWWorld::Ptr ptr, const std::string &id) { - PtrMap::iterator it = sounds.find(ptr); - if(it != sounds.end()) - { - if(id == "") - // Kill all references to 'ptr' - clearAll(it); - else - { - // Only find the id we're looking for - IDMap::iterator it2 = it->second.find(id); - if(it2 != it->second.end()) - { - // Stop the sound and remove it from the list - SoundPtr snd = it2->second.lock(); - if(snd) snd->stop(); - it->second.erase(it2); - } - } - } } bool SoundManager::isPlaying(MWWorld::Ptr ptr, const std::string &id) const { - PtrMap::const_iterator it = sounds.find(ptr); - if(it != sounds.end()) - { - IDMap::const_iterator it2 = it->second.find(id); - if(it2 != it->second.end()) - { - // Get a shared_ptr from the weak_ptr - SoundPtr snd = it2->second.lock();; - - // Is it still alive? - if(snd) - { - // Then return its status! - return snd->isPlaying(); - } - } - } - // Nothing found, sound is not playing - return false; + // HACK: Return true to prevent the engine from trying to keep playing + // sounds and tanking the framerate. + return true; } // Remove all references to objects belonging to a given cell void SoundManager::removeCell(const MWWorld::Ptr::CellStore *cell) { - PtrMap::iterator it2, it = sounds.begin(); - while(it != sounds.end()) - { - // Make sure to increase the iterator before we erase it. - it2 = it++; - if(it2->first.getCell() == cell) - clearAll(it2); - } } void SoundManager::updatePositions(MWWorld::Ptr ptr) { - // Find the reference (if any) - PtrMap::iterator it = sounds.find(ptr); - if(it != sounds.end()) - { - // Then find all sounds in it (if any) - IDMap::iterator it2 = it->second.begin(); - for(;it2 != it->second.end(); it2++) - { - // Get the sound (if it still exists) - SoundPtr snd = it2->second.lock(); - if(snd) - // Update position - setPos(snd, ptr); - } - } } void SoundManager::stopMusic() { - if (music) - music->stop(); setPlaylist(); } - void SoundManager::streamMusicFull(const std::string& filename) - { - // Play the sound and tell it to stream, if possible. TODO: - // Store the reference, the jukebox will need to check status, - // control volume etc. - if (music) - music->stop(); - music = mgr->load(filename); - music->setStreaming(true); - music->setVolume(0.4); - music->play(); - - } + void SoundManager::streamMusicFull(const std::string& filename) + { + // Play the sound and tell it to stream, if possible. TODO: + // Store the reference, the jukebox will need to check status, + // control volume etc. + } void SoundManager::streamMusic(const std::string& filename) { std::string filePath = mMusicLibrary.locate(filename, mFSStrict, true).string(); if(!filePath.empty()) - { streamMusicFull(filePath); - } } - void SoundManager::startRandomTitle() - { - if(mCurrentPlaylist && !mCurrentPlaylist->empty()) + void SoundManager::startRandomTitle() { - Files::PathContainer::const_iterator fileIter = mCurrentPlaylist->begin(); - srand( time(NULL) ); - int r = rand() % mCurrentPlaylist->size() + 1; //old random code + if(mCurrentPlaylist && !mCurrentPlaylist->empty()) + { + Files::PathContainer::const_iterator fileIter = mCurrentPlaylist->begin(); + srand( time(NULL) ); + int r = rand() % mCurrentPlaylist->size() + 1; //old random code - std::advance(fileIter, r - 1); - std::string music = fileIter->string(); - std::cout << "Playing " << music << "\n"; + std::advance(fileIter, r - 1); + std::string music = fileIter->string(); + //std::cout << "Playing " << music << "\n"; - try - { - streamMusicFull(music); - } - catch (std::exception &e) - { - std::cout << " Music Error: " << e.what() << "\n"; + try + { + streamMusicFull(music); + } + catch (std::exception &e) + { + std::cout << "Music Error: " << e.what() << "\n"; + } } } - } bool SoundManager::isMusicPlaying() { - bool test = false; - if(music) - { - test = music->isPlaying(); - } - return test; + // HACK: Return true to prevent the engine from trying to keep playing + // music and tanking the framerate. + return true; } bool SoundManager::setPlaylist(std::string playlist) @@ -373,154 +228,122 @@ namespace MWSound } } - void SoundManager::say (MWWorld::Ptr ptr, const std::string& filename) - { - // The range values are not tested - std::string filePath = Files::FileListLocator(mSoundFiles, filename, mFSStrict, true); - if(!filePath.empty()) - add(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false); - else - std::cout << "Sound file " << filename << " not found, skipping.\n"; - } - - bool SoundManager::sayDone (MWWorld::Ptr ptr) const - { - return !isPlaying(ptr, "_say_sound"); - } - - - void SoundManager::playSound(const std::string& soundId, float volume, float pitch, bool loop) - { - float min, max; - const std::string &file = lookup(soundId, volume, min, max); - if (file != "") + void SoundManager::say(MWWorld::Ptr ptr, const std::string& filename) { - SoundPtr snd = mgr->load(file); - snd->setRepeat(loop); - snd->setVolume(volume); - snd->setRange(min,max); - snd->setPitch(pitch); - snd->setRelative(true); - snd->play(); - - if (loop) - { - // Only add the looping sound once - IDMap::iterator it = mLoopedSounds.find(soundId); - if(it == mLoopedSounds.end()) - { - mLoopedSounds[soundId] = WSoundPtr(snd); - } - } + // The range values are not tested + std::string filePath = Files::FileListLocator(mSoundFiles, filename, mFSStrict, true); + if(!filePath.empty()) + add(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false); + else + std::cout << "Sound file " << filename << " not found, skipping.\n"; + } + + bool SoundManager::sayDone(MWWorld::Ptr ptr) const + { + return !isPlaying(ptr, "_say_sound"); + } + + + void SoundManager::playSound(const std::string& soundId, float volume, float pitch, bool loop) + { + float min, max; + const std::string &file = lookup(soundId, volume, min, max); + std::cout << "Cannot play " << file << ", skipping.\n"; + } + + void SoundManager::playSound3D(MWWorld::Ptr ptr, const std::string& soundId, + float volume, float pitch, bool loop, bool untracked) + { + // Look up the sound in the ESM data + float min, max; + const std::string &file = lookup(soundId, volume, min, max); + if(file != "") + add(file, ptr, soundId, volume, pitch, min, max, loop, untracked); + } + + void SoundManager::stopSound3D(MWWorld::Ptr ptr, const std::string& soundId) + { + remove(ptr, soundId); + } + + void SoundManager::stopSound(MWWorld::Ptr::CellStore *cell) + { + removeCell(cell); } - } - - void SoundManager::playSound3D (MWWorld::Ptr ptr, const std::string& soundId, - float volume, float pitch, bool loop, bool untracked) - { - // Look up the sound in the ESM data - float min, max; - const std::string &file = lookup(soundId, volume, min, max); - if (file != "") - add(file, ptr, soundId, volume, pitch, min, max, loop, untracked); - } - - void SoundManager::stopSound3D (MWWorld::Ptr ptr, const std::string& soundId) - { - remove(ptr, soundId); - } - - void SoundManager::stopSound (MWWorld::Ptr::CellStore *cell) - { - removeCell(cell); - } void SoundManager::stopSound(const std::string& soundId) { - IDMap::iterator it = mLoopedSounds.find(soundId); - if(it != mLoopedSounds.end()) - { - SoundPtr snd = it->second.lock(); - if(snd) snd->stop(); - mLoopedSounds.erase(it); - } } - bool SoundManager::getSoundPlaying (MWWorld::Ptr ptr, const std::string& soundId) const - { - // Mark all sounds as playing, otherwise the scripts will just - // keep trying to play them every frame. + bool SoundManager::getSoundPlaying(MWWorld::Ptr ptr, const std::string& soundId) const + { + // Mark all sounds as playing, otherwise the scripts will just + // keep trying to play them every frame. - return isPlaying(ptr, soundId); - } + return isPlaying(ptr, soundId); + } - void SoundManager::updateObject(MWWorld::Ptr ptr) - { - updatePositions(ptr); - } + void SoundManager::updateObject(MWWorld::Ptr ptr) + { + updatePositions(ptr); + } - void SoundManager::update (float duration) - { + void SoundManager::update(float duration) + { MWWorld::Ptr::CellStore *current = mEnvironment.mWorld->getPlayer().getPlayer().getCell(); static int total = 0; static std::string regionName = ""; static float timePassed = 0.0; - timePassed += duration; //If the region has changed - if(!(current->cell->data.flags & current->cell->Interior) && timePassed >= 10) + timePassed += duration; + if((current->cell->data.flags & current->cell->Interior) || timePassed < 10) + return; + + ESM::Region test = (ESM::Region) *(mEnvironment.mWorld->getStore().regions.find(current->cell->region)); + + timePassed = 0; + if(regionName != current->cell->region) { + regionName = current->cell->region; + total = 0; + } - ESM::Region test = (ESM::Region) *(mEnvironment.mWorld->getStore().regions.find(current->cell->region)); + if(test.soundList.size() == 0) + return; - timePassed = 0; - if (regionName != current->cell->region) + std::vector::iterator soundIter; + if(total == 0) + { + soundIter = test.soundList.begin(); + while(soundIter != test.soundList.end()) { - regionName = current->cell->region; - total = 0; + int chance = (int) soundIter->chance; + //ESM::NAME32 go = soundIter->sound; + //std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; + soundIter++; + total += chance; } + } - if(test.soundList.size() > 0) + int r = rand() % total; //old random code + int pos = 0; + + soundIter = test.soundList.begin(); + while(soundIter != test.soundList.end()) + { + const std::string go = soundIter->sound.toString(); + int chance = (int) soundIter->chance; + //std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; + soundIter++; + if(r - pos < chance) { - std::vector::iterator soundIter = test.soundList.begin(); - //mEnvironment.mSoundManager - if(total == 0) - { - while (soundIter != test.soundList.end()) - { - int chance = (int) soundIter->chance; - //ESM::NAME32 go = soundIter->sound; - //std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; - soundIter++; - total += chance; - } - } - - int r = rand() % total; //old random code - int pos = 0; - soundIter = test.soundList.begin(); - while (soundIter != test.soundList.end()) - { - const std::string go = soundIter->sound.toString(); - int chance = (int) soundIter->chance; - //std::cout << "Sound: " << go.name <<" Chance:" << chance << "\n"; - soundIter++; - if( r - pos < chance) - { - //play sound - std::cout << "Sound: " << go <<" Chance:" << chance << "\n"; - mEnvironment.mSoundManager->playSound(go, 20.0, 1.0); - - break; - } - pos += chance; - } + //play sound + std::cout << "Sound: " << go <<" Chance:" << chance << "\n"; + playSound(go, 20.0, 1.0); + break; } + pos += chance; } - else if(current->cell->data.flags & current->cell->Interior) - { - regionName = ""; - } - - } + } } diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index bd3b67679..9db7fe1b7 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -3,11 +3,6 @@ #include -#include -#include - -#include - #include #include "../mwworld/ptr.hpp" @@ -19,16 +14,6 @@ namespace Ogre class Camera; } -namespace Mangle -{ - namespace Sound - { - typedef boost::shared_ptr SoundPtr; - } -} - -typedef OEngine::Sound::SoundManagerPtr OEManagerPtr; - namespace MWWorld { struct Environment; @@ -51,26 +36,6 @@ namespace MWSound ///< Play a soundifle /// \param absolute filename - /* This is the sound manager. It loades, stores and deletes - sounds based on the sound factory it is given. - */ - OEManagerPtr mgr; - Mangle::Sound::SoundPtr music; - - /* This class calls update() on the sound manager each frame - using and Ogre::FrameListener - */ - Mangle::Sound::OgreOutputUpdater updater; - - /* This class tracks the movement of an Ogre::Camera and moves - a sound listener automatically to follow it. - */ - Mangle::Sound::OgreListenerMover cameraTracker; - - typedef std::map IDMap; - typedef std::map PtrMap; - PtrMap sounds; - // A list of all sound files used to lookup paths Files::PathContainer mSoundFiles; @@ -80,15 +45,12 @@ namespace MWSound // Points to the current playlist of music files stored in the music library const Files::PathContainer* mCurrentPlaylist; - IDMap mLoopedSounds; - std::string lookup(const std::string &soundId, float &volume, float &min, float &max); void add(const std::string &file, MWWorld::Ptr ptr, const std::string &id, float volume, float pitch, float min, float max, bool loop, bool untracked=false); - void clearAll(PtrMap::iterator& it); void remove(MWWorld::Ptr ptr, const std::string &id = ""); bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; void removeCell(const MWWorld::Ptr::CellStore *cell); diff --git a/libs/mangle/sound/.gitignore b/libs/mangle/sound/.gitignore deleted file mode 100644 index 8b1378917..000000000 --- a/libs/mangle/sound/.gitignore +++ /dev/null @@ -1 +0,0 @@ - diff --git a/libs/mangle/sound/clients/ogre_listener_mover.hpp b/libs/mangle/sound/clients/ogre_listener_mover.hpp deleted file mode 100644 index 74c21db32..000000000 --- a/libs/mangle/sound/clients/ogre_listener_mover.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef MANGLE_SOUND_OGRELISTENERMOVER_H -#define MANGLE_SOUND_OGRELISTENERMOVER_H - -#include -#include -#include "../output.hpp" - -namespace Mangle { -namespace Sound { - - /** This class lets a sound listener (ie. the SoundFactory) track a - given camera in Ogre3D. The position and orientation of the - listener will be updated to match the camera whenever the camera - is moved. - */ - struct OgreListenerMover : Ogre::Camera::Listener - { - OgreListenerMover(Mangle::Sound::SoundFactoryPtr snd) - : soundFact(snd), camera(NULL) - {} - - /// Follow a camera. WARNING: This will OVERRIDE any other - /// MovableObject::Listener you may have attached to the camera. - void followCamera(Ogre::Camera *cam) - { - camera = cam; - camera->addListener(this); - } - - void unfollowCamera() - { - // If the camera is null, this object wasn't following a camera. - // It doesn't make sense to call unfollow - assert(camera != NULL); - - camera->removeListener(this); - camera = NULL; - } - - private: - Mangle::Sound::SoundFactoryPtr soundFact; - Ogre::Camera *camera; - Ogre::Vector3 pos, dir, up; - - /// From Camera::Listener. This is called once per - /// frame. Unfortunately, Ogre doesn't allow us to be notified - /// only when the camera itself has moved, so we must poll every - /// frame. - void cameraPreRenderScene(Ogre::Camera *cam) - { - assert(cam == camera); - - Ogre::Vector3 nPos, nDir, nUp; - - nPos = camera->getRealPosition(); - nDir = camera->getRealDirection(); - nUp = camera->getRealUp(); - - // Don't bother the sound system needlessly - if(nDir != dir || nPos != pos || nUp != up) - { - pos = nPos; - dir = nDir; - up = nUp; - - soundFact->setListenerPos(pos.x, pos.y, pos.z, - dir.x, dir.y, dir.z, - up.x, up.y, up.z); - } - } - - void cameraDestroyed(Ogre::Camera *cam) - { - assert(cam == camera); - camera = NULL; - } - }; -}} -#endif diff --git a/libs/mangle/sound/clients/ogre_output_updater.hpp b/libs/mangle/sound/clients/ogre_output_updater.hpp deleted file mode 100644 index b73168c75..000000000 --- a/libs/mangle/sound/clients/ogre_output_updater.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef MANGLE_SOUND_OGREUPDATER_H -#define MANGLE_SOUND_OGREUPDATER_H - -/* - This Ogre FrameListener calls update on a SoundFactory - */ - -#include -#include "../output.hpp" -#include - -namespace Mangle { -namespace Sound { - - struct OgreOutputUpdater : Ogre::FrameListener - { - Mangle::Sound::SoundFactoryPtr driver; - - OgreOutputUpdater(Mangle::Sound::SoundFactoryPtr drv) - : driver(drv) - { assert(drv->needsUpdate); } - - bool frameStarted(const Ogre::FrameEvent &evt) - { - driver->update(); - return true; - } - }; -}} - -#endif diff --git a/libs/mangle/sound/filters/input_filter.hpp b/libs/mangle/sound/filters/input_filter.hpp deleted file mode 100644 index 00ee18766..000000000 --- a/libs/mangle/sound/filters/input_filter.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef MANGLE_INPUT_FILTER_H -#define MANGLE_INPUT_FILTER_H - -#include "../output.hpp" - -#include - -namespace Mangle { -namespace Sound { - -/** - @brief This filter class adds file loading capabilities to a - Sound::SoundFactory class, by associating a SampleSourceLoader with - it. - - The class takes an existing SoundFactory able to load streams, and - associates a SampleSourceLoader with it. The combined class is able - to load files directly. */ -class InputFilter : public SoundFactory -{ - protected: - SoundFactoryPtr snd; - SampleSourceLoaderPtr inp; - - public: - /// Empty constructor - InputFilter() {} - - /// Assign an input manager and a sound manager to this object - InputFilter(SoundFactoryPtr _snd, SampleSourceLoaderPtr _inp) - { set(_snd, _inp); } - - /// Assign an input manager and a sound manager to this object - void set(SoundFactoryPtr _snd, SampleSourceLoaderPtr _inp) - { - inp = _inp; - snd = _snd; - - // Set capabilities - needsUpdate = snd->needsUpdate; - has3D = snd->has3D; - canLoadStream = inp->canLoadStream; - - // Both these should be true, or the use of this class is pretty - // pointless - canLoadSource = snd->canLoadSource; - canLoadFile = inp->canLoadFile; - assert(canLoadSource && canLoadFile); - } - - virtual SoundPtr load(const std::string &file) - { return loadRaw(inp->load(file)); } - - virtual SoundPtr load(Stream::StreamPtr input) - { return loadRaw(inp->load(input)); } - - virtual SoundPtr loadRaw(SampleSourcePtr input) - { return snd->loadRaw(input); } - - virtual void update() { snd->update(); } - virtual void setListenerPos(float x, float y, float z, - float fx, float fy, float fz, - float ux, float uy, float uz) - { snd->setListenerPos(x,y,z,fx,fy,fz,ux,uy,uz); } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_audiere.hpp b/libs/mangle/sound/filters/openal_audiere.hpp deleted file mode 100644 index 5b9b51824..000000000 --- a/libs/mangle/sound/filters/openal_audiere.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MANGLE_AUDIERE_OPENAL_H -#define MANGLE_AUDIERE_OPENAL_H - -#include "input_filter.hpp" -#include "../sources/audiere_source.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/// A InputFilter that adds audiere decoding to OpenAL. Audiere has -/// it's own output, but OpenAL sports 3D and other advanced features. -class OpenAL_Audiere_Factory : public InputFilter -{ - public: - OpenAL_Audiere_Factory() - { - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(new AudiereLoader)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_ffmpeg.hpp b/libs/mangle/sound/filters/openal_ffmpeg.hpp deleted file mode 100644 index 42c76af0c..000000000 --- a/libs/mangle/sound/filters/openal_ffmpeg.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MANGLE_FFMPEG_OPENAL_H -#define MANGLE_FFMPEG_OPENAL_H - -#include "input_filter.hpp" -#include "../sources/ffmpeg_source.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/// A InputFilter that adds ffmpeg decoding to OpenAL. -class OpenAL_FFMpeg_Factory : public InputFilter -{ - public: - OpenAL_FFMpeg_Factory() - { - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(new FFMpegLoader)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_mpg123.hpp b/libs/mangle/sound/filters/openal_mpg123.hpp deleted file mode 100644 index bfd926c0b..000000000 --- a/libs/mangle/sound/filters/openal_mpg123.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MANGLE_MPG123_OPENAL_H -#define MANGLE_MPG123_OPENAL_H - -#include "input_filter.hpp" -#include "../sources/mpg123_source.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/// A InputFilter that adds mpg123 decoding to OpenAL. Only supports -/// MP3 files. -class OpenAL_Mpg123_Factory : public InputFilter -{ - public: - OpenAL_Mpg123_Factory() - { - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(new Mpg123Loader)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_sndfile.hpp b/libs/mangle/sound/filters/openal_sndfile.hpp deleted file mode 100644 index fd7e78025..000000000 --- a/libs/mangle/sound/filters/openal_sndfile.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MANGLE_SNDFILE_OPENAL_H -#define MANGLE_SNDFILE_OPENAL_H - -#include "input_filter.hpp" -#include "../sources/libsndfile.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/// A InputFilter that adds libsnd decoding to OpenAL. libsndfile -/// supports most formats except MP3. -class OpenAL_SndFile_Factory : public InputFilter -{ - public: - OpenAL_SndFile_Factory() - { - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(new SndFileLoader)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_sndfile_mpg123.hpp b/libs/mangle/sound/filters/openal_sndfile_mpg123.hpp deleted file mode 100644 index 6e5db4d0e..000000000 --- a/libs/mangle/sound/filters/openal_sndfile_mpg123.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef MANGLE_SNDFILE_MPG123_OPENAL_H -#define MANGLE_SNDFILE_MPG123_OPENAL_H - -#include "input_filter.hpp" -#include "source_splicer.hpp" -#include "../sources/mpg123_source.hpp" -#include "../sources/libsndfile.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/// A InputFilter that uses OpenAL for output, and mpg123 (for MP3) + -/// libsndfile (for everything else) to decode files. Can only load -/// from the file system, and uses the file name to differentiate -/// between mp3 and non-mp3 types. -class OpenAL_SndFile_Mpg123_Factory : public InputFilter -{ - public: - OpenAL_SndFile_Mpg123_Factory() - { - SourceSplicer *splice = new SourceSplicer; - - splice->add("mp3", SampleSourceLoaderPtr(new Mpg123Loader)); - splice->setDefault(SampleSourceLoaderPtr(new SndFileLoader)); - - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(splice)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/openal_various.hpp b/libs/mangle/sound/filters/openal_various.hpp deleted file mode 100644 index 945b3dabd..000000000 --- a/libs/mangle/sound/filters/openal_various.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef MANGLE_VARIOUS_OPENAL_H -#define MANGLE_VARIOUS_OPENAL_H - -#include "input_filter.hpp" -#include "source_splicer.hpp" -#include "../sources/mpg123_source.hpp" -#include "../sources/wav_source.hpp" -#include "../outputs/openal_out.hpp" - -namespace Mangle { -namespace Sound { - -/** A InputFilter that uses OpenAL for output, and load input from - various individual sources, depending on file extension. Currently - supports: - - MP3: mpg123 - WAV: custom wav loader (PCM only) - - This could be an alternative to using eg. 3rd party decoder - libraries like libsndfile. - */ -class OpenAL_Various_Factory : public InputFilter -{ - public: - OpenAL_Various_Factory() - { - SourceSplicer *splice = new SourceSplicer; - - splice->add("mp3", SampleSourceLoaderPtr(new Mpg123Loader)); - splice->add("wav", SampleSourceLoaderPtr(new WavLoader)); - - set(SoundFactoryPtr(new OpenAL_Factory), - SampleSourceLoaderPtr(splice)); - } -}; - -}} -#endif diff --git a/libs/mangle/sound/filters/pure_filter.hpp b/libs/mangle/sound/filters/pure_filter.hpp deleted file mode 100644 index fc5e62574..000000000 --- a/libs/mangle/sound/filters/pure_filter.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef MANGLE_SOUND_OUTPUT_PUREFILTER_H -#define MANGLE_SOUND_OUTPUT_PUREFILTER_H - -#include "../output.hpp" - -namespace Mangle -{ - namespace Sound - { - // For use in writing other filters - class SoundFilter : public Sound - { - protected: - SoundPtr client; - - public: - SoundFilter(SoundPtr c) : client(c) {} - void play() { client->play(); } - void stop() { client->stop(); } - void pause() { client->pause(); } - bool isPlaying() const { return client->isPlaying(); } - void setVolume(float f) { client->setVolume(f); } - void setPan(float f) { client->setPan(f); } - void setPos(float x, float y, float z) - { client->setPos(x,y,z); } - void setPitch(float p) { client->setPitch(p); } - void setRepeat(bool b) { client->setRepeat(b); } - void setRange(float a, float b=0, float c=0) - { client->setRange(a,b,c); } - void setStreaming(bool b) { client->setStreaming(b); } - void setRelative(bool b) { client->setRelative(b); } - - // The clone() function is not implemented here, as you will - // almost certainly want to override it yourself - }; - - class FactoryFilter : public SoundFactory - { - protected: - SoundFactoryPtr client; - - public: - FactoryFilter(SoundFactoryPtr c) : client(c) - { - needsUpdate = client->needsUpdate; - has3D = client->has3D; - canLoadFile = client->canLoadFile; - canLoadStream = client->canLoadStream; - canLoadSource = client->canLoadSource; - } - - SoundPtr loadRaw(SampleSourcePtr input) - { return client->loadRaw(input); } - - SoundPtr load(Stream::StreamPtr input) - { return client->load(input); } - - SoundPtr load(const std::string &file) - { return client->load(file); } - - void update() - { client->update(); } - - void setListenerPos(float x, float y, float z, - float fx, float fy, float fz, - float ux, float uy, float uz) - { - client->setListenerPos(x,y,z,fx,fy,fz,ux,uy,uz); - } - }; - } -} -#endif diff --git a/libs/mangle/sound/filters/source_splicer.hpp b/libs/mangle/sound/filters/source_splicer.hpp deleted file mode 100644 index 9c7623086..000000000 --- a/libs/mangle/sound/filters/source_splicer.hpp +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef MANGLE_SOUND_SOURCE_SPLICE_H -#define MANGLE_SOUND_SOURCE_SPLICE_H - -#include "../source.hpp" -#include -#include -#include -#include - -namespace Mangle -{ - namespace Sound - { - class SourceSplicer : public SampleSourceLoader - { - struct SourceType - { - std::string type; - SampleSourceLoaderPtr loader; - }; - - typedef std::list TypeList; - TypeList list; - SampleSourceLoaderPtr catchAll; - - static bool isMatch(char a, char b) - { - if(a >= 'A' && a <= 'Z') - a += 'a' - 'A'; - if(b >= 'A' && b <= 'Z') - b += 'a' - 'A'; - return a == b; - } - - public: - SourceSplicer() - { - canLoadStream = false; - canLoadFile = true; - } - - void add(const std::string &type, SampleSourceLoaderPtr fact) - { - SourceType tp; - tp.type = type; - tp.loader = fact; - list.push_back(tp); - } - - void setDefault(SampleSourceLoaderPtr def) - { - catchAll = def; - } - - SampleSourcePtr load(const std::string &file) - { - // Search the list for this file type. - for(TypeList::iterator it = list.begin(); - it != list.end(); it++) - { - const std::string &t = it->type; - - int diff = file.size() - t.size(); - if(diff < 0) continue; - - bool match = true; - for(unsigned i=0; iloader->load(file); - } - // If not found, use the catch-all - if(catchAll) - return catchAll->load(file); - - throw std::runtime_error("No handler for sound file " + file); - } - - SampleSourcePtr load(Stream::StreamPtr input) { assert(0); } - }; - } -} - -#endif diff --git a/libs/mangle/sound/output.hpp b/libs/mangle/sound/output.hpp deleted file mode 100644 index e30bf21e2..000000000 --- a/libs/mangle/sound/output.hpp +++ /dev/null @@ -1,183 +0,0 @@ -#ifndef MANGLE_SOUND_OUTPUT_H -#define MANGLE_SOUND_OUTPUT_H - -#include -#include - -#include "source.hpp" -#include "../stream/stream.hpp" - -namespace Mangle { -namespace Sound { - -/// Abstract interface for a single playable sound -/** This class represents one sound outlet, which may be played, - stopped, paused and so on. - - Sound instances are created from the SoundFactory class. Sounds - may be connected to a SampleSource or read directly from a file, - and they may support 3d sounds, looping and other features - depending on the capabilities of the backend system. - - To create multiple instances of one sound, it is recommended to - 'clone' an existing instance instead of reloading it from - file. Cloned sounds will often (depending on the back-end) use - less memory due to shared buffers. -*/ -class Sound; -typedef boost::shared_ptr SoundPtr; -typedef boost::weak_ptr WSoundPtr; - -class Sound -{ - public: - /// Play or resume the sound - virtual void play() = 0; - - /// Stop the sound - virtual void stop() = 0; - - /// Pause the sound, may be resumed later - virtual void pause() = 0; - - /// Check if the sound is still playing - virtual bool isPlaying() const = 0; - - /// Set the volume. The parameter must be between 0.0 and 1.0. - virtual void setVolume(float) = 0; - - /// Set left/right pan. -1.0 is left, 0.0 is center and 1.0 is right. - virtual void setPan(float) = 0; - - /// Set pitch (1.0 is normal speed) - virtual void setPitch(float) = 0; - - /// Set range factors for 3D sounds. The meaning of the fields - /// depend on implementation. - virtual void setRange(float a, float b=0.0, float c=0.0) = 0; - - /// Set the position. May not work with all backends. - virtual void setPos(float x, float y, float z) = 0; - - /// Set loop mode - virtual void setRepeat(bool) = 0; - - /// If set to true the sound will not be affected by player movement - virtual void setRelative(bool) = 0; - - /// Set streaming mode. - /** This may be used by implementations to optimize for very large - files. If streaming mode is off (default), most implementations - will load the entire file into memory before starting playback. - */ - virtual void setStreaming(bool) = 0; - - /// Create a new instance of this sound. - /** Playback status is not cloned, only the sound data - itself. Back-ends can use this as a means of sharing data and - saving memory. */ - virtual SoundPtr clone() = 0; - - /// Virtual destructor - virtual ~Sound() {} -}; - -/// Factory interface for creating Sound objects -/** The SoundFactory is the main entry point to a given sound output - system. It is used to create Sound objects, which may be connected - to a sound file or stream, and which may be individually played, - paused, and so on. - - The class also contains a set of public bools which describe the - capabilities the particular system. These should be set by - implementations (base classes) in their respective constructors. - */ -class SoundFactory -{ - public: - /// Virtual destructor - virtual ~SoundFactory() {} - - /** @brief If set to true, you should call update() regularly (every frame - or so) on this sound manager. If false, update() should not be - called. - */ - bool needsUpdate; - - /** @brief true if 3D functions are available. If false, all use of - 3D sounds and calls to setPos / setListenerPos will result in - undefined behavior. - */ - bool has3D; - - /// true if we can load sounds directly from file (containing encoded data) - bool canLoadFile; - - /// If true, we can lound sound files from a Stream (containing encoded data) - bool canLoadStream; - - /// true if we can load sounds from a SampleSource (containing raw data) - bool canLoadSource; - - /** - @brief Load a sound from a sample source. Only valid if - canLoadSource is true. - - This function loads a sound from a given stream as defined by - SampleSource. - - @param input the input source - @param stream true if the file should be streamed. - Implementations may use this for optimizing playback of - large files, but they are not required to. - @return a new Sound object - */ - virtual SoundPtr loadRaw(SampleSourcePtr input) = 0; - - /** - @brief Load a sound file from stream. Only valid if canLoadStream - is true. - - @param input audio file stream - @param stream true if the file should be streamed - @see load(InputSource*,bool) - */ - virtual SoundPtr load(Stream::StreamPtr input) = 0; - - /** - @brief Load a sound directly from file. Only valid if canLoadFile - is true. - - @param file filename - @param stream true if the file should be streamed - @see load(InputSource*,bool) - */ - virtual SoundPtr load(const std::string &file) = 0; - - /// Call this every frame if needsUpdate is true - /** - This should be called regularly (about every frame in a normal - game setting.) Implementions may use this for filling streaming - buffers and similar tasks. Implementations that do not need this - should set needsUpdate to false. - */ - virtual void update() { assert(0); } - - /// Set listener position (coordinates, front and up vectors) - /** - Only valid if has3D is true. - - @param x,y,z listener position - @param fx,fy,fz listener's looking direction - @param ux,uy,uz listener's up direction - */ - virtual void setListenerPos(float x, float y, float z, - float fx, float fy, float fz, - float ux, float uy, float uz) = 0; -}; - -typedef boost::shared_ptr SoundFactoryPtr; - -}} // Namespaces - -#endif diff --git a/libs/mangle/sound/outputs/openal_out.cpp b/libs/mangle/sound/outputs/openal_out.cpp deleted file mode 100644 index 2056b4f60..000000000 --- a/libs/mangle/sound/outputs/openal_out.cpp +++ /dev/null @@ -1,500 +0,0 @@ -#include "openal_out.hpp" -#include -#include - -#include "../../stream/filters/buffer_stream.hpp" - -#ifdef _WIN32 -#include -#include -#elif defined(__APPLE__) -#include -#include -#else -#include -#include -#endif - -using namespace Mangle::Sound; - -// ---- Helper functions and classes ---- - -// Static buffer used to shuffle sound data from the input into -// OpenAL. The data is only stored temporarily and then immediately -// shuffled off to the library. This is not thread safe, but it works -// fine with multiple sounds in one thread. It could be made thread -// safe simply by using thread local storage. -const size_t BSIZE = 32*1024; -static char tmp_buffer[BSIZE]; - -// Number of buffers used (per sound) for streaming sounds. Each -// buffer is of size BSIZE. Increasing this will make streaming sounds -// more fault tolerant against temporary lapses in call to update(), -// but will also increase memory usage. -// This was changed from 4 to 150 for an estimated 30 seconds tolerance. -// At some point we should replace it with a more multithreading-ish -// solution. -const int STREAM_BUF_NUM = 150; - -static void fail(const std::string &msg) -{ throw std::runtime_error("OpenAL exception: " + msg); } - -/* - Check for AL error. Since we're always calling this with string - literals, and it only makes sense to optimize for the non-error - case, the parameter is const char* rather than std::string. - - This way we don't force the compiler to create a string object each - time we're called (since the string is never used unless there's an - error), although a good compiler might have optimized that away in - any case. - */ -static void checkALError(const char *where) -{ - ALenum err = alGetError(); - if(err != AL_NO_ERROR) - { - std::string msg = where; - - const ALchar* errmsg = alGetString(err); - if(errmsg) - fail("\"" + std::string(alGetString(err)) + "\" while " + msg); - else - fail("non-specified error while " + msg + " (did you forget to initialize OpenAL?)"); - } -} - -static void getALFormat(SampleSourcePtr inp, int &fmt, int &rate) -{ - boost::int32_t rate_, ch, bits; - inp->getInfo(&rate_, &ch, &bits); - rate = rate_; - - fmt = 0; - - if(bits == 8) - { - if(ch == 1) fmt = AL_FORMAT_MONO8; - if(ch == 2) fmt = AL_FORMAT_STEREO8; - if(alIsExtensionPresent("AL_EXT_MCFORMATS")) - { - if(ch == 4) fmt = alGetEnumValue("AL_FORMAT_QUAD8"); - if(ch == 6) fmt = alGetEnumValue("AL_FORMAT_51CHN8"); - } - } - if(bits == 16) - { - if(ch == 1) fmt = AL_FORMAT_MONO16; - if(ch == 2) fmt = AL_FORMAT_STEREO16; - if(ch == 4) fmt = alGetEnumValue("AL_FORMAT_QUAD16"); - if(alIsExtensionPresent("AL_EXT_MCFORMATS")) - { - if(ch == 4) fmt = alGetEnumValue("AL_FORMAT_QUAD16"); - if(ch == 6) fmt = alGetEnumValue("AL_FORMAT_51CHN16"); - } - } - - if(fmt == 0) - fail("Unsupported input format"); -} - -/// OpenAL sound output -class Mangle::Sound::OpenAL_Sound : public Sound -{ - ALuint inst; - - // Buffers. Only the first is used for non-streaming sounds. - ALuint bufferID[STREAM_BUF_NUM]; - - // Number of buffers used - int bufNum; - - // Parameters used for filling buffers - int fmt, rate; - - // Poor mans reference counting. Might improve this later. When - // NULL, the buffer has not been set up yet. - int *refCnt; - - bool streaming; - - // Input stream - SampleSourcePtr input; - - OpenAL_Factory *owner; - bool ownerAlive; - - // Used for streamed sound list - OpenAL_Sound *next, *prev; - - void setupBuffer(); - - // Fill data into the given buffer and queue it, if there is any - // data left to queue. Assumes the buffer is already unqueued, if - // necessary. - void queueBuffer(ALuint buf) - { - // If there is no more data, do nothing - if(!input) return; - if(input->eof()) - { - input.reset(); - return; - } - - // Get some new data - size_t bytes = input->read(tmp_buffer, BSIZE); - if(bytes == 0) - { - input.reset(); - return; - } - - // Move data into the OpenAL buffer - alBufferData(buf, fmt, tmp_buffer, bytes, rate); - // Queue it - alSourceQueueBuffers(inst, 1, &buf); - checkALError("Queueing buffer data"); - } - - public: - /// Read samples from the given input buffer - OpenAL_Sound(SampleSourcePtr input, OpenAL_Factory *fact); - - /// Play an existing buffer, with a given ref counter. Used - /// internally for cloning. - OpenAL_Sound(ALuint buf, int *ref, OpenAL_Factory *fact); - - ~OpenAL_Sound(); - - // Must be called regularly on streamed sounds - void update() - { - if(!streaming) return; - if(!input) return; - - // Get the number of processed buffers - ALint count; - alGetSourcei(inst, AL_BUFFERS_PROCESSED, &count); - checkALError("getting number of unprocessed buffers"); - - for(int i=0; iupdate(); -} - -void OpenAL_Factory::notifyStreaming(OpenAL_Sound *snd) -{ - // Add the sound to the streaming list - streaming.push_back(snd); -} - -void OpenAL_Factory::notifyDelete(OpenAL_Sound *snd) -{ - // Remove the sound from the stream list - streaming.remove(snd); -} - -OpenAL_Factory::~OpenAL_Factory() -{ - // Notify remaining streamed sounds that we're dying - StreamList::iterator it = streaming.begin(); - for(;it != streaming.end(); it++) - (*it)->notifyOwnerDeath(); - - // Deinitialize sound system - if(didSetup) - { - alcMakeContextCurrent(NULL); - if(context) alcDestroyContext((ALCcontext*)context); - if(device) alcCloseDevice((ALCdevice*)device); - } -} - -// ---- OpenAL_Sound ---- - -void OpenAL_Sound::play() -{ - setupBuffer(); - alSourcePlay(inst); - checkALError("starting playback"); -} - -void OpenAL_Sound::stop() -{ - alSourceStop(inst); - checkALError("stopping"); -} - -void OpenAL_Sound::pause() -{ - alSourcePause(inst); - checkALError("pausing"); -} - -bool OpenAL_Sound::isPlaying() const -{ - ALint state; - alGetSourcei(inst, AL_SOURCE_STATE, &state); - - return state == AL_PLAYING; -} - -void OpenAL_Sound::setVolume(float volume) -{ - if(volume > 1.0) volume = 1.0; - if(volume < 0.0) volume = 0.0; - alSourcef(inst, AL_GAIN, volume); - checkALError("setting volume"); -} - -void OpenAL_Sound::setRange(float a, float b, float) -{ - alSourcef(inst, AL_REFERENCE_DISTANCE, a); - alSourcef(inst, AL_MAX_DISTANCE, b); - checkALError("setting sound ranges"); -} - -void OpenAL_Sound::setPos(float x, float y, float z) -{ - alSource3f(inst, AL_POSITION, x, y, z); - checkALError("setting position"); -} - -void OpenAL_Sound::setPitch(float pitch) -{ - alSourcef(inst, AL_PITCH, pitch); - checkALError("setting pitch"); -} - -void OpenAL_Sound::setRepeat(bool rep) -{ - alSourcei(inst, AL_LOOPING, rep?AL_TRUE:AL_FALSE); -} - -void OpenAL_Sound::setRelative(bool rel) -{ - alSourcei(inst, AL_SOURCE_RELATIVE, rel?AL_TRUE:AL_FALSE); - checkALError("setting relative"); -} - -SoundPtr OpenAL_Sound::clone() -{ - setupBuffer(); - assert(!streaming && "cloning streamed sounds not supported"); - return SoundPtr(new OpenAL_Sound(bufferID[0], refCnt, owner)); -} - -// Constructor used for cloned sounds -OpenAL_Sound::OpenAL_Sound(ALuint buf, int *ref, OpenAL_Factory *fact) - : refCnt(ref), streaming(false), owner(fact), ownerAlive(false) -{ - // Increase the reference count - assert(ref != NULL); - (*refCnt)++; - - // Set up buffer - bufferID[0] = buf; - bufNum = 1; - - // Create a source - alGenSources(1, &inst); - checkALError("creating instance (clone)"); - alSourcei(inst, AL_BUFFER, bufferID[0]); - checkALError("assigning buffer (clone)"); -} - -// Constructor used for original (non-cloned) sounds -OpenAL_Sound::OpenAL_Sound(SampleSourcePtr _input, OpenAL_Factory *fact) - : refCnt(NULL), streaming(false), input(_input), owner(fact), ownerAlive(false) -{ - // Create a source - alGenSources(1, &inst); - checkALError("creating source"); - - // By default, the sound starts out in a buffer-less mode. We don't - // create a buffer until the sound is played. This gives the user - // the chance to call setStreaming(true) first. -} - -void OpenAL_Sound::setupBuffer() -{ - if(refCnt != NULL) return; - - assert(input); - - // Get the format - getALFormat(input, fmt, rate); - - // Create a cheap reference counter for the buffer - refCnt = new int; - *refCnt = 1; - - if(streaming) bufNum = STREAM_BUF_NUM; - else bufNum = 1; - - // Set up the OpenAL buffer(s) - alGenBuffers(bufNum, bufferID); - checkALError("generating buffer(s)"); - assert(bufferID[0] != 0); - - // STREAMING. - if(streaming) - { - // Just queue all the buffers with data and exit. queueBuffer() - // will work correctly also in the case where there is not - // enough data to fill all the buffers. - for(int i=0; inotifyStreaming(this); - ownerAlive = true; - - return; - } - - // NON-STREAMING. We have to load all the data and shove it into the - // buffer. - - // Does the stream support pointer operations? - if(input->hasPtr) - { - // If so, we can read the data directly from the stream - alBufferData(bufferID[0], fmt, input->getPtr(), input->size(), rate); - } - else - { - // Read the entire stream into a temporary buffer first - Mangle::Stream::BufferStream buf(input, 128*1024); - - // Then copy that into OpenAL - alBufferData(bufferID[0], fmt, buf.getPtr(), buf.size(), rate); - } - checkALError("loading sound data"); - - // We're done with the input stream, release the pointer - input.reset(); - - alSourcei(inst, AL_BUFFER, bufferID[0]); - checkALError("assigning buffer"); -} - -OpenAL_Sound::~OpenAL_Sound() -{ - // Stop - alSourceStop(inst); - - // Return sound - alDeleteSources(1, &inst); - - // Notify the factory that we quit. You will hear from our union - // rep. The bool check is to handle cases where the manager goes out - // of scope before the sounds do. In that case, don't try to contact - // the factory. - if(ownerAlive) - owner->notifyDelete(this); - - // Decrease the reference counter - if((-- (*refCnt)) == 0) - { - // We're the last owner. Delete the buffer(s) and the counter - // itself. - alDeleteBuffers(bufNum, bufferID); - checkALError("deleting buffer"); - delete refCnt; - } -} diff --git a/libs/mangle/sound/outputs/openal_out.hpp b/libs/mangle/sound/outputs/openal_out.hpp deleted file mode 100644 index 44d03ecf8..000000000 --- a/libs/mangle/sound/outputs/openal_out.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef MANGLE_SOUND_OPENAL_OUT_H -#define MANGLE_SOUND_OPENAL_OUT_H - -#include "../output.hpp" -#include - -namespace Mangle { -namespace Sound { - -class OpenAL_Sound; - -class OpenAL_Factory : public SoundFactory -{ - void *device; - void *context; - bool didSetup; - - // List of streaming sounds that need to be updated every frame. - typedef std::list StreamList; - StreamList streaming; - - friend class OpenAL_Sound; - void notifyStreaming(OpenAL_Sound*); - void notifyDelete(OpenAL_Sound*); - - public: - /// Initialize object. Pass true (default) if you want the - /// constructor to set up the current ALCdevice and ALCcontext for - /// you. - OpenAL_Factory(bool doSetup = true); - ~OpenAL_Factory(); - - SoundPtr load(const std::string &file) { assert(0); return SoundPtr(); } - SoundPtr load(Stream::StreamPtr input) { assert(0); return SoundPtr(); } - SoundPtr loadRaw(SampleSourcePtr input); - - void update(); - void setListenerPos(float x, float y, float z, - float fx, float fy, float fz, - float ux, float uy, float uz); -}; - -}} // namespaces -#endif diff --git a/libs/mangle/sound/source.hpp b/libs/mangle/sound/source.hpp deleted file mode 100644 index fbe7cf958..000000000 --- a/libs/mangle/sound/source.hpp +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef MANGLE_SOUND_SOURCE_H -#define MANGLE_SOUND_SOURCE_H - -#include -#include -#include - -#include "../stream/stream.hpp" - -namespace Mangle { -namespace Sound { - -typedef boost::int32_t int32_t; - -/// A stream containing raw sound data and information about the format -class SampleSource : public Stream::Stream -{ - protected: - bool isEof; - - public: - SampleSource() : isEof(false) {} - - /// Get the sample rate, number of channels, and bits per - /// sample. NULL parameters are ignored. - virtual void getInfo(int32_t *rate, int32_t *channels, int32_t *bits) = 0; - - bool eof() const { return isEof; } - - // Disabled functions by default. You can still override them in - // subclasses. - void seek(size_t pos) { assert(0); } - size_t tell() const { assert(0); return 0; } - size_t size() const { assert(0); return 0; } -}; - -typedef boost::shared_ptr SampleSourcePtr; - -/// A factory interface for loading SampleSources from file or stream -class SampleSourceLoader -{ - public: - /// If true, the stream version of load() works - bool canLoadStream; - - /// If true, the file version of load() works - bool canLoadFile; - - /// Load a sound input source from file (if canLoadFile is true) - virtual SampleSourcePtr load(const std::string &file) = 0; - - /// Load a sound input source from stream (if canLoadStream is true) - virtual SampleSourcePtr load(Stream::StreamPtr input) = 0; - - /// Virtual destructor - virtual ~SampleSourceLoader() {} -}; - -typedef boost::shared_ptr SampleSourceLoaderPtr; - -}} // namespaces -#endif diff --git a/libs/mangle/sound/sources/audiere_source.cpp b/libs/mangle/sound/sources/audiere_source.cpp deleted file mode 100644 index faaa3c8c5..000000000 --- a/libs/mangle/sound/sources/audiere_source.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "audiere_source.hpp" - -#include "../../stream/clients/audiere_file.hpp" - -#include - -using namespace Mangle::Stream; - -static void fail(const std::string &msg) -{ throw std::runtime_error("Audiere exception: " + msg); } - -using namespace audiere; -using namespace Mangle::Sound; - -// --- SampleSource --- - -void AudiereSource::getInfo(Mangle::Sound::int32_t *rate, - Mangle::Sound::int32_t *channels, Mangle::Sound::int32_t *bits) -{ - SampleFormat fmt; - int channels_, rate_; - sample->getFormat(channels_, rate_, fmt); - *channels = channels_; - *rate = rate_; - if(bits) - { - if(fmt == SF_U8) - *bits = 8; - else if(fmt == SF_S16) - *bits = 16; - else assert(0); - } -} - -// --- Constructors --- - -AudiereSource::AudiereSource(const std::string &file) -{ - sample = OpenSampleSource(file.c_str()); - - if(!sample) - fail("Couldn't load file " + file); - - doSetup(); -} - -AudiereSource::AudiereSource(StreamPtr input) -{ - // Use our Stream::AudiereFile implementation to convert a Mangle - // 'Stream' to an Audiere 'File' - sample = OpenSampleSource(new AudiereFile(input)); - if(!sample) - fail("Couldn't load stream"); - - doSetup(); -} - -AudiereSource::AudiereSource(audiere::SampleSourcePtr src) - : sample(src) -{ assert(sample); doSetup(); } - -// Common function called from all constructors -void AudiereSource::doSetup() -{ - assert(sample); - - SampleFormat fmt; - int channels, rate; - sample->getFormat(channels, rate, fmt); - - // Calculate the size of one frame, and pass it to SampleReader. - setup(GetSampleSize(fmt) * channels); - - isSeekable = sample->isSeekable(); - hasPosition = true; - hasSize = true; -} diff --git a/libs/mangle/sound/sources/audiere_source.hpp b/libs/mangle/sound/sources/audiere_source.hpp deleted file mode 100644 index d797c55c8..000000000 --- a/libs/mangle/sound/sources/audiere_source.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef MANGLE_SOUND_AUDIERE_SOURCE_H -#define MANGLE_SOUND_AUDIERE_SOURCE_H - -#include "sample_reader.hpp" - -// audiere.h from 1.9.4 (latest) release uses -// cstring routines like strchr() and strlen() without -// including cstring itself. -#include -#include - -namespace Mangle { -namespace Sound { - -/// A sample source that decodes files using Audiere -class AudiereSource : public SampleReader -{ - audiere::SampleSourcePtr sample; - - size_t readSamples(void *data, size_t length) - { return sample->read(length, data); } - - void doSetup(); - - public: - /// Decode the given sound file - AudiereSource(const std::string &file); - - /// Decode the given sound stream - AudiereSource(Mangle::Stream::StreamPtr src); - - /// Read directly from an existing audiere::SampleSource - AudiereSource(audiere::SampleSourcePtr src); - - void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); - - void seek(size_t pos) { sample->setPosition(pos/frameSize); } - size_t tell() const { return sample->getPosition()*frameSize; } - size_t size() const { return sample->getLength()*frameSize; } -}; - -#include "loadertemplate.hpp" - -/// A factory that loads AudiereSources from file and stream -typedef SSL_Template AudiereLoader; - -}} // Namespace -#endif diff --git a/libs/mangle/sound/sources/ffmpeg_source.cpp b/libs/mangle/sound/sources/ffmpeg_source.cpp deleted file mode 100644 index 6349be691..000000000 --- a/libs/mangle/sound/sources/ffmpeg_source.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include "ffmpeg_source.hpp" - -#include - -using namespace Mangle::Sound; - -// Static output buffer. Not thread safe, but supports multiple -// streams operated from the same thread. -static uint8_t outBuf[AVCODEC_MAX_AUDIO_FRAME_SIZE]; - -static void fail(const std::string &msg) -{ throw std::runtime_error("FFMpeg exception: " + msg); } - -// --- Loader --- - -static bool init = false; - -FFMpegLoader::FFMpegLoader(bool setup) -{ - if(setup && !init) - { - av_register_all(); - av_log_set_level(AV_LOG_ERROR); - init = true; - } -} - -// --- Source --- - -FFMpegSource::FFMpegSource(const std::string &file) -{ - std::string msg; - AVCodec *codec; - - if(av_open_input_file(&FmtCtx, file.c_str(), NULL, 0, NULL) != 0) - fail("Error loading audio file " + file); - - if(av_find_stream_info(FmtCtx) < 0) - { - msg = "Error in file stream " + file; - goto err; - } - - // Pick the first audio stream, if any - for(StreamNum = 0; StreamNum < FmtCtx->nb_streams; StreamNum++) - { - // Pick the first audio stream - if(FmtCtx->streams[StreamNum]->codec->codec_type == CODEC_TYPE_AUDIO) - break; - } - - if(StreamNum == FmtCtx->nb_streams) - fail("File '" + file + "' didn't contain any audio streams"); - - // Open the decoder - CodecCtx = FmtCtx->streams[StreamNum]->codec; - codec = avcodec_find_decoder(CodecCtx->codec_id); - - if(!codec || avcodec_open(CodecCtx, codec) < 0) - { - msg = "Error loading '" + file + "': "; - if(codec) - msg += "coded error"; - else - msg += "no codec found"; - goto err; - } - - // No errors, we're done - return; - - // Handle errors - err: - av_close_input_file(FmtCtx); - fail(msg); -} - -FFMpegSource::~FFMpegSource() -{ - avcodec_close(CodecCtx); - av_close_input_file(FmtCtx); -} - -void FFMpegSource::getInfo(int32_t *rate, int32_t *channels, int32_t *bits) -{ - if(rate) *rate = CodecCtx->sample_rate; - if(channels) *channels = CodecCtx->channels; - if(bits) *bits = 16; -} - -size_t FFMpegSource::read(void *data, size_t length) -{ - if(isEof) return 0; - - size_t left = length; - uint8_t *outPtr = (uint8_t*)data; - - // First, copy over any stored data we might be sitting on - { - size_t s = storage.size(); - size_t copy = s; - if(s) - { - // Make sure there's room - if(copy > left) - copy = left; - - // Copy - memcpy(outPtr, &storage[0], copy); - outPtr += copy; - left -= copy; - - // Is there anything left in the storage? - assert(s>= copy); - s -= copy; - if(s) - { - assert(left == 0); - - // Move it to the start and resize - memmove(&storage[0], &storage[copy], s); - storage.resize(s); - } - } - } - - // Next, get more input data from stream, and decode it - while(left) - { - AVPacket packet; - - // Get the next packet, if any - if(av_read_frame(FmtCtx, &packet) < 0) - break; - - // We only allow one stream per file at the moment - assert((int)StreamNum == packet.stream_index); - - // Decode the packet - int len = AVCODEC_MAX_AUDIO_FRAME_SIZE; - int tmp = avcodec_decode_audio2(CodecCtx, (int16_t*)outBuf, - &len, packet.data, packet.size); - assert(tmp < 0 || tmp == packet.size); - - // We don't need the input packet any longer - av_free_packet(&packet); - - if(tmp < 0) - fail("Error decoding audio stream"); - - // Copy whatever data we got, and advance the pointer - if(len > 0) - { - // copy = how many bytes do we copy now - size_t copy = len; - if(copy > left) - copy = left; - - // len = how many bytes are left uncopied - len -= copy; - - // copy data - memcpy(outPtr, outBuf, copy); - - // left = how much space is left in the caller output - // buffer. This loop repeats as long left is > 0 - left -= copy; - outPtr += copy; - assert(left >= 0); - - if(len > 0) - { - // There were uncopied bytes. Store them for later. - assert(left == 0); - storage.resize(len); - memcpy(&storage[0], outBuf, len); - } - } - } - - // End of loop. Return the number of bytes copied. - assert(left <= length); - - // If we're returning less than asked for, then we're done - if(left > 0) - isEof = true; - - return length - left; -} diff --git a/libs/mangle/sound/sources/ffmpeg_source.hpp b/libs/mangle/sound/sources/ffmpeg_source.hpp deleted file mode 100644 index d422b9809..000000000 --- a/libs/mangle/sound/sources/ffmpeg_source.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef MANGLE_SOUND_FFMPEG_H -#define MANGLE_SOUND_FFMPEG_H - -#include "../source.hpp" -#include -#include - -extern "C" -{ -#include -#include -} - -namespace Mangle { -namespace Sound { - -class FFMpegSource : public SampleSource -{ - AVFormatContext *FmtCtx; - AVCodecContext *CodecCtx; - unsigned int StreamNum; - - std::vector storage; - - public: - /// Decode the given sound file - FFMpegSource(const std::string &file); - - /// Decode the given sound stream (not supported by FFmpeg) - FFMpegSource(Mangle::Stream::StreamPtr src) { assert(0); } - - ~FFMpegSource(); - - // Overrides - void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); - size_t read(void *data, size_t length); -}; - -#include "loadertemplate.hpp" - -/// A factory that loads FFMpegSources from file -class FFMpegLoader : public SSL_Template -{ - public: - - /// Sets up the libavcodec library. If you want to do your own - /// setup, send a setup=false parameter. - FFMpegLoader(bool setup=true); -}; - -}} // namespaces -#endif diff --git a/libs/mangle/sound/sources/libsndfile.cpp b/libs/mangle/sound/sources/libsndfile.cpp deleted file mode 100644 index b69a2d436..000000000 --- a/libs/mangle/sound/sources/libsndfile.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "libsndfile.hpp" - -#include -#include - -using namespace Mangle::Stream; - -static void fail(const std::string &msg) -{ throw std::runtime_error("Mangle::libsndfile: " + msg); } - -using namespace Mangle::Sound; - -void SndFileSource::getInfo(int32_t *_rate, int32_t *_channels, int32_t *_bits) -{ - *_rate = rate; - *_channels = channels; - *_bits = bits; -} - -size_t SndFileSource::readSamples(void *data, size_t length) -{ - // readf_* reads entire frames, including channels - return sf_readf_short((SNDFILE*)handle, (short*)data, length); -} - -SndFileSource::SndFileSource(const std::string &file) -{ - SF_INFO info; - info.format = 0; - handle = sf_open(file.c_str(), SFM_READ, &info); - if(handle == NULL) - fail("Failed to open " + file); - - // I THINK that using sf_read_short forces the library to convert to - // 16 bits no matter what, but the libsndfile docs aren't exactly - // very clear on this point. - channels = info.channels; - rate = info.samplerate; - bits = 16; - - // 16 bits per sample times number of channels - setup(2*channels); -} - -SndFileSource::~SndFileSource() -{ - sf_close((SNDFILE*)handle); -} diff --git a/libs/mangle/sound/sources/libsndfile.hpp b/libs/mangle/sound/sources/libsndfile.hpp deleted file mode 100644 index 7286cf0fe..000000000 --- a/libs/mangle/sound/sources/libsndfile.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef MANGLE_SOUND_SNDFILE_SOURCE_H -#define MANGLE_SOUND_SNDFILE_SOURCE_H - -#include "sample_reader.hpp" - -namespace Mangle { -namespace Sound { - -/// A sample source that decodes files using libsndfile. Supports most -/// formats except mp3. -class SndFileSource : public SampleReader -{ - void *handle; - int channels, rate, bits; - - size_t readSamples(void *data, size_t length); - - public: - /// Decode the given sound file - SndFileSource(const std::string &file); - - /// Decode the given sound stream (not supported) - SndFileSource(Mangle::Stream::StreamPtr src) { assert(0); } - - ~SndFileSource(); - - void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); -}; - -#include "loadertemplate.hpp" - -/// A factory that loads SndFileSources from file and stream -typedef SSL_Template SndFileLoader; - -}} // Namespace -#endif diff --git a/libs/mangle/sound/sources/loadertemplate.hpp b/libs/mangle/sound/sources/loadertemplate.hpp deleted file mode 100644 index a27a77d10..000000000 --- a/libs/mangle/sound/sources/loadertemplate.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef SSL_TEMPL_H -#define SSL_TEMPL_H - -template -class SSL_Template : public SampleSourceLoader -{ - public: - - SSL_Template() - { - canLoadStream = stream; - canLoadFile = file; - } - - SampleSourcePtr load(const std::string &filename) - { - assert(canLoadFile); - return SampleSourcePtr(new SourceT(filename)); - } - - SampleSourcePtr load(Stream::StreamPtr input) - { - assert(canLoadStream); - return SampleSourcePtr(new SourceT(input)); - } -}; - -#endif diff --git a/libs/mangle/sound/sources/mpg123_source.cpp b/libs/mangle/sound/sources/mpg123_source.cpp deleted file mode 100644 index 24d6ecce1..000000000 --- a/libs/mangle/sound/sources/mpg123_source.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "mpg123_source.hpp" - -#include - -#include - -using namespace Mangle::Stream; - -/* - TODOs: - - - mpg123 impressively enough supports custom stream reading. Which - means we could (and SHOULD!) support reading from Mangle::Streams - as well. But I'll save it til I need it. - - An alternative way to do this is through feeding (which they also - support), but that's more messy. - - - the library also supports output, via various other sources, - including ALSA, OSS, PortAudio, PulseAudio and SDL. Using this - library as a pure output library (if that is possible) would be a - nice shortcut over using those libraries - OTOH it's another - dependency. - - - we could implement seek(), tell() and size(), but they aren't - really necessary. Furthermore, since the returned size is only a - guess, it is not safe to rely on it. - */ - -static void fail(const std::string &msg) -{ throw std::runtime_error("Mangle::Mpg123 exception: " + msg); } - -static void checkError(int err, void *mh = NULL) -{ - if(err != MPG123_OK) - { - std::string msg; - if(mh) msg = mpg123_strerror((mpg123_handle*)mh); - else msg = mpg123_plain_strerror(err); - fail(msg); - } -} - -using namespace Mangle::Sound; - -void Mpg123Source::getInfo(int32_t *pRate, int32_t *pChannels, int32_t *pBits) -{ - // Use the values we found in the constructor - *pRate = rate; - *pChannels = channels; - *pBits = bits; -} - -size_t Mpg123Source::read(void *data, size_t length) -{ - size_t done; - // This is extraordinarily nice. I like this library. - int err = mpg123_read((mpg123_handle*)mh, (unsigned char*)data, length, &done); - assert(done <= length); - if(err == MPG123_DONE) - isEof = true; - else - checkError(err, mh); - return done; -} - -Mpg123Loader::Mpg123Loader(bool setup) -{ - // Do as we're told - if(setup) - { - int err = mpg123_init(); - checkError(err); - } - didSetup = setup; -} - -Mpg123Loader::~Mpg123Loader() -{ - // Deinitialize the library on exit - if(didSetup) - mpg123_exit(); -} - -Mpg123Source::Mpg123Source(const std::string &file) -{ - int err; - - // Create a new handle - mh = mpg123_new(NULL, &err); - if(mh == NULL) - checkError(err, mh); - - mpg123_handle *mhh = (mpg123_handle*)mh; - - // Open the file (hack around constness) - err = mpg123_open(mhh, (char*)file.c_str()); - checkError(err, mh); - - // Get the format - int encoding; - err = mpg123_getformat(mhh, &rate, &channels, &encoding); - checkError(err, mh); - if(encoding != MPG123_ENC_SIGNED_16) - fail("Unsupported encoding in " + file); - - // This is the only bit size we support. - bits = 16; -} - -Mpg123Source::~Mpg123Source() -{ - mpg123_close((mpg123_handle*)mh); - mpg123_delete((mpg123_handle*)mh); -} diff --git a/libs/mangle/sound/sources/mpg123_source.hpp b/libs/mangle/sound/sources/mpg123_source.hpp deleted file mode 100644 index 1ac16b530..000000000 --- a/libs/mangle/sound/sources/mpg123_source.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef MANGLE_SOUND_MPG123_SOURCE_H -#define MANGLE_SOUND_MPG123_SOURCE_H - -#include "../source.hpp" -#include - -namespace Mangle { -namespace Sound { - -/// A sample source that decodes files using libmpg123. Only supports -/// MP3 files. -class Mpg123Source : public SampleSource -{ - void *mh; - long int rate; - int channels, bits; - - public: - /// Decode the given sound file - Mpg123Source(const std::string &file); - - /// Needed by SSL_Template but not yet supported - Mpg123Source(Mangle::Stream::StreamPtr data) - { assert(0); } - - ~Mpg123Source(); - - void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); - size_t read(void *data, size_t length); -}; - -#include "loadertemplate.hpp" - -/// A factory that loads Mpg123Sources from file and stream -struct Mpg123Loader : SSL_Template -{ - /** Sets up libmpg123 for you, and closes it on destruction. If you - want to do this yourself, send setup=false. - */ - Mpg123Loader(bool setup=true); - ~Mpg123Loader(); -private: - bool didSetup; -}; - -}} // Namespace -#endif diff --git a/libs/mangle/sound/sources/sample_reader.cpp b/libs/mangle/sound/sources/sample_reader.cpp deleted file mode 100644 index c30de654a..000000000 --- a/libs/mangle/sound/sources/sample_reader.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "sample_reader.hpp" - -#include - -using namespace Mangle::Sound; - -void SampleReader::setup(int size) -{ - pullSize = 0; - frameSize = size; - pullOver = new char[size]; -} - -SampleReader::~SampleReader() -{ - if(pullOver) - delete[] pullOver; -} - -size_t SampleReader::read(void *_data, size_t length) -{ - if(isEof) return 0; - char *data = (char*)_data; - - // Pullsize holds the number of bytes that were copied "extra" at - // the end of LAST round. If non-zero, it also means there is data - // left in the pullOver buffer. - if(pullSize) - { - // Amount of data left - size_t doRead = frameSize - pullSize; - assert(doRead > 0); - - // Make sure we don't read more than we're supposed to - if(doRead > length) doRead = length; - - memcpy(data, pullOver+pullSize, doRead); - - // Update the number of bytes now copied - pullSize += doRead; - assert(pullSize <= frameSize); - - if(pullSize < frameSize) - { - // There is STILL data left in the pull buffer, and we've - // done everything we were supposed to. Leave it and return. - assert(doRead == length); - return doRead; - } - - // Set up variables for further reading below. No need to update - // pullSize, it is overwritten anyway. - length -= doRead; - data += doRead; - } - - // Number of whole frames - size_t frames = length / frameSize; - - // Read the data - size_t res = readSamples(data, frames); - assert(res <= frames); - - // Total bytes read - size_t num = res*frameSize; - data += num; - - if(res < frames) - { - // End of stream. - isEof = true; - // Determine how much we read - return data-(char*)_data; - } - - // Determine the overshoot - pullSize = length - num; - assert(pullSize < frameSize && pullSize >= 0); - - // Are we missing data? - if(pullSize) - { - // Fill in one sample - res = readSamples(pullOver,1); - assert(res == 1 || res == 0); - if(res) - { - // Move as much as we can into the output buffer - memcpy(data, pullOver, pullSize); - data += pullSize; - } - else - // Failed reading, we're out of data - isEof = true; - } - - // Return the total number of bytes stored - return data-(char*)_data; -} diff --git a/libs/mangle/sound/sources/sample_reader.hpp b/libs/mangle/sound/sources/sample_reader.hpp deleted file mode 100644 index 89ddf1f65..000000000 --- a/libs/mangle/sound/sources/sample_reader.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef MANGLE_SOUND_SAMPLE_READER_H -#define MANGLE_SOUND_SAMPLE_READER_H - -#include "../source.hpp" - -namespace Mangle { -namespace Sound { - - /* This is a helper base class for other SampleSource - implementations. Certain sources (like Audiere and libsndfile) - insist on reading whole samples rather than bytes. This class - compensates for that, and allows you to read bytes rather than - samples. - - There are two ways for subclasses to use this class. EITHER call - setup() with the size of frameSize. This will allocate a buffer, - which the destructor frees. OR set frameSize manually and - manipulate the pullOver pointer yourself. In that case you MUST - reset it to NULL if you don't want the destructor to call - delete[] on it. - */ -class SampleReader : public SampleSource -{ - // How much of the above buffer is in use. - int pullSize; - -protected: - // Pullover buffer - char* pullOver; - - // Size of one frame, in bytes. This is also the size of the - // pullOver buffer. - int frameSize; - - // The parameter gives the size of one sample/frame, in bytes. - void setup(int); - - // Read the given number of samples, in multiples of frameSize. Does - // not have to set or respect isEof. - virtual size_t readSamples(void *data, size_t num) = 0; - - public: - SampleReader() : pullSize(0), pullOver(NULL) {} - ~SampleReader(); - size_t read(void *data, size_t length); -}; -}} // Namespace -#endif diff --git a/libs/mangle/sound/sources/stream_source.hpp b/libs/mangle/sound/sources/stream_source.hpp deleted file mode 100644 index 43c605a00..000000000 --- a/libs/mangle/sound/sources/stream_source.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef MANGLE_SOUND_STREAMSOURCE_H -#define MANGLE_SOUND_STREAMSOURCE_H - -#include "../source.hpp" - -namespace Mangle { -namespace Sound { - -/// A class for reading raw samples directly from a stream. -class Stream2Samples : public SampleSource -{ - Mangle::Stream::StreamPtr inp; - int32_t rate, channels, bits; - - public: - Stream2Samples(Mangle::Stream::StreamPtr _inp, int32_t _rate, int32_t _channels, int32_t _bits) - : inp(_inp), rate(_rate), channels(_channels), bits(_bits) - { - isSeekable = inp->isSeekable; - hasPosition = inp->hasPosition; - hasSize = inp->hasSize; - hasPtr = inp->hasPtr; - } - - /// Get the sample rate, number of channels, and bits per - /// sample. NULL parameters are ignored. - void getInfo(int32_t *_rate, int32_t *_channels, int32_t *_bits) - { - if(_rate) *_rate = rate; - if(_channels) *_channels = channels; - if(_bits) *_bits = bits; - } - - size_t read(void *out, size_t count) - { return inp->read(out, count); } - - void seek(size_t pos) { inp->seek(pos); } - size_t tell() const { return inp->tell(); } - size_t size() const { return inp->size(); } - bool eof() const { return inp->eof(); } - const void *getPtr() { return inp->getPtr(); } - const void *getPtr(size_t size) { return inp->getPtr(size); } - const void *getPtr(size_t pos, size_t size) { return inp->getPtr(pos, size); } -}; - -}} // namespaces -#endif diff --git a/libs/mangle/sound/sources/wav_source.cpp b/libs/mangle/sound/sources/wav_source.cpp deleted file mode 100644 index a46b3d27e..000000000 --- a/libs/mangle/sound/sources/wav_source.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "wav_source.hpp" - -#include "../../stream/servers/file_stream.hpp" - -#include - -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -static void fail(const std::string &msg) -{ throw std::runtime_error("Mangle::Wav exception: " + msg); } - -void WavSource::getInfo(int32_t *pRate, int32_t *pChannels, int32_t *pBits) -{ - // Use the values we found in the constructor - *pRate = rate; - *pChannels = channels; - *pBits = bits; -} - -void WavSource::seek(size_t pos) -{ - // Seek the stream and set 'left' - assert(isSeekable); - if(pos > total) pos = total; - input->seek(dataOffset + pos); - left = total-pos; -} - -size_t WavSource::read(void *data, size_t length) -{ - if(length > left) - length = left; - size_t read = input->read(data, length); - if(read < length) - // Something went wrong - fail("WAV read error"); - return length; -} - -void WavSource::open(Mangle::Stream::StreamPtr data) -{ - input = data; - - hasPosition = true; - hasSize = true; - // If we can check position and seek in the input stream, then we - // can seek the wav data too. - isSeekable = input->isSeekable && input->hasPosition; - - // Read header - unsigned int val; - - input->read(&val,4); // header - if(val != 0x46464952) // "RIFF" - fail("Not a WAV file"); - - input->read(&val,4); // size (ignored) - input->read(&val,4); // file format - if(val != 0x45564157) // "WAVE" - fail("Not a valid WAV file"); - - input->read(&val,4); // "fmt " - input->read(&val,4); // chunk size (must be 16) - if(val != 16) - fail("Unsupported WAV format"); - - input->read(&val,2); - if(val != 1) - fail("Non-PCM (compressed) WAV files not supported"); - - // Sound data specification - channels = 0; - input->read(&channels,2); - input->read(&rate, 4); - - // Skip next 6 bytes - input->read(&val, 4); - input->read(&val, 2); - - // Bits per sample - bits = 0; - input->read(&bits,2); - - input->read(&val,4); // Data header - if(val != 0x61746164) // "data" - fail("Expected data block"); - - // Finally, read the data size - input->read(&total,4); - left = total; - - // Store the beginning of the data block for later - if(input->hasPosition) - dataOffset = input->tell(); -} - -WavSource::WavSource(const std::string &file) -{ open(StreamPtr(new FileStream(file))); } diff --git a/libs/mangle/sound/sources/wav_source.hpp b/libs/mangle/sound/sources/wav_source.hpp deleted file mode 100644 index 227f4da73..000000000 --- a/libs/mangle/sound/sources/wav_source.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef MANGLE_SOUND_WAV_SOURCE_H -#define MANGLE_SOUND_WAV_SOURCE_H - -#include "../source.hpp" -#include - -namespace Mangle { -namespace Sound { - -/// WAV file decoder. Has no external library dependencies. -class WavSource : public SampleSource -{ - // Sound info - uint32_t rate, channels, bits; - - // Total size (of output) and bytes left - uint32_t total, left; - - // Offset in input of the beginning of the data block - size_t dataOffset; - - Mangle::Stream::StreamPtr input; - - void open(Mangle::Stream::StreamPtr); - - public: - /// Decode the given sound file - WavSource(const std::string&); - - /// Decode from stream - WavSource(Mangle::Stream::StreamPtr s) - { open(s); } - - void getInfo(int32_t *rate, int32_t *channels, int32_t *bits); - size_t read(void *data, size_t length); - - void seek(size_t); - size_t tell() const { return total-left; } - size_t size() const { return total; } - bool eof() const { return left > 0; } -}; - -#include "loadertemplate.hpp" - -/// A factory that loads WavSources from file and stream -typedef SSL_Template WavLoader; - -}} // Namespace -#endif diff --git a/libs/mangle/sound/tests/.gitignore b/libs/mangle/sound/tests/.gitignore deleted file mode 100644 index 814490404..000000000 --- a/libs/mangle/sound/tests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*_test diff --git a/libs/mangle/sound/tests/Makefile b/libs/mangle/sound/tests/Makefile deleted file mode 100644 index 6fcac72da..000000000 --- a/libs/mangle/sound/tests/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -GCC=g++ -I../ -Wall - -all: audiere_source_test ffmpeg_source_test openal_output_test openal_audiere_test openal_ffmpeg_test openal_mpg123_test openal_sndfile_test wav_source_test openal_various_test - -L_FFMPEG=$(shell pkg-config --libs libavcodec libavformat) -I_FFMPEG=-I/usr/include/libavcodec -I/usr/include/libavformat -L_OPENAL=$(shell pkg-config --libs openal) -L_AUDIERE=-laudiere - -wav_source_test: wav_source_test.cpp ../sources/wav_source.cpp - $(GCC) $^ -o $@ - -openal_various_test: openal_various_test.cpp ../sources/mpg123_source.cpp ../sources/wav_source.cpp ../outputs/openal_out.cpp - $(GCC) $^ -o $@ -lmpg123 ${L_OPENAL} - -openal_audiere_test: openal_audiere_test.cpp ../sources/audiere_source.cpp ../sources/sample_reader.cpp ../outputs/openal_out.cpp ../../stream/clients/audiere_file.cpp - $(GCC) $^ -o $@ $(L_AUDIERE) $(L_OPENAL) - -openal_ffmpeg_test: openal_ffmpeg_test.cpp ../sources/ffmpeg_source.cpp ../outputs/openal_out.cpp - $(GCC) $^ -o $@ $(L_FFMPEG) $(L_OPENAL) $(I_FFMPEG) - -openal_mpg123_test: openal_mpg123_test.cpp ../sources/mpg123_source.cpp ../outputs/openal_out.cpp - $(GCC) $^ -o $@ -lmpg123 ${L_OPENAL} - -openal_sndfile_test: openal_sndfile_test.cpp ../sources/libsndfile.cpp ../sources/sample_reader.cpp ../outputs/openal_out.cpp - $(GCC) $^ -o $@ -lsndfile ${L_OPENAL} - -openal_output_test: openal_output_test.cpp ../outputs/openal_out.cpp - $(GCC) $^ -o $@ $(L_OPENAL) - -audiere_source_test: audiere_source_test.cpp ../sources/audiere_source.cpp ../../stream/clients/audiere_file.cpp ../sources/sample_reader.cpp - $(GCC) $^ -o $@ $(L_AUDIERE) - -ffmpeg_source_test: ffmpeg_source_test.cpp ../sources/ffmpeg_source.cpp - $(GCC) $^ -o $@ $(L_FFMPEG) $(I_FFMPEG) - -clean: - rm *_test diff --git a/libs/mangle/sound/tests/audiere_source_test.cpp b/libs/mangle/sound/tests/audiere_source_test.cpp deleted file mode 100644 index 637d743b2..000000000 --- a/libs/mangle/sound/tests/audiere_source_test.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../sources/audiere_source.hpp" - -#include -#include - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -// Contents and size of cow.raw -void *orig; -size_t orig_size; - -void run(SampleSourcePtr &src) -{ - size_t ss = src->size(); - assert(ss == orig_size); - - cout << "Source size: " << ss << endl; - int rate, channels, bits; - src->getInfo(&rate, &channels, &bits); - cout << "rate=" << rate << "\nchannels=" << channels - << "\nbits=" << bits << endl; - - cout << "Reading entire buffer into memory\n"; - void *buf = malloc(ss); - src->read(buf, ss); - - cout << "Comparing...\n"; - if(memcmp(buf, orig, ss) != 0) - { - cout << "Oops!\n"; - assert(0); - } - - cout << "Done\n"; -} - -int main() -{ - { - cout << "Reading cow.raw first\n"; - FileStream tmp("cow.raw"); - orig_size = tmp.size(); - cout << "Size: " << orig_size << endl; - orig = malloc(orig_size); - tmp.read(orig, orig_size); - cout << "Done\n"; - } - - { - cout << "\nLoading cow.wav by filename:\n"; - SampleSourcePtr cow_file( new AudiereSource("cow.wav") ); - run(cow_file); - } - - { - cout << "\nLoading cow.wav by stream:\n"; - StreamPtr inp( new FileStream("cow.wav") ); - SampleSourcePtr cow_stream( new AudiereSource(inp) ); - run(cow_stream); - } - - return 0; -} diff --git a/libs/mangle/sound/tests/cow.raw b/libs/mangle/sound/tests/cow.raw deleted file mode 100644 index c4d155bbfb1caba2e41b1a97e01f29276c945c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37502 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 F{|CY68e9MX diff --git a/libs/mangle/sound/tests/cow.wav b/libs/mangle/sound/tests/cow.wav deleted file mode 100644 index 494e6c4ac12a3d318532fdf8178d72f775bc40af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37546 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�b}Ou2(@Nod9rZet}z#nWoL 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 - -#include "../../stream/servers/file_stream.hpp" -#include "../sources/ffmpeg_source.hpp" - -#include -#include - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -// Contents and size of cow.raw -void *orig; -size_t orig_size; - -void run(SampleSourcePtr &src) -{ - int rate, channels, bits; - src->getInfo(&rate, &channels, &bits); - cout << "rate=" << rate << "\nchannels=" << channels - << "\nbits=" << bits << endl; - - cout << "Reading entire buffer into memory\n"; - void *buf = malloc(orig_size); - size_t ss = src->read(buf, orig_size); - cout << "Actually read: " << ss << endl; - assert(ss == orig_size); - - cout << "Comparing...\n"; - if(memcmp(buf, orig, ss) != 0) - { - cout << "Oops!\n"; - assert(0); - } - - cout << "Done\n"; -} - -int main() -{ - { - cout << "Reading cow.raw first\n"; - FileStream tmp("cow.raw"); - orig_size = tmp.size(); - cout << "Size: " << orig_size << endl; - orig = malloc(orig_size); - tmp.read(orig, orig_size); - cout << "Done\n"; - } - - // Initializes the library, not used for anything else. - FFMpegLoader fm; - - { - cout << "\nLoading cow.wav by filename:\n"; - SampleSourcePtr cow_file( new FFMpegSource("cow.wav") ); - run(cow_file); - } - - return 0; -} diff --git a/libs/mangle/sound/tests/openal_audiere_test.cpp b/libs/mangle/sound/tests/openal_audiere_test.cpp deleted file mode 100644 index ced7fe5d2..000000000 --- a/libs/mangle/sound/tests/openal_audiere_test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../filters/openal_audiere.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -OpenAL_Audiere_Factory mg; - -void play(const char* name, bool stream=false) -{ - // Only load streams if the backend supports it - if(stream && !mg.canLoadStream) - return; - - cout << "Playing " << name; - if(stream) cout << " (from stream)"; - cout << "\n"; - - SoundPtr snd; - - try - { - if(stream) - snd = mg.load(StreamPtr(new FileStream(name))); - else - snd = mg.load(name); - - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - if(mg.needsUpdate) mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } -} - -int main() -{ - play("cow.wav"); - play("owl.ogg"); - play("cow.wav", true); - return 0; -} diff --git a/libs/mangle/sound/tests/openal_ffmpeg_test.cpp b/libs/mangle/sound/tests/openal_ffmpeg_test.cpp deleted file mode 100644 index d4b8e9300..000000000 --- a/libs/mangle/sound/tests/openal_ffmpeg_test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../filters/openal_ffmpeg.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -OpenAL_FFMpeg_Factory mg; - -void play(const char* name, bool stream=false) -{ - // Only load streams if the backend supports it - if(stream && !mg.canLoadStream) - return; - - cout << "Playing " << name; - if(stream) cout << " (from stream)"; - cout << "\n"; - - SoundPtr snd; - - try - { - if(stream) - snd = mg.load(StreamPtr(new FileStream(name))); - else - snd = mg.load(name); - - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - if(mg.needsUpdate) mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } -} - -int main() -{ - play("cow.wav"); - play("owl.ogg"); - play("cow.wav", true); - return 0; -} diff --git a/libs/mangle/sound/tests/openal_mpg123_test.cpp b/libs/mangle/sound/tests/openal_mpg123_test.cpp deleted file mode 100644 index fef1a5605..000000000 --- a/libs/mangle/sound/tests/openal_mpg123_test.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../filters/openal_mpg123.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -OpenAL_Mpg123_Factory mg; - -void play(const char* name, bool stream=false) -{ - // Only load streams if the backend supports it - if(stream && !mg.canLoadStream) - return; - - cout << "Playing " << name; - if(stream) cout << " (from stream)"; - cout << "\n"; - - SoundPtr snd; - - try - { - if(stream) - snd = mg.load(StreamPtr(new FileStream(name))); - else - snd = mg.load(name); - - snd->setStreaming(true); - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - if(mg.needsUpdate) mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } -} - -int main(int argc, char**argv) -{ - if(argc != 2) - cout << "Please specify an MP3 file\n"; - else - play(argv[1]); - return 0; -} diff --git a/libs/mangle/sound/tests/openal_output_test.cpp b/libs/mangle/sound/tests/openal_output_test.cpp deleted file mode 100644 index a8059ec65..000000000 --- a/libs/mangle/sound/tests/openal_output_test.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../sources/stream_source.hpp" -#include "../outputs/openal_out.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -int main() -{ - cout << "Loading cow.raw\n"; - - int rate = 11025; - int chan = 1; - int bits = 16; - - cout << " rate=" << rate << "\n channels=" << chan - << "\n bits=" << bits << endl; - - StreamPtr file( new FileStream("cow.raw") ); - SampleSourcePtr source( new Stream2Samples( file, rate, chan, bits)); - - cout << "Playing\n"; - - OpenAL_Factory mg; - - SoundPtr snd = mg.loadRaw(source); - - try - { - // Try setting all kinds of stuff before playing. OpenAL_Sound - // uses delayed buffer loading, but these should still work - // without a buffer. - snd->stop(); - snd->pause(); - snd->setVolume(0.8); - snd->setPitch(0.9); - - // Also test streaming, since all the other examples test - // non-streaming sounds. - snd->setStreaming(true); - - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } - return 0; -} diff --git a/libs/mangle/sound/tests/openal_sndfile_test.cpp b/libs/mangle/sound/tests/openal_sndfile_test.cpp deleted file mode 100644 index bd5f117a5..000000000 --- a/libs/mangle/sound/tests/openal_sndfile_test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../filters/openal_sndfile.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -OpenAL_SndFile_Factory mg; - -void play(const char* name, bool stream=false) -{ - // Only load streams if the backend supports it - if(stream && !mg.canLoadStream) - return; - - cout << "Playing " << name; - if(stream) cout << " (from stream)"; - cout << "\n"; - - SoundPtr snd; - - try - { - if(stream) - snd = mg.load(StreamPtr(new FileStream(name))); - else - snd = mg.load(name); - - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - if(mg.needsUpdate) mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } -} - -int main() -{ - play("cow.wav"); - play("owl.ogg"); - play("cow.wav", true); - return 0; -} diff --git a/libs/mangle/sound/tests/openal_various_test.cpp b/libs/mangle/sound/tests/openal_various_test.cpp deleted file mode 100644 index 9426a672e..000000000 --- a/libs/mangle/sound/tests/openal_various_test.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include - -#include "../../stream/servers/file_stream.hpp" -#include "../filters/openal_various.hpp" - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; - -OpenAL_Various_Factory mg; - -void play(const char* name, bool stream=false) -{ - // Only load streams if the backend supports it - if(stream && !mg.canLoadStream) - return; - - cout << "Playing " << name; - if(stream) cout << " (from stream)"; - cout << "\n"; - - SoundPtr snd; - - try - { - if(stream) - snd = mg.load(StreamPtr(new FileStream(name))); - else - snd = mg.load(name); - - snd->play(); - - while(snd->isPlaying()) - { - usleep(10000); - if(mg.needsUpdate) mg.update(); - } - } - catch(exception &e) - { - cout << " ERROR: " << e.what() << "\n"; - } -} - -int main() -{ - play("cow.wav"); - play("cow.wav", true); - return 0; -} diff --git a/libs/mangle/sound/tests/output/audiere_source_test.out b/libs/mangle/sound/tests/output/audiere_source_test.out deleted file mode 100644 index 47a5a9e41..000000000 --- a/libs/mangle/sound/tests/output/audiere_source_test.out +++ /dev/null @@ -1,21 +0,0 @@ -Reading cow.raw first -Size: 37502 -Done - -Loading cow.wav by filename: -Source size: 37502 -rate=11025 -channels=1 -bits=16 -Reading entire buffer into memory -Comparing... -Done - -Loading cow.wav by stream: -Source size: 37502 -rate=11025 -channels=1 -bits=16 -Reading entire buffer into memory -Comparing... -Done diff --git a/libs/mangle/sound/tests/output/ffmpeg_source_test.out b/libs/mangle/sound/tests/output/ffmpeg_source_test.out deleted file mode 100644 index 1c7d49113..000000000 --- a/libs/mangle/sound/tests/output/ffmpeg_source_test.out +++ /dev/null @@ -1,12 +0,0 @@ -Reading cow.raw first -Size: 37502 -Done - -Loading cow.wav by filename: -rate=11025 -channels=1 -bits=16 -Reading entire buffer into memory -Actually read: 37502 -Comparing... -Done diff --git a/libs/mangle/sound/tests/output/openal_audiere_test.out b/libs/mangle/sound/tests/output/openal_audiere_test.out deleted file mode 100644 index 4fe01eac2..000000000 --- a/libs/mangle/sound/tests/output/openal_audiere_test.out +++ /dev/null @@ -1,3 +0,0 @@ -Playing cow.wav -Playing owl.ogg -Playing cow.wav (from stream) diff --git a/libs/mangle/sound/tests/output/openal_ffmpeg_test.out b/libs/mangle/sound/tests/output/openal_ffmpeg_test.out deleted file mode 100644 index 96e1db0f9..000000000 --- a/libs/mangle/sound/tests/output/openal_ffmpeg_test.out +++ /dev/null @@ -1,2 +0,0 @@ -Playing cow.wav -Playing owl.ogg diff --git a/libs/mangle/sound/tests/output/openal_mpg123_test.out b/libs/mangle/sound/tests/output/openal_mpg123_test.out deleted file mode 100644 index e55dabbb1..000000000 --- a/libs/mangle/sound/tests/output/openal_mpg123_test.out +++ /dev/null @@ -1 +0,0 @@ -Please specify an MP3 file diff --git a/libs/mangle/sound/tests/output/openal_output_test.out b/libs/mangle/sound/tests/output/openal_output_test.out deleted file mode 100644 index 04392a72e..000000000 --- a/libs/mangle/sound/tests/output/openal_output_test.out +++ /dev/null @@ -1,5 +0,0 @@ -Loading cow.raw - rate=11025 - channels=1 - bits=16 -Playing diff --git a/libs/mangle/sound/tests/output/openal_sndfile_test.out b/libs/mangle/sound/tests/output/openal_sndfile_test.out deleted file mode 100644 index 96e1db0f9..000000000 --- a/libs/mangle/sound/tests/output/openal_sndfile_test.out +++ /dev/null @@ -1,2 +0,0 @@ -Playing cow.wav -Playing owl.ogg diff --git a/libs/mangle/sound/tests/output/openal_various_test.out b/libs/mangle/sound/tests/output/openal_various_test.out deleted file mode 100644 index f25a55513..000000000 --- a/libs/mangle/sound/tests/output/openal_various_test.out +++ /dev/null @@ -1 +0,0 @@ -Playing cow.wav diff --git a/libs/mangle/sound/tests/output/wav_source_test.out b/libs/mangle/sound/tests/output/wav_source_test.out deleted file mode 100644 index b6fc8e6fc..000000000 --- a/libs/mangle/sound/tests/output/wav_source_test.out +++ /dev/null @@ -1,12 +0,0 @@ -Source size: 37502 -rate=11025 -channels=1 -bits=16 -Reading entire buffer into memory - -Reading cow.raw -Size: 37502 - -Comparing... - -Done diff --git a/libs/mangle/sound/tests/owl.ogg b/libs/mangle/sound/tests/owl.ogg deleted file mode 100644 index e992f24d48206663c794ce1f835b483aed730319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18641 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"`&tnb`wrwjv1+m1l^X62V>RQ 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 uxXE2GB)VyFe*N* "output/$a.out" - git add "output/$a.out" - fi -done diff --git a/libs/mangle/sound/tests/wav_source_test.cpp b/libs/mangle/sound/tests/wav_source_test.cpp deleted file mode 100644 index 749af1849..000000000 --- a/libs/mangle/sound/tests/wav_source_test.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#include "../sources/wav_source.hpp" -#include "../../stream/servers/file_stream.hpp" - -#include -#include - -using namespace std; -using namespace Mangle::Sound; -using namespace Mangle::Stream; - -int main() -{ - WavSource wav("cow.wav"); - - cout << "Source size: " << wav.size() << endl; - int rate, channels, bits; - wav.getInfo(&rate, &channels, &bits); - cout << "rate=" << rate << "\nchannels=" << channels - << "\nbits=" << bits << endl; - - cout << "Reading entire buffer into memory\n"; - void *buf = malloc(wav.size()); - wav.read(buf, wav.size()); - - cout << "\nReading cow.raw\n"; - FileStream tmp("cow.raw"); - cout << "Size: " << tmp.size() << endl; - void *buf2 = malloc(tmp.size()); - tmp.read(buf2, tmp.size()); - - cout << "\nComparing...\n"; - if(tmp.size() != wav.size()) - { - cout << "SIZE MISMATCH!\n"; - assert(0); - } - - if(memcmp(buf, buf2, wav.size()) != 0) - { - cout << "CONTENT MISMATCH!\n"; - assert(0); - } - - cout << "\nDone\n"; - return 0; -} diff --git a/libs/openengine/sound/sndmanager.cpp b/libs/openengine/sound/sndmanager.cpp deleted file mode 100644 index 02c6ba1e7..000000000 --- a/libs/openengine/sound/sndmanager.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "sndmanager.hpp" - -#include "../misc/list.hpp" -#include - -using namespace OEngine::Sound; -using namespace Mangle::Sound; - -/** This is our own internal implementation of the - Mangle::Sound::Sound interface. This class links a SoundPtr to - itself and prevents itself from being deleted as long as the sound - is playing. - */ -struct OEngine::Sound::ManagedSound : SoundFilter -{ -private: - /** Who's your daddy? This is set if and only if we are listed - internally in the given SoundManager. - - It may be NULL if the manager has been deleted but the user - keeps their own SoundPtrs to the object. - */ - SoundManager *mgr; - - /** Keep a weak pointer to ourselves, which we convert into a - 'strong' pointer when we are playing. When 'self' is pointing to - ourselves, the object will never be deleted. - - This is used to make sure the sound is not deleted while - playing, unless it is explicitly ordered to do so by the - manager. - - TODO: This kind of construct is useful. If we need it elsewhere - later, template it. It would be generally useful in any system - where we poll to check if a resource is still needed, but where - manual references are allowed. - */ - WSoundPtr weak; - SoundPtr self; - - // Keep this object from being deleted - void lock() - { - self = SoundPtr(weak); - } - - // Release the lock. This may or may not delete the object. Never do - // anything after calling unlock()! - void unlock() - { - self.reset(); - } - -public: - // Used for putting ourselves in linked lists - ManagedSound *next, *prev; - - /** Detach this sound from its manager. This means that the manager - will no longer know we exist. Typically only called when either - the sound or the manager is about to get deleted. - - Since this means update() will no longer be called, we also have - to unlock the sound manually since it will no longer be able to - do that itself. This means that the sound may be deleted, even - if it is still playing, when the manager is deleted. - - However, you are still allowed to keep and manage your own - SoundPtr references, but the lock/unlock system is disabled - after the manager is gone. - */ - void detach() - { - if(mgr) - { - mgr->detach(this); - mgr = NULL; - } - - // Unlock must be last command. Object may get deleted at this - // point. - unlock(); - } - - ManagedSound(SoundPtr snd, SoundManager *mg) - : SoundFilter(snd), mgr(mg) - {} - ~ManagedSound() { detach(); } - - // Needed to set up the weak pointer - void setup(SoundPtr self) - { - weak = WSoundPtr(self); - } - - // Override play() to mark the object as locked - void play() - { - SoundFilter::play(); - - // Lock the object so that it is not deleted while playing. Only - // do this if we have a manager, otherwise the object will never - // get unlocked. - if(mgr) lock(); - } - - // Called regularly by the manager - void update() - { - // If we're no longer playing, don't force object retention. - if(!isPlaying()) - unlock(); - - // unlock() may delete the object, so don't do anything below this - // point. - } - - SoundPtr clone() - { - // Cloning only works when we have a manager. - assert(mgr); - return mgr->wrap(client->clone()); - } -}; - -struct SoundManager::SoundManagerList -{ -private: - // A linked list of ManagedSound objects. - typedef Misc::List SoundList; - SoundList list; - -public: - // Add a new sound to the list - void addNew(ManagedSound* snd) - { - list.insert(snd); - } - - // Remove a sound from the list - void remove(ManagedSound *snd) - { - list.remove(snd); - } - - // Number of sounds in the list - int numSounds() { return list.getNum(); } - - // Update all sounds - void updateAll() - { - ManagedSound *s = list.getHead(); - while(s) - { - ManagedSound *cur = s; - // Propagate first, since update() may delete object - s = s->next; - cur->update(); - } - } - - // Detach and unlock all sounds - void detachAll() - { - ManagedSound *s = list.getHead(); - while(s) - { - ManagedSound *cur = s; - s = s->next; - cur->detach(); - } - } -}; - -SoundManager::SoundManager(SoundFactoryPtr fact) - : FactoryFilter(fact) -{ - needsUpdate = true; - list = new SoundManagerList; -} - -SoundManager::~SoundManager() -{ - // Detach all sounds - list->detachAll(); -} - -SoundPtr SoundManager::wrap(SoundPtr client) -{ - // Create and set up the sound wrapper - ManagedSound *snd = new ManagedSound(client,this); - SoundPtr ptr(snd); - snd->setup(ptr); - - // Add ourselves to the list of all sounds - list->addNew(snd); - - return ptr; -} - -// Remove the sound from this manager. -void SoundManager::detach(ManagedSound *sound) -{ - list->remove(sound); -} - -int SoundManager::numSounds() -{ - return list->numSounds(); -} - -void SoundManager::update() -{ - // Update all the sounds we own - list->updateAll(); - - // Update the source if it needs it - if(client->needsUpdate) - client->update(); -} diff --git a/libs/openengine/sound/sndmanager.hpp b/libs/openengine/sound/sndmanager.hpp deleted file mode 100644 index 5ea0c4fc3..000000000 --- a/libs/openengine/sound/sndmanager.hpp +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef OENGINE_SOUND_MANAGER_H -#define OENGINE_SOUND_MANAGER_H - -#include - -namespace OEngine -{ - namespace Sound - { - using namespace Mangle::Sound; - - class ManagedSound; - - /** A manager of Mangle::Sounds. - - The sound manager is a wrapper around the more low-level - SoundFactory - although it is also itself an implementation of - SoundFactory. It will: - - keep a list of all created sounds - - let you iterate the list - - keep references to playing sounds so you don't have to - - auto-release references to sounds that are finished playing - (ie. deleting them if you're not referencing them) - */ - class SoundManager : public FactoryFilter - { - // Shove the implementation details into the cpp file. - struct SoundManagerList; - SoundManagerList *list; - - // Create a new sound wrapper based on the given source sound. - SoundPtr wrap(SoundPtr snd); - - /** Internal function. Will completely disconnect the given - sound from this manager. Called from ManagedSound. - */ - friend class ManagedSound; - void detach(ManagedSound *sound); - public: - SoundManager(SoundFactoryPtr fact); - ~SoundManager(); - void update(); - - /// Get number of sounds currently managed by this manager. - int numSounds(); - - SoundPtr loadRaw(SampleSourcePtr input) - { return wrap(client->loadRaw(input)); } - - SoundPtr load(Mangle::Stream::StreamPtr input) - { return wrap(client->load(input)); } - - SoundPtr load(const std::string &file) - { return wrap(client->load(file)); } - - // Play a sound immediately, and release when done unless you - // keep the returned SoundPtr. - SoundPtr play(Mangle::Stream::StreamPtr sound) - { - SoundPtr snd = load(sound); - snd->play(); - return snd; - } - - SoundPtr play(const std::string &sound) - { - SoundPtr snd = load(sound); - snd->play(); - return snd; - } - - // Ditto for 3D sounds - SoundPtr play3D(Mangle::Stream::StreamPtr sound, float x, float y, float z) - { - SoundPtr snd = load(sound); - snd->setPos(x,y,z); - snd->play(); - return snd; - } - - SoundPtr play3D(const std::string &sound, float x, float y, float z) - { - SoundPtr snd = load(sound); - snd->setPos(x,y,z); - snd->play(); - return snd; - } - }; - - typedef boost::shared_ptr SoundManagerPtr; - } -} -#endif diff --git a/libs/openengine/sound/tests/Makefile b/libs/openengine/sound/tests/Makefile deleted file mode 100644 index 04952167f..000000000 --- a/libs/openengine/sound/tests/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -GCC=g++ -I../ - -all: sound_manager_test sound_3d_test - -L_FFMPEG=$(shell pkg-config --libs libavcodec libavformat) -L_OPENAL=$(shell pkg-config --libs openal) -L_AUDIERE=-laudiere - -sound_manager_test: sound_manager_test.cpp ../../mangle/sound/sources/audiere_source.cpp ../../mangle/sound/outputs/openal_out.cpp ../../mangle/stream/clients/audiere_file.cpp ../sndmanager.cpp - $(GCC) $^ -o $@ $(L_AUDIERE) $(L_OPENAL) -I../.. - -sound_3d_test: sound_3d_test.cpp ../../mangle/sound/sources/audiere_source.cpp ../../mangle/sound/outputs/openal_out.cpp ../../mangle/stream/clients/audiere_file.cpp ../sndmanager.cpp - $(GCC) $^ -o $@ $(L_AUDIERE) $(L_OPENAL) -I../.. - -clean: - rm *_test diff --git a/libs/openengine/sound/tests/output/sound_3d_test.out b/libs/openengine/sound/tests/output/sound_3d_test.out deleted file mode 100644 index a443c84f0..000000000 --- a/libs/openengine/sound/tests/output/sound_3d_test.out +++ /dev/null @@ -1,3 +0,0 @@ -Playing at 0,0,0 -Playing at 1,1,0 -Playing at -1,0,0 diff --git a/libs/openengine/sound/tests/output/sound_manager_test.out b/libs/openengine/sound/tests/output/sound_manager_test.out deleted file mode 100644 index 2b458493d..000000000 --- a/libs/openengine/sound/tests/output/sound_manager_test.out +++ /dev/null @@ -1,5 +0,0 @@ -Playing ../../mangle/sound/tests/cow.wav -Replaying -pause -restart -Done playing. diff --git a/libs/openengine/sound/tests/sound_3d_test.cpp b/libs/openengine/sound/tests/sound_3d_test.cpp deleted file mode 100644 index f5b197fd0..000000000 --- a/libs/openengine/sound/tests/sound_3d_test.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include -#include - -#include -#include - -#include - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; -using namespace OEngine::Sound; - -const std::string sound = "../../mangle/sound/tests/cow.wav"; - -SoundManagerPtr m; - -// Play and wait for finish -void play(float x, float y, float z) -{ - cout << "Playing at " << x << "," << y << "," << z << endl; - - SoundPtr snd = m->play3D(sound,x,y,z); - - while(snd->isPlaying()) - { - usleep(10000); - m->update(); - } -} - -int main() -{ - SoundFactoryPtr oaf(new OpenAL_Audiere_Factory); - SoundManagerPtr mg(new SoundManager(oaf)); - m = mg; - - mg->setListenerPos(0,0,0,0,1,0,0,0,1); - - play(0,0,0); - play(1,1,0); - play(-1,0,0); - - return 0; -} diff --git a/libs/openengine/sound/tests/sound_manager_test.cpp b/libs/openengine/sound/tests/sound_manager_test.cpp deleted file mode 100644 index 3794c4a3c..000000000 --- a/libs/openengine/sound/tests/sound_manager_test.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include - -#include -#include - -#include - -using namespace std; -using namespace Mangle::Stream; -using namespace Mangle::Sound; -using namespace OEngine::Sound; - -const std::string sound = "../../mangle/sound/tests/cow.wav"; - -int main() -{ - SoundFactoryPtr oaf(new OpenAL_Audiere_Factory); - SoundManagerPtr mg(new SoundManager(oaf)); - - cout << "Playing " << sound << "\n"; - - assert(mg->numSounds() == 0); - - /** Start the sound playing, and then let the pointer go out of - scope. Lower-level players (like 'oaf' above) will immediately - delete the sound. SoundManager OTOH will keep it until it's - finished. - */ - mg->play(sound); - - assert(mg->numSounds() == 1); - - // Loop while there are still sounds to manage - while(mg->numSounds() != 0) - { - assert(mg->numSounds() == 1); - usleep(10000); - if(mg->needsUpdate) - mg->update(); - } - - SoundPtr snd = mg->play(sound); - cout << "Replaying\n"; - int i = 0; - while(mg->numSounds() != 0) - { - assert(mg->numSounds() == 1); - usleep(10000); - if(mg->needsUpdate) - mg->update(); - - if(i++ == 70) - { - cout << "pause\n"; - snd->pause(); - } - if(i == 130) - { - cout << "restart\n"; - snd->play(); - // Let the sound go out of scope - snd.reset(); - } - } - - cout << "Done playing.\n"; - - assert(mg->numSounds() == 0); - - return 0; -} diff --git a/libs/openengine/sound/tests/test.sh b/libs/openengine/sound/tests/test.sh deleted file mode 100755 index 2d07708ad..000000000 --- a/libs/openengine/sound/tests/test.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -make || exit - -mkdir -p output - -PROGS=*_test - -for a in $PROGS; do - if [ -f "output/$a.out" ]; then - echo "Running $a:" - ./$a | diff output/$a.out - - else - echo "Creating $a.out" - ./$a > "output/$a.out" - git add "output/$a.out" - fi -done From 45b612ab3bf32b98209e8a8b205bce573bd358a7 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 16 Mar 2012 22:12:17 -0700 Subject: [PATCH 060/586] Add a skeleton output classs using OpenAL --- CMakeLists.txt | 12 +- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwsound/openal_output.cpp | 60 +++++++++ apps/openmw/mwsound/openal_output.hpp | 29 +++++ apps/openmw/mwsound/soundmanager.cpp | 26 ++-- apps/openmw/mwsound/soundmanager.hpp | 167 ++++++++++++++------------ 6 files changed, 204 insertions(+), 92 deletions(-) create mode 100644 apps/openmw/mwsound/openal_output.cpp create mode 100644 apps/openmw/mwsound/openal_output.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d06085322..876ea8273 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,6 +118,12 @@ set(OENGINE_BULLET ${LIBDIR}/openengine/bullet/BulletShapeLoader.h ) +set(OENGINE_ALL ${OENGINE_OGRE} ${OENGINE_GUI} ${OENGINE_BULLET}) +source_group(libs\\openengine FILES ${OENGINE_ALL}) + +set(OPENMW_LIBS ${MANGLE_ALL} ${OENGINE_ALL}) +set(OPENMW_LIBS_HEADER) + # Sound setup if (USE_AUDIERE) find_package(Audiere REQUIRED) @@ -141,12 +147,6 @@ if (USE_MPG123) set(SOUND_DEFINE -DOPENMW_USE_MPG123) endif (USE_MPG123) -set(OENGINE_ALL ${OENGINE_OGRE} ${OENGINE_GUI} ${OENGINE_BULLET}) -source_group(libs\\openengine FILES ${OENGINE_ALL}) - -set(OPENMW_LIBS ${MANGLE_ALL} ${OENGINE_ALL}) -set(OPENMW_LIBS_HEADER) - # Platform specific if (WIN32) set(PLATFORM_INCLUDE_DIR "platform") diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 77f465b4c..e9002f111 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -38,7 +38,7 @@ add_openmw_dir (mwscript ) add_openmw_dir (mwsound - soundmanager + soundmanager openal_output ) add_openmw_dir (mwworld diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp new file mode 100644 index 000000000..59e9037c4 --- /dev/null +++ b/apps/openmw/mwsound/openal_output.cpp @@ -0,0 +1,60 @@ +#include "openal_output.hpp" + +namespace MWSound +{ + +static void fail(const std::string &msg) +{ throw std::runtime_error("OpenAL exception: " + msg); } + + +bool OpenAL_Output::Initialize(const std::string &devname) +{ + if(Context) + fail("Device already initialized"); + + Device = alcOpenDevice(devname.c_str()); + if(!Device) + { + std::cout << "Failed to open \""<Initialize()) + { + Output.reset(); + return; + } + // The music library will accept these filetypes // If none is given then it will accept all filetypes std::vector acceptableExtensions; @@ -66,13 +72,11 @@ namespace MWSound std::string anything = "anything"; // anything is better that a segfault mCurrentPlaylist = mMusicLibrary.section(anything, mFSStrict); // now points to an empty path - - std::cout << "Sound output: " << SOUND_OUT << std::endl; - std::cout << "Sound decoder: " << SOUND_IN << std::endl; } SoundManager::~SoundManager() { + Output.reset(); } // Convert a soundId to file name, and modify the volume @@ -258,7 +262,7 @@ namespace MWSound float min, max; const std::string &file = lookup(soundId, volume, min, max); if(file != "") - add(file, ptr, soundId, volume, pitch, min, max, loop, untracked); + std::cout << "Cannot play " << file << ", skipping.\n"; } void SoundManager::stopSound3D(MWWorld::Ptr ptr, const std::string& soundId) diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 9db7fe1b7..f77222cb4 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -21,103 +21,122 @@ namespace MWWorld namespace MWSound { + class Sound_Output; + class SoundManager { + // This is used for case insensitive and slash-type agnostic file + // finding. It takes DOS paths (any case, \\ slashes or / slashes) + // relative to the sound dir, and translates them into full paths + // of existing files in the filesystem, if they exist. + bool mFSStrict; + + MWWorld::Environment& mEnvironment; + + std::auto_ptr Output; + + void streamMusicFull(const std::string& filename); + ///< Play a soundifle + /// \param absolute filename + + // A list of all sound files used to lookup paths + Files::PathContainer mSoundFiles; + + // A library of all Music file paths stored by the folder they are contained in + Files::FileLibrary mMusicLibrary; + + // Points to the current playlist of music files stored in the music library + const Files::PathContainer* mCurrentPlaylist; + + std::string lookup(const std::string &soundId, + float &volume, float &min, float &max); + void add(const std::string &file, + MWWorld::Ptr ptr, const std::string &id, + float volume, float pitch, float min, float max, + bool loop, bool untracked=false); + void remove(MWWorld::Ptr ptr, const std::string &id = ""); + bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; + void removeCell(const MWWorld::Ptr::CellStore *cell); + void updatePositions(MWWorld::Ptr ptr); + + public: + SoundManager(Ogre::Root*, Ogre::Camera*, + const Files::PathContainer& dataDir, bool useSound, bool fsstrict, + MWWorld::Environment& environment); + ~SoundManager(); - // This is used for case insensitive and slash-type agnostic file - // finding. It takes DOS paths (any case, \\ slashes or / slashes) - // relative to the sound dir, and translates them into full paths - // of existing files in the filesystem, if they exist. - bool mFSStrict; - - MWWorld::Environment& mEnvironment; - - void streamMusicFull (const std::string& filename); - ///< Play a soundifle - /// \param absolute filename - - // A list of all sound files used to lookup paths - Files::PathContainer mSoundFiles; - - // A library of all Music file paths stored by the folder they are contained in - Files::FileLibrary mMusicLibrary; + void stopMusic(); + ///< Stops music if it's playing - // Points to the current playlist of music files stored in the music library - const Files::PathContainer* mCurrentPlaylist; + void streamMusic(const std::string& filename); + ///< Play a soundifle + /// \param filename name of a sound file in "Music/" in the data directory. - std::string lookup(const std::string &soundId, - float &volume, float &min, float &max); - void add(const std::string &file, - MWWorld::Ptr ptr, const std::string &id, - float volume, float pitch, float min, float max, - bool loop, bool untracked=false); - void remove(MWWorld::Ptr ptr, const std::string &id = ""); - bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; - void removeCell(const MWWorld::Ptr::CellStore *cell); - void updatePositions(MWWorld::Ptr ptr); + void startRandomTitle(); + ///< Starts a random track from the current playlist - public: + bool isMusicPlaying(); + ///< Returns true if music is playing - SoundManager(Ogre::Root*, Ogre::Camera*, - const Files::PathContainer& dataDir, bool useSound, bool fsstrict, - MWWorld::Environment& environment); - ~SoundManager(); + bool setPlaylist(std::string playlist=""); + ///< Set the playlist to an existing folder + /// \param name of the folder that contains the playlist + /// if none is set then it is set to an empty playlist + /// \return Return true if the previous playlist was the same - void stopMusic(); - ///< Stops music if it's playing + void playPlaylist(std::string playlist=""); + ///< Start playing music from the selected folder + /// \param name of the folder that contains the playlist + /// if none is set then it plays from the current playlist - void streamMusic(const std::string& filename); - ///< Play a soundifle - /// \param filename name of a sound file in "Music/" in the data directory. + void say(MWWorld::Ptr reference, const std::string& filename); + ///< Make an actor say some text. + /// \param filename name of a sound file in "Sound/Vo/" in the data directory. - void startRandomTitle(); - ///< Starts a random track from the current playlist + bool sayDone(MWWorld::Ptr reference) const; + ///< Is actor not speaking? - bool isMusicPlaying(); - ///< Returns true if music is playing + void playSound(const std::string& soundId, float volume, float pitch, bool loop=false); + ///< Play a sound, independently of 3D-position - bool setPlaylist(std::string playlist=""); - ///< Set the playlist to an existing folder - /// \param name of the folder that contains the playlist - /// if none is set then it is set to an empty playlist - /// \return Return true if the previous playlist was the same + void playSound3D(MWWorld::Ptr reference, const std::string& soundId, + float volume, float pitch, bool loop, + bool untracked=false); + ///< Play a sound from an object - void playPlaylist(std::string playlist=""); - ///< Start playing music from the selected folder - /// \param name of the folder that contains the playlist - /// if none is set then it plays from the current playlist + void stopSound3D(MWWorld::Ptr reference, const std::string& soundId=""); + ///< Stop the given object from playing the given sound, If no soundId is given, + /// all sounds for this reference will stop. - void say (MWWorld::Ptr reference, const std::string& filename); - ///< Make an actor say some text. - /// \param filename name of a sound file in "Sound/Vo/" in the data directory. + void stopSound(MWWorld::Ptr::CellStore *cell); + ///< Stop all sounds for the given cell. - bool sayDone (MWWorld::Ptr reference) const; - ///< Is actor not speaking? + void stopSound(const std::string& soundId); + ///< Stop a non-3d looping sound - void playSound (const std::string& soundId, float volume, float pitch, bool loop=false); - ///< Play a sound, independently of 3D-position + bool getSoundPlaying(MWWorld::Ptr reference, const std::string& soundId) const; + ///< Is the given sound currently playing on the given object? - void playSound3D (MWWorld::Ptr reference, const std::string& soundId, - float volume, float pitch, bool loop, bool untracked=false); - ///< Play a sound from an object + void updateObject(MWWorld::Ptr reference); + ///< Update the position of all sounds connected to the given object. - void stopSound3D (MWWorld::Ptr reference, const std::string& soundId = ""); - ///< Stop the given object from playing the given sound, If no soundId is given, - /// all sounds for this reference will stop. + void update(float duration); + }; - void stopSound (MWWorld::Ptr::CellStore *cell); - ///< Stop all sounds for the given cell. + class Sound_Output + { + SoundManager &mgr; - void stopSound(const std::string& soundId); - ///< Stop a non-3d looping sound + virtual bool Initialize(const std::string &devname="") = 0; + virtual void Deinitialize() = 0; - bool getSoundPlaying (MWWorld::Ptr reference, const std::string& soundId) const; - ///< Is the given sound currently playing on the given object? + Sound_Output(SoundManager &mgr) : mgr(mgr) { } - void updateObject(MWWorld::Ptr reference); - ///< Update the position of all sounds connected to the given object. + public: + virtual ~Sound_Output() { } - void update (float duration); + friend class OpenAL_Output; + friend class SoundManager; }; } From 10037e79e70ff5a4822f73e7da792c7ba6178e54 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 16 Mar 2012 23:18:15 -0700 Subject: [PATCH 061/586] Add a skeleton decoder class using mpg123 and libsndfile --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwsound/mpgsnd_decoder.cpp | 29 ++++++++++++++++++++++++++ apps/openmw/mwsound/mpgsnd_decoder.hpp | 29 ++++++++++++++++++++++++++ apps/openmw/mwsound/sound_decoder.hpp | 19 +++++++++++++++++ apps/openmw/mwsound/soundmanager.cpp | 2 ++ apps/openmw/mwsound/soundmanager.hpp | 2 +- 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 apps/openmw/mwsound/mpgsnd_decoder.cpp create mode 100644 apps/openmw/mwsound/mpgsnd_decoder.hpp create mode 100644 apps/openmw/mwsound/sound_decoder.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index e9002f111..bb7655a3c 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -38,7 +38,7 @@ add_openmw_dir (mwscript ) add_openmw_dir (mwsound - soundmanager openal_output + soundmanager openal_output mpgsnd_decoder ) add_openmw_dir (mwworld diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp new file mode 100644 index 000000000..cdc392e70 --- /dev/null +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -0,0 +1,29 @@ +#include "mpgsnd_decoder.hpp" + + +namespace MWSound +{ + +bool MpgSnd_Decoder::Open(const std::string &fname) +{ + return false; +} + +void MpgSnd_Decoder::Close() +{ +} + + +MpgSnd_Decoder::MpgSnd_Decoder() +{ + static bool initdone = false; + if(!initdone) + mpg123_init(); + initdone = true; +} + +MpgSnd_Decoder::~MpgSnd_Decoder() +{ +} + +} diff --git a/apps/openmw/mwsound/mpgsnd_decoder.hpp b/apps/openmw/mwsound/mpgsnd_decoder.hpp new file mode 100644 index 000000000..ffa9037a7 --- /dev/null +++ b/apps/openmw/mwsound/mpgsnd_decoder.hpp @@ -0,0 +1,29 @@ +#ifndef GAME_SOUND_MPGSND_DECODER_H +#define GAME_SOUND_MPGSND_DECODER_H + +#include + +#include "mpg123.h" +#include "sndfile.h" + +#include "sound_decoder.hpp" + + +namespace MWSound +{ + class MpgSnd_Decoder : public Sound_Decoder + { + virtual bool Open(const std::string &fname); + virtual void Close(); + + MpgSnd_Decoder(); + virtual ~MpgSnd_Decoder(); + + friend class SoundManager; + }; +#ifndef DEFAULT_DECODER +#define DEFAULT_DECODER (::MWSound::MpgSnd_Decoder) +#endif +}; + +#endif diff --git a/apps/openmw/mwsound/sound_decoder.hpp b/apps/openmw/mwsound/sound_decoder.hpp new file mode 100644 index 000000000..0d7e3d9f8 --- /dev/null +++ b/apps/openmw/mwsound/sound_decoder.hpp @@ -0,0 +1,19 @@ +#ifndef GAME_SOUND_SOUND_DECODER_H +#define GAME_SOUND_SOUND_DECODER_H + +namespace MWSound +{ + class Sound_Decoder + { + public: + virtual bool Open(const std::string &fname) = 0; + virtual void Close() = 0; + + virtual ~Sound_Decoder() { } + + friend class OpenAL_Output; + friend class SoundManager; + }; +} + +#endif diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 8b852a746..c22550a2a 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -12,6 +12,7 @@ #include "../mwworld/world.hpp" #include "../mwworld/player.hpp" +#include "sound_decoder.hpp" #include "openal_output.hpp" #define SOUND_OUT "OpenAL" @@ -28,6 +29,7 @@ #endif #ifdef OPENMW_USE_MPG123 +#include "mpgsnd_decoder.hpp" #define SOUND_IN "mpg123,sndfile" #endif diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index f77222cb4..8d2184c54 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -22,6 +22,7 @@ namespace MWWorld namespace MWSound { class Sound_Output; + class Sound_Decoder; class SoundManager { @@ -131,7 +132,6 @@ namespace MWSound virtual void Deinitialize() = 0; Sound_Output(SoundManager &mgr) : mgr(mgr) { } - public: virtual ~Sound_Output() { } From 1322b1e160e2c6a3109b1d623d8ccc87443d8d5c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 16 Mar 2012 23:40:07 -0700 Subject: [PATCH 062/586] Move Sound_Output's definition to a separate header --- apps/openmw/mwsound/openal_output.cpp | 3 +++ apps/openmw/mwsound/openal_output.hpp | 6 +++++- apps/openmw/mwsound/sound_output.hpp | 26 ++++++++++++++++++++++++++ apps/openmw/mwsound/soundmanager.cpp | 1 + apps/openmw/mwsound/soundmanager.hpp | 15 --------------- 5 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 apps/openmw/mwsound/sound_output.hpp diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 59e9037c4..3f9910038 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -1,3 +1,6 @@ +#include +#include + #include "openal_output.hpp" namespace MWSound diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index 6d0169366..d5748ee30 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -1,13 +1,17 @@ #ifndef GAME_SOUND_OPENAL_OUTPUT_H #define GAME_SOUND_OPENAL_OUTPUT_H -#include "soundmanager.hpp" +#include #include "alc.h" #include "al.h" +#include "sound_output.hpp" + namespace MWSound { + class SoundManager; + class OpenAL_Output : public Sound_Output { ALCdevice *Device; diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp new file mode 100644 index 000000000..b36a4e89f --- /dev/null +++ b/apps/openmw/mwsound/sound_output.hpp @@ -0,0 +1,26 @@ +#ifndef GAME_SOUND_SOUND_OUTPUT_H +#define GAME_SOUND_SOUND_OUTPUT_H + +#include + +namespace MWSound +{ + class SoundManager; + + class Sound_Output + { + SoundManager &mgr; + + virtual bool Initialize(const std::string &devname="") = 0; + virtual void Deinitialize() = 0; + + Sound_Output(SoundManager &mgr) : mgr(mgr) { } + public: + virtual ~Sound_Output() { } + + friend class OpenAL_Output; + friend class SoundManager; + }; +} + +#endif diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index c22550a2a..cb9c58715 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -12,6 +12,7 @@ #include "../mwworld/world.hpp" #include "../mwworld/player.hpp" +#include "sound_output.hpp" #include "sound_decoder.hpp" #include "openal_output.hpp" diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 8d2184c54..5a58c60b7 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -123,21 +123,6 @@ namespace MWSound void update(float duration); }; - - class Sound_Output - { - SoundManager &mgr; - - virtual bool Initialize(const std::string &devname="") = 0; - virtual void Deinitialize() = 0; - - Sound_Output(SoundManager &mgr) : mgr(mgr) { } - public: - virtual ~Sound_Output() { } - - friend class OpenAL_Output; - friend class SoundManager; - }; } #endif From 46cd84aac56f2a396845cd2caec8e9d6596b9c65 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 16 Mar 2012 23:59:21 -0700 Subject: [PATCH 063/586] Add a skeleton ffmpeg decoder --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwsound/ffmpeg_decoder.cpp | 29 +++++++++++++++++++++++ apps/openmw/mwsound/ffmpeg_decoder.hpp | 32 ++++++++++++++++++++++++++ apps/openmw/mwsound/mpgsnd_decoder.cpp | 4 ++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 apps/openmw/mwsound/ffmpeg_decoder.cpp create mode 100644 apps/openmw/mwsound/ffmpeg_decoder.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index bb7655a3c..749b5bc5d 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -38,7 +38,7 @@ add_openmw_dir (mwscript ) add_openmw_dir (mwsound - soundmanager openal_output mpgsnd_decoder + soundmanager openal_output mpgsnd_decoder ffmpeg_decoder ) add_openmw_dir (mwworld diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp new file mode 100644 index 000000000..8bd6b3f8e --- /dev/null +++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp @@ -0,0 +1,29 @@ +#ifdef OPENMW_USE_FFMPEG + +#include "ffmpeg_decoder.hpp" + + +namespace MWSound +{ + +bool FFmpeg_Decoder::Open(const std::string &fname) +{ + return false; +} + +void FFmpeg_Decoder::Close() +{ +} + + +FFmpeg_Decoder::FFmpeg_Decoder() +{ +} + +FFmpeg_Decoder::~FFmpeg_Decoder() +{ +} + +} + +#endif diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp new file mode 100644 index 000000000..2b7363f26 --- /dev/null +++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp @@ -0,0 +1,32 @@ +#ifndef GAME_SOUND_FFMPEG_DECODER_H +#define GAME_SOUND_FFMPEG_DECODER_H + +#include + +extern "C" +{ +#include +#include +} + +#include "sound_decoder.hpp" + + +namespace MWSound +{ + class FFmpeg_Decoder : public Sound_Decoder + { + virtual bool Open(const std::string &fname); + virtual void Close(); + + FFmpeg_Decoder(); + virtual ~FFmpeg_Decoder(); + + friend class SoundManager; + }; +#ifndef DEFAULT_DECODER +#define DEFAULT_DECODER (::MWSound::FFmpeg_Decoder) +#endif +}; + +#endif diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp index cdc392e70..6ca46381d 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.cpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -1,3 +1,5 @@ +#ifdef OPENMW_USE_MPG123 + #include "mpgsnd_decoder.hpp" @@ -27,3 +29,5 @@ MpgSnd_Decoder::~MpgSnd_Decoder() } } + +#endif From 246b0266fb5b7a326f8cccd9d23244ff858e2f8e Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 00:11:59 -0700 Subject: [PATCH 064/586] Remove references to Audiere. It's not supported for now. --- CMakeLists.txt | 8 -------- apps/openmw/mwsound/soundmanager.cpp | 4 ---- 2 files changed, 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 876ea8273..db8f9d171 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,6 @@ set (OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VE configure_file ("${OpenMW_SOURCE_DIR}/Docs/mainpage.hpp.cmake" "${OpenMW_SOURCE_DIR}/Docs/mainpage.hpp") # Sound source selection -option(USE_AUDIERE "use Audiere for sound" OFF) option(USE_FFMPEG "use ffmpeg for sound" OFF) option(USE_MPG123 "use mpg123 + libsndfile for sound" ON) @@ -125,13 +124,6 @@ set(OPENMW_LIBS ${MANGLE_ALL} ${OENGINE_ALL}) set(OPENMW_LIBS_HEADER) # Sound setup -if (USE_AUDIERE) - find_package(Audiere REQUIRED) - set(SOUND_INPUT_INCLUDES ${AUDIERE_INCLUDE_DIR}) - set(SOUND_INPUT_LIBRARY ${AUDIERE_LIBRARY}) - set(SOUND_DEFINE -DOPENMW_USE_AUDIERE) -endif (USE_AUDIERE) - if (USE_FFMPEG) find_package(FFMPEG REQUIRED) set(SOUND_INPUT_INCLUDES ${FFMPEG_INCLUDE_DIR}) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index cb9c58715..17dfa5ef5 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -21,10 +21,6 @@ MPG123/libsndfile for input. The OPENMW_USE_x macros are set in CMakeLists.txt. */ -#ifdef OPENMW_USE_AUDIERE -#define SOUND_IN "Audiere" -#endif - #ifdef OPENMW_USE_FFMPEG #define SOUND_IN "FFmpeg" #endif From 637617056b4a6015a151ce8342e57e312c40a662 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 02:45:18 -0700 Subject: [PATCH 065/586] Make a skeleton Sound class --- apps/openmw/mwsound/sound.hpp | 22 ++++++++++++++++++++++ apps/openmw/mwsound/soundmanager.cpp | 14 ++++++++------ apps/openmw/mwsound/soundmanager.hpp | 3 +++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 apps/openmw/mwsound/sound.hpp diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp new file mode 100644 index 000000000..9d262416e --- /dev/null +++ b/apps/openmw/mwsound/sound.hpp @@ -0,0 +1,22 @@ +#ifndef GAME_SOUND_SOUND_H +#define GAME_SOUND_SOUND_H + +#include + +namespace MWSound +{ + class Sound + { + virtual bool Play() = 0; + virtual void Stop() = 0; + virtual bool isPlaying() = 0; + + public: + virtual ~Sound() { } + + friend class OpenAL_Output; + friend class SoundManager; + }; +} + +#endif diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 17dfa5ef5..d231f1d4a 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -14,6 +14,7 @@ #include "sound_output.hpp" #include "sound_decoder.hpp" +#include "sound.hpp" #include "openal_output.hpp" #define SOUND_OUT "OpenAL" @@ -143,15 +144,18 @@ namespace MWSound void SoundManager::stopMusic() { + if(mMusic) + mMusic->Stop(); setPlaylist(); } void SoundManager::streamMusicFull(const std::string& filename) { - // Play the sound and tell it to stream, if possible. TODO: - // Store the reference, the jukebox will need to check status, - // control volume etc. + if(mMusic) + mMusic->Stop(); + std::auto_ptr decoder(new DEFAULT_DECODER); + //mMusic.reset(Output->StreamSound(filename, decoder)); } void SoundManager::streamMusic(const std::string& filename) @@ -186,9 +190,7 @@ namespace MWSound bool SoundManager::isMusicPlaying() { - // HACK: Return true to prevent the engine from trying to keep playing - // music and tanking the framerate. - return true; + return mMusic && mMusic->isPlaying(); } bool SoundManager::setPlaylist(std::string playlist) diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 5a58c60b7..709ab2817 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -23,6 +23,7 @@ namespace MWSound { class Sound_Output; class Sound_Decoder; + class Sound; class SoundManager { @@ -36,6 +37,8 @@ namespace MWSound std::auto_ptr Output; + boost::shared_ptr mMusic; + void streamMusicFull(const std::string& filename); ///< Play a soundifle /// \param absolute filename From 9cf42f6d0fcde91c25f5ffe0027cd186223421aa Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 02:51:46 -0700 Subject: [PATCH 066/586] Flesh out the sound decoder a bit more --- apps/openmw/mwsound/ffmpeg_decoder.cpp | 15 ++++ apps/openmw/mwsound/ffmpeg_decoder.hpp | 3 + apps/openmw/mwsound/mpgsnd_decoder.cpp | 95 +++++++++++++++++++++++++- apps/openmw/mwsound/mpgsnd_decoder.hpp | 9 +++ apps/openmw/mwsound/sound_decoder.hpp | 11 +++ 5 files changed, 132 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp index 8bd6b3f8e..d3715d5fe 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.cpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp @@ -6,8 +6,12 @@ namespace MWSound { +static void fail(const std::string &msg) +{ throw std::runtime_error("FFmpeg exception: "+msg); } + bool FFmpeg_Decoder::Open(const std::string &fname) { + fail("Not currently working"); return false; } @@ -15,6 +19,17 @@ void FFmpeg_Decoder::Close() { } +void FFmpeg_Decoder::GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type) +{ + fail("Not currently working"); +} + +size_t FFmpeg_Decoder::Read(char *buffer, size_t bytes) +{ + fail("Not currently working"); + return 0; +} + FFmpeg_Decoder::FFmpeg_Decoder() { diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp index 2b7363f26..6ff93904a 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.hpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp @@ -19,6 +19,9 @@ namespace MWSound virtual bool Open(const std::string &fname); virtual void Close(); + virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type); + virtual size_t Read(char *buffer, size_t bytes); + FFmpeg_Decoder(); virtual ~FFmpeg_Decoder(); diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp index 6ca46381d..4ba48f607 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.cpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -1,22 +1,115 @@ #ifdef OPENMW_USE_MPG123 +#include +#include + #include "mpgsnd_decoder.hpp" +static void fail(const std::string &msg) +{ throw std::runtime_error("MpgSnd exception: "+msg); } + namespace MWSound { bool MpgSnd_Decoder::Open(const std::string &fname) { + Close(); + + SF_INFO info; + sndFile = sf_open(fname.c_str(), SFM_READ, &info); + if(sndFile) + { + if(info.channels == 1) + chanConfig = MonoChannels; + else if(info.channels == 1) + chanConfig = MonoChannels; + else + { + sf_close(sndFile); + sndFile = NULL; + fail("Unsupported channel count in "+fname); + } + sampleRate = info.samplerate; + return true; + } + + mpgFile = mpg123_new(NULL, NULL); + if(mpgFile && mpg123_open(mpgFile, fname.c_str()) == MPG123_OK) + { + try + { + int encoding, channels; + long rate; + if(mpg123_getformat(mpgFile, &rate, &channels, &encoding) != MPG123_OK) + fail("Failed to get audio format"); + if(encoding != MPG123_ENC_SIGNED_16) + fail("Unsupported encoding in "+fname); + if(channels != 1 && channels != 2) + fail("Unsupported channel count in "+fname); + chanConfig = ((channels==2)?StereoChannels:MonoChannels); + sampleRate = rate; + return true; + } + catch(std::exception &e) + { + mpg123_close(mpgFile); + mpg123_delete(mpgFile); + throw; + } + mpg123_close(mpgFile); + } + if(mpgFile) + mpg123_delete(mpgFile); + mpgFile = NULL; + + fail("Unsupported file type: "+fname); return false; } void MpgSnd_Decoder::Close() { + if(sndFile) + sf_close(sndFile); + sndFile = NULL; + + if(mpgFile) + { + mpg123_close(mpgFile); + mpg123_delete(mpgFile); + mpgFile = NULL; + } } +void MpgSnd_Decoder::GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type) +{ + if(!sndFile && !mpgFile) + fail("No open file"); + + *samplerate = sampleRate; + *chans = chanConfig; + *type = Int16Sample; +} + +size_t MpgSnd_Decoder::Read(char *buffer, size_t bytes) +{ + size_t got = 0; + + if(sndFile) + { + got = sf_read_short(sndFile, (short*)buffer, bytes/2)*2; + } + else if(mpgFile) + { + int err; + err = mpg123_read(mpgFile, (unsigned char*)buffer, bytes, &got); + if(err != MPG123_OK && err != MPG123_DONE) + fail("Failed to read from file"); + } + return got; +} -MpgSnd_Decoder::MpgSnd_Decoder() +MpgSnd_Decoder::MpgSnd_Decoder() : sndFile(NULL), mpgFile(NULL) { static bool initdone = false; if(!initdone) diff --git a/apps/openmw/mwsound/mpgsnd_decoder.hpp b/apps/openmw/mwsound/mpgsnd_decoder.hpp index ffa9037a7..641d891a3 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.hpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.hpp @@ -13,9 +13,18 @@ namespace MWSound { class MpgSnd_Decoder : public Sound_Decoder { + SNDFILE *sndFile; + mpg123_handle *mpgFile; + + ChannelConfig chanConfig; + int sampleRate; + virtual bool Open(const std::string &fname); virtual void Close(); + virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type); + virtual size_t Read(char *buffer, size_t bytes); + MpgSnd_Decoder(); virtual ~MpgSnd_Decoder(); diff --git a/apps/openmw/mwsound/sound_decoder.hpp b/apps/openmw/mwsound/sound_decoder.hpp index 0d7e3d9f8..fd8f4ac51 100644 --- a/apps/openmw/mwsound/sound_decoder.hpp +++ b/apps/openmw/mwsound/sound_decoder.hpp @@ -6,9 +6,20 @@ namespace MWSound class Sound_Decoder { public: + enum SampleType { + UInt8Sample, + Int16Sample + }; + enum ChannelConfig { + MonoChannels, + StereoChannels + }; virtual bool Open(const std::string &fname) = 0; virtual void Close() = 0; + virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type) = 0; + virtual size_t Read(char *buffer, size_t bytes) = 0; + virtual ~Sound_Decoder() { } friend class OpenAL_Output; From 1ade01edc84c69692c6b3dc39e0c83389eb9e9cb Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 02:55:08 -0700 Subject: [PATCH 067/586] Add a function to stream sounds --- apps/openmw/mwsound/openal_output.cpp | 188 ++++++++++++++++++++++++++ apps/openmw/mwsound/openal_output.hpp | 4 + apps/openmw/mwsound/sound_output.hpp | 5 + apps/openmw/mwsound/soundmanager.cpp | 2 +- 4 files changed, 198 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 3f9910038..45be36687 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -1,7 +1,11 @@ #include #include +#include #include "openal_output.hpp" +#include "sound_decoder.hpp" +#include "sound.hpp" + namespace MWSound { @@ -9,6 +13,176 @@ namespace MWSound static void fail(const std::string &msg) { throw std::runtime_error("OpenAL exception: " + msg); } +static void throwALerror() +{ + ALenum err = alGetError(); + if(err != AL_NO_ERROR) + fail(alGetString(err)); +} + + +static ALenum getALFormat(Sound_Decoder::ChannelConfig chans, Sound_Decoder::SampleType type) +{ + if(chans == Sound_Decoder::MonoChannels) + { + if(type == Sound_Decoder::Int16Sample) + return AL_FORMAT_MONO16; + else if(type == Sound_Decoder::UInt8Sample) + return AL_FORMAT_MONO8; + else + fail("Unsupported sample type"); + } + else if(chans == Sound_Decoder::StereoChannels) + { + if(type == Sound_Decoder::Int16Sample) + return AL_FORMAT_STEREO16; + else if(type == Sound_Decoder::UInt8Sample) + return AL_FORMAT_STEREO8; + else + fail("Unsupported sample type"); + } + else + fail("Unsupported channel config"); + return AL_NONE; +} + + +class OpenAL_SoundStream : public Sound +{ + // This should be something sane, like 4, but currently cell loads tend to + // cause the stream to underrun + static const ALuint NumBuffers = 150; + static const ALuint BufferSize = 32768; + + ALuint Source; + ALuint Buffers[NumBuffers]; + + ALenum Format; + ALsizei SampleRate; + + std::auto_ptr Decoder; + +public: + OpenAL_SoundStream(std::auto_ptr decoder) : Decoder(decoder) + { + throwALerror(); + + alGenSources(1, &Source); + throwALerror(); + try + { + alGenBuffers(NumBuffers, Buffers); + throwALerror(); + } + catch(std::exception &e) + { + alDeleteSources(1, &Source); + alGetError(); + throw; + } + + try + { + int srate; + enum Sound_Decoder::ChannelConfig chans; + enum Sound_Decoder::SampleType type; + + Decoder->GetInfo(&srate, &chans, &type); + Format = getALFormat(chans, type); + SampleRate = srate; + } + catch(std::exception &e) + { + alDeleteSources(1, &Source); + alDeleteBuffers(NumBuffers, Buffers); + alGetError(); + throw; + } + } + virtual ~OpenAL_SoundStream() + { + alDeleteSources(1, &Source); + alDeleteBuffers(NumBuffers, Buffers); + alGetError(); + Decoder->Close(); + } + + virtual bool Play() + { + std::vector data(BufferSize); + + alSourceStop(Source); + alSourcei(Source, AL_BUFFER, 0); + throwALerror(); + + for(ALuint i = 0;i < NumBuffers;i++) + { + size_t got; + got = Decoder->Read(&data[0], data.size()); + alBufferData(Buffers[i], Format, &data[0], got, SampleRate); + } + throwALerror(); + + alSourceQueueBuffers(Source, NumBuffers, Buffers); + alSourcePlay(Source); + throwALerror(); + + return true; + } + + virtual void Stop() + { + alSourceStop(Source); + alSourcei(Source, AL_BUFFER, 0); + throwALerror(); + // FIXME: Rewind decoder + } + + virtual bool isPlaying() + { + ALint processed, state; + + alGetSourcei(Source, AL_SOURCE_STATE, &state); + alGetSourcei(Source, AL_BUFFERS_PROCESSED, &processed); + throwALerror(); + + if(processed > 0) + { + std::vector data(BufferSize); + do { + ALuint bufid; + size_t got; + + alSourceUnqueueBuffers(Source, 1, &bufid); + processed--; + + got = Decoder->Read(&data[0], data.size()); + if(got > 0) + { + alBufferData(bufid, Format, &data[0], got, SampleRate); + alSourceQueueBuffers(Source, 1, &bufid); + } + } while(processed > 0); + throwALerror(); + } + + if(state != AL_PLAYING && state != AL_PAUSED) + { + ALint queued; + + alGetSourcei(Source, AL_BUFFERS_QUEUED, &queued); + throwALerror(); + if(queued == 0) + return false; + + alSourcePlay(Source); + throwALerror(); + } + + return true; + } +}; + bool OpenAL_Output::Initialize(const std::string &devname) { @@ -50,6 +224,20 @@ void OpenAL_Output::Deinitialize() } +Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr decoder) +{ + std::auto_ptr sound; + + if(!decoder->Open(fname)) + return NULL; + + sound.reset(new OpenAL_SoundStream(decoder)); + sound->Play(); + + return sound.release(); +} + + OpenAL_Output::OpenAL_Output(SoundManager &mgr) : Sound_Output(mgr), Device(0), Context(0) { diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index d5748ee30..b0cd469e5 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -11,6 +11,8 @@ namespace MWSound { class SoundManager; + class Sound_Decoder; + class Sound; class OpenAL_Output : public Sound_Output { @@ -20,6 +22,8 @@ namespace MWSound virtual bool Initialize(const std::string &devname=""); virtual void Deinitialize(); + virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder); + OpenAL_Output(SoundManager &mgr); virtual ~OpenAL_Output(); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index b36a4e89f..16639de7b 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -2,10 +2,13 @@ #define GAME_SOUND_SOUND_OUTPUT_H #include +#include namespace MWSound { class SoundManager; + class Sound_Decoder; + class Sound; class Sound_Output { @@ -14,6 +17,8 @@ namespace MWSound virtual bool Initialize(const std::string &devname="") = 0; virtual void Deinitialize() = 0; + virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder) = 0; + Sound_Output(SoundManager &mgr) : mgr(mgr) { } public: virtual ~Sound_Output() { } diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index d231f1d4a..9ba5479d7 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -155,7 +155,7 @@ namespace MWSound if(mMusic) mMusic->Stop(); std::auto_ptr decoder(new DEFAULT_DECODER); - //mMusic.reset(Output->StreamSound(filename, decoder)); + mMusic.reset(Output->StreamSound(filename, decoder)); } void SoundManager::streamMusic(const std::string& filename) From 207d7dd89e66d5eccc4f2b62a2288148b1df5fbe Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 03:01:51 -0700 Subject: [PATCH 068/586] Stop and delete the current music before deleting the sound output --- apps/openmw/mwsound/soundmanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 9ba5479d7..8b8ffcedc 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -76,6 +76,9 @@ namespace MWSound SoundManager::~SoundManager() { + if(mMusic) + mMusic->Stop(); + mMusic.reset(); Output.reset(); } From 2f6b73d46149d08478d220d38073d389a673151d Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 03:06:35 -0700 Subject: [PATCH 069/586] Prevent streamMusic from throwing an exception --- apps/openmw/mwsound/soundmanager.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 8b8ffcedc..b215fd7c5 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -165,7 +165,16 @@ namespace MWSound { std::string filePath = mMusicLibrary.locate(filename, mFSStrict, true).string(); if(!filePath.empty()) - streamMusicFull(filePath); + { + try + { + streamMusicFull(filePath); + } + catch(std::exception &e) + { + std::cout << "Music Error: " << e.what() << "\n"; + } + } } void SoundManager::startRandomTitle() From 1b41987e184fc63576096ad0fbc608105049cc75 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 03:15:07 -0700 Subject: [PATCH 070/586] Move OpenAL_SoundStream function definitions out of the class --- apps/openmw/mwsound/openal_output.cpp | 196 ++++++++++++++------------ 1 file changed, 102 insertions(+), 94 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 45be36687..766fa018a 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -63,125 +63,133 @@ class OpenAL_SoundStream : public Sound std::auto_ptr Decoder; public: - OpenAL_SoundStream(std::auto_ptr decoder) : Decoder(decoder) + OpenAL_SoundStream(std::auto_ptr decoder); + virtual ~OpenAL_SoundStream(); + + virtual bool Play(); + virtual void Stop(); + virtual bool isPlaying(); +}; + +OpenAL_SoundStream::OpenAL_SoundStream(std::auto_ptr decoder) + : Decoder(decoder) +{ + throwALerror(); + + alGenSources(1, &Source); + throwALerror(); + try { + alGenBuffers(NumBuffers, Buffers); throwALerror(); + } + catch(std::exception &e) + { + alDeleteSources(1, &Source); + alGetError(); + throw; + } - alGenSources(1, &Source); - throwALerror(); - try - { - alGenBuffers(NumBuffers, Buffers); - throwALerror(); - } - catch(std::exception &e) - { - alDeleteSources(1, &Source); - alGetError(); - throw; - } - - try - { - int srate; - enum Sound_Decoder::ChannelConfig chans; - enum Sound_Decoder::SampleType type; - - Decoder->GetInfo(&srate, &chans, &type); - Format = getALFormat(chans, type); - SampleRate = srate; - } - catch(std::exception &e) - { - alDeleteSources(1, &Source); - alDeleteBuffers(NumBuffers, Buffers); - alGetError(); - throw; - } + try + { + int srate; + Sound_Decoder::ChannelConfig chans; + Sound_Decoder::SampleType type; + + Decoder->GetInfo(&srate, &chans, &type); + Format = getALFormat(chans, type); + SampleRate = srate; } - virtual ~OpenAL_SoundStream() + catch(std::exception &e) { alDeleteSources(1, &Source); alDeleteBuffers(NumBuffers, Buffers); alGetError(); - Decoder->Close(); + throw; } +} +OpenAL_SoundStream::~OpenAL_SoundStream() +{ + alDeleteSources(1, &Source); + alDeleteBuffers(NumBuffers, Buffers); + alGetError(); + Decoder->Close(); +} + +bool OpenAL_SoundStream::Play() +{ + std::vector data(BufferSize); - virtual bool Play() + alSourceStop(Source); + alSourcei(Source, AL_BUFFER, 0); + throwALerror(); + + for(ALuint i = 0;i < NumBuffers;i++) { - std::vector data(BufferSize); + size_t got; + got = Decoder->Read(&data[0], data.size()); + alBufferData(Buffers[i], Format, &data[0], got, SampleRate); + } + throwALerror(); - alSourceStop(Source); - alSourcei(Source, AL_BUFFER, 0); - throwALerror(); + alSourceQueueBuffers(Source, NumBuffers, Buffers); + alSourcePlay(Source); + throwALerror(); - for(ALuint i = 0;i < NumBuffers;i++) - { - size_t got; - got = Decoder->Read(&data[0], data.size()); - alBufferData(Buffers[i], Format, &data[0], got, SampleRate); - } - throwALerror(); + return true; +} - alSourceQueueBuffers(Source, NumBuffers, Buffers); - alSourcePlay(Source); - throwALerror(); +void OpenAL_SoundStream::Stop() +{ + alSourceStop(Source); + alSourcei(Source, AL_BUFFER, 0); + throwALerror(); + // FIXME: Rewind decoder +} - return true; - } +bool OpenAL_SoundStream::isPlaying() +{ + ALint processed, state; + + alGetSourcei(Source, AL_SOURCE_STATE, &state); + alGetSourcei(Source, AL_BUFFERS_PROCESSED, &processed); + throwALerror(); - virtual void Stop() + if(processed > 0) { - alSourceStop(Source); - alSourcei(Source, AL_BUFFER, 0); + std::vector data(BufferSize); + do { + ALuint bufid; + size_t got; + + alSourceUnqueueBuffers(Source, 1, &bufid); + processed--; + + got = Decoder->Read(&data[0], data.size()); + if(got > 0) + { + alBufferData(bufid, Format, &data[0], got, SampleRate); + alSourceQueueBuffers(Source, 1, &bufid); + } + } while(processed > 0); throwALerror(); - // FIXME: Rewind decoder } - virtual bool isPlaying() + if(state != AL_PLAYING && state != AL_PAUSED) { - ALint processed, state; + ALint queued; - alGetSourcei(Source, AL_SOURCE_STATE, &state); - alGetSourcei(Source, AL_BUFFERS_PROCESSED, &processed); + alGetSourcei(Source, AL_BUFFERS_QUEUED, &queued); throwALerror(); + if(queued == 0) + return false; - if(processed > 0) - { - std::vector data(BufferSize); - do { - ALuint bufid; - size_t got; - - alSourceUnqueueBuffers(Source, 1, &bufid); - processed--; - - got = Decoder->Read(&data[0], data.size()); - if(got > 0) - { - alBufferData(bufid, Format, &data[0], got, SampleRate); - alSourceQueueBuffers(Source, 1, &bufid); - } - } while(processed > 0); - throwALerror(); - } - - if(state != AL_PLAYING && state != AL_PAUSED) - { - ALint queued; - - alGetSourcei(Source, AL_BUFFERS_QUEUED, &queued); - throwALerror(); - if(queued == 0) - return false; - - alSourcePlay(Source); - throwALerror(); - } - - return true; + alSourcePlay(Source); + throwALerror(); } -}; + + return true; +} bool OpenAL_Output::Initialize(const std::string &devname) From caf5d71d44b8bb0382842b56b65148cde4baa8d1 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 03:18:28 -0700 Subject: [PATCH 071/586] Make the sound decoder's Open method return void Errors are thrown, not returned --- apps/openmw/mwsound/ffmpeg_decoder.cpp | 3 +-- apps/openmw/mwsound/ffmpeg_decoder.hpp | 2 +- apps/openmw/mwsound/mpgsnd_decoder.cpp | 7 +++---- apps/openmw/mwsound/mpgsnd_decoder.hpp | 2 +- apps/openmw/mwsound/openal_output.cpp | 3 +-- apps/openmw/mwsound/sound_decoder.hpp | 2 +- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp index d3715d5fe..5c64e4dd1 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.cpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp @@ -9,10 +9,9 @@ namespace MWSound static void fail(const std::string &msg) { throw std::runtime_error("FFmpeg exception: "+msg); } -bool FFmpeg_Decoder::Open(const std::string &fname) +void FFmpeg_Decoder::Open(const std::string &fname) { fail("Not currently working"); - return false; } void FFmpeg_Decoder::Close() diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp index 6ff93904a..205fe8865 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.hpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp @@ -16,7 +16,7 @@ namespace MWSound { class FFmpeg_Decoder : public Sound_Decoder { - virtual bool Open(const std::string &fname); + virtual void Open(const std::string &fname); virtual void Close(); virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type); diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp index 4ba48f607..2c35adeb3 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.cpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -12,7 +12,7 @@ static void fail(const std::string &msg) namespace MWSound { -bool MpgSnd_Decoder::Open(const std::string &fname) +void MpgSnd_Decoder::Open(const std::string &fname) { Close(); @@ -31,7 +31,7 @@ bool MpgSnd_Decoder::Open(const std::string &fname) fail("Unsupported channel count in "+fname); } sampleRate = info.samplerate; - return true; + return; } mpgFile = mpg123_new(NULL, NULL); @@ -49,7 +49,7 @@ bool MpgSnd_Decoder::Open(const std::string &fname) fail("Unsupported channel count in "+fname); chanConfig = ((channels==2)?StereoChannels:MonoChannels); sampleRate = rate; - return true; + return; } catch(std::exception &e) { @@ -64,7 +64,6 @@ bool MpgSnd_Decoder::Open(const std::string &fname) mpgFile = NULL; fail("Unsupported file type: "+fname); - return false; } void MpgSnd_Decoder::Close() diff --git a/apps/openmw/mwsound/mpgsnd_decoder.hpp b/apps/openmw/mwsound/mpgsnd_decoder.hpp index 641d891a3..391cfbd6d 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.hpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.hpp @@ -19,7 +19,7 @@ namespace MWSound ChannelConfig chanConfig; int sampleRate; - virtual bool Open(const std::string &fname); + virtual void Open(const std::string &fname); virtual void Close(); virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type); diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 766fa018a..7668dcac2 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -236,8 +236,7 @@ Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr sound; - if(!decoder->Open(fname)) - return NULL; + decoder->Open(fname); sound.reset(new OpenAL_SoundStream(decoder)); sound->Play(); diff --git a/apps/openmw/mwsound/sound_decoder.hpp b/apps/openmw/mwsound/sound_decoder.hpp index fd8f4ac51..4f778c3b3 100644 --- a/apps/openmw/mwsound/sound_decoder.hpp +++ b/apps/openmw/mwsound/sound_decoder.hpp @@ -14,7 +14,7 @@ namespace MWSound MonoChannels, StereoChannels }; - virtual bool Open(const std::string &fname) = 0; + virtual void Open(const std::string &fname) = 0; virtual void Close() = 0; virtual void GetInfo(int *samplerate, ChannelConfig *chans, SampleType *type) = 0; From 2429755bf1daa4ddad0cae74171cf5ef41c71703 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 03:20:43 -0700 Subject: [PATCH 072/586] Make the sound's Play method return void --- apps/openmw/mwsound/openal_output.cpp | 6 ++---- apps/openmw/mwsound/sound.hpp | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 7668dcac2..246fce7e1 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -66,7 +66,7 @@ public: OpenAL_SoundStream(std::auto_ptr decoder); virtual ~OpenAL_SoundStream(); - virtual bool Play(); + virtual void Play(); virtual void Stop(); virtual bool isPlaying(); }; @@ -116,7 +116,7 @@ OpenAL_SoundStream::~OpenAL_SoundStream() Decoder->Close(); } -bool OpenAL_SoundStream::Play() +void OpenAL_SoundStream::Play() { std::vector data(BufferSize); @@ -135,8 +135,6 @@ bool OpenAL_SoundStream::Play() alSourceQueueBuffers(Source, NumBuffers, Buffers); alSourcePlay(Source); throwALerror(); - - return true; } void OpenAL_SoundStream::Stop() diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp index 9d262416e..5ffb48820 100644 --- a/apps/openmw/mwsound/sound.hpp +++ b/apps/openmw/mwsound/sound.hpp @@ -7,7 +7,7 @@ namespace MWSound { class Sound { - virtual bool Play() = 0; + virtual void Play() = 0; virtual void Stop() = 0; virtual bool isPlaying() = 0; From 2dabdcb9e551a97ff9d2d67a344cc66ffbf7117a Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 04:22:54 -0700 Subject: [PATCH 073/586] Add a function to update the sound listener --- apps/openmw/mwsound/openal_output.cpp | 12 ++++++++++++ apps/openmw/mwsound/openal_output.hpp | 2 ++ apps/openmw/mwsound/sound_output.hpp | 3 +++ 3 files changed, 17 insertions(+) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 246fce7e1..1a02dc258 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -243,6 +243,18 @@ Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr decoder); + virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]); + OpenAL_Output(SoundManager &mgr); virtual ~OpenAL_Output(); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index 16639de7b..a8a91cca1 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -19,6 +19,9 @@ namespace MWSound virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder) = 0; + // FIXME: This should take an MWWorld::Ptr that represents the in-world camera + virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]) = 0; + Sound_Output(SoundManager &mgr) : mgr(mgr) { } public: virtual ~Sound_Output() { } From 5e939e4818b987f12ee27be8b4ab980446374070 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 17 Mar 2012 13:59:51 +0100 Subject: [PATCH 074/586] map window now works for interiors --- apps/openmw/mwgui/layouts.hpp | 4 +- apps/openmw/mwgui/window_manager.cpp | 5 ++ apps/openmw/mwgui/window_manager.hpp | 3 + apps/openmw/mwrender/localmap.cpp | 68 +++-------------------- apps/openmw/mwrender/localmap.hpp | 8 ++- apps/openmw/mwrender/renderingmanager.cpp | 2 +- 6 files changed, 26 insertions(+), 64 deletions(-) diff --git a/apps/openmw/mwgui/layouts.hpp b/apps/openmw/mwgui/layouts.hpp index 7b7c84225..9cf22685a 100644 --- a/apps/openmw/mwgui/layouts.hpp +++ b/apps/openmw/mwgui/layouts.hpp @@ -84,7 +84,7 @@ namespace MWGui mPrefix = prefix; } - void setActiveCell(const int x, const int y) + void setActiveCell(const int x, const int y, bool interior=false) { for (int mx=0; mx<3; ++mx) { @@ -94,7 +94,7 @@ namespace MWGui + boost::lexical_cast(my); std::string image = mPrefix+"_"+ boost::lexical_cast(x + (mx-1)) + "_" - + boost::lexical_cast(y - (my-1)); + + boost::lexical_cast(y + (interior ? (my-1) : -1*(my-1))); setImage(name, image); setImage(name+"_fog", image+"_fog"); } diff --git a/apps/openmw/mwgui/window_manager.cpp b/apps/openmw/mwgui/window_manager.cpp index 014aa8108..c8c518a93 100644 --- a/apps/openmw/mwgui/window_manager.cpp +++ b/apps/openmw/mwgui/window_manager.cpp @@ -420,3 +420,8 @@ void WindowManager::changeCell(MWWorld::Ptr::CellStore* cell) } } + +void WindowManager::setInteriorMapTexture(const int x, const int y) +{ + map->setActiveCell(x,y, true); +} diff --git a/apps/openmw/mwgui/window_manager.hpp b/apps/openmw/mwgui/window_manager.hpp index c867fedbe..0345cb99d 100644 --- a/apps/openmw/mwgui/window_manager.hpp +++ b/apps/openmw/mwgui/window_manager.hpp @@ -152,6 +152,9 @@ namespace MWGui void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty void changeCell(MWWorld::Ptr::CellStore* cell); ///< change the active cell + + void setInteriorMapTexture(const int x, const int y); + ///< set the index of the map texture that should be used (for interiors) template void removeDialog(T*& dialog); ///< Casts to OEngine::GUI::Layout and calls removeDialog, then resets pointer to nullptr. diff --git a/apps/openmw/mwrender/localmap.cpp b/apps/openmw/mwrender/localmap.cpp index ee5413cab..d4a25750f 100644 --- a/apps/openmw/mwrender/localmap.cpp +++ b/apps/openmw/mwrender/localmap.cpp @@ -1,6 +1,9 @@ #include "localmap.hpp" #include "renderingmanager.hpp" +#include "../mwworld/environment.hpp" +#include "../mwgui/window_manager.hpp" + #include #include @@ -19,61 +22,16 @@ using namespace Ogre; // size of a map segment (for exterior regions, this equals 1 cell) #define SIZE 8192.f -LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend) +LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend, MWWorld::Environment* env) { mRendering = rend; - + mEnvironment = env; + mCellCamera = mRendering->getScene()->createCamera("CellCamera"); mCellCamera->setProjectionType(PT_ORTHOGRAPHIC); // look down -y const float sqrt0pt5 = 0.707106781; mCellCamera->setOrientation(Quaternion(sqrt0pt5, -sqrt0pt5, 0, 0)); - - // Debug overlay to view the maps - - render(0, 0, 10000, 10000, SIZE, SIZE, "Cell_0_0_"); - - MaterialPtr mat = MaterialManager::getSingleton().create("testMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); - mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); - mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); - mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); - - mat = MaterialManager::getSingleton().create("testMaterial2", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - mat->getTechnique(0)->getPass(0)->createTextureUnitState("Cell_0_0_"); - mat->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); - mat->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); - mat->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); - - OverlayManager& ovm = OverlayManager::getSingleton(); - - Overlay* mOverlay = ovm.create( "testOverlay" ); - mOverlay->setZOrder(0); - OverlayContainer* overlay_panel; - overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel"); - - overlay_panel->_setPosition(0, 0); - overlay_panel->_setDimensions(0.5, 0.5); - - overlay_panel->setMaterialName( "testMaterial" ); - overlay_panel->show(); - mOverlay->add2D(overlay_panel); - //mOverlay->show(); - - Overlay* mOverlay2 = ovm.create( "testOverlay2" ); - mOverlay2->setZOrder(1); - OverlayContainer* overlay_panel2; - overlay_panel2 = (OverlayContainer*)ovm.createOverlayElement("Panel", "testPanel2"); - - overlay_panel2->_setPosition(0, 0); - overlay_panel2->_setDimensions(0.5, 0.5); - - overlay_panel2->setMaterialName( "testMaterial2" ); - overlay_panel2->show(); - mOverlay2->add2D(overlay_panel2); - - //mOverlay2->show(); - } LocalMap::~LocalMap() @@ -304,6 +262,8 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) x = std::ceil((pos.x - min.x)/SIZE)-1; y = std::ceil((pos.y - min.y)/SIZE)-1; + + mEnvironment->mWindowManager->setInteriorMapTexture(x,y); } // convert from world coordinates to texture UV coordinates @@ -355,17 +315,5 @@ void LocalMap::setPlayerPosition (const Ogre::Vector3& position) // copy to the texture memcpy(tex->getBuffer()->lock(HardwareBuffer::HBL_DISCARD), buffer, FOGOFWAR_RESOLUTION*FOGOFWAR_RESOLUTION*4); tex->getBuffer()->unlock(); - - if (!MaterialManager::getSingleton().getByName("testMaterial").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(texName); - } - if (!MaterialManager::getSingleton().getByName("testMaterial2").isNull()) - { - MaterialPtr mat = MaterialManager::getSingleton().getByName("testMaterial2"); - mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(tex->getName()); - } - } } diff --git a/apps/openmw/mwrender/localmap.hpp b/apps/openmw/mwrender/localmap.hpp index 9e06200c1..fd5d4770b 100644 --- a/apps/openmw/mwrender/localmap.hpp +++ b/apps/openmw/mwrender/localmap.hpp @@ -5,6 +5,11 @@ #include +namespace MWWorld +{ + class Environment; +} + namespace MWRender { /// @@ -13,7 +18,7 @@ namespace MWRender class LocalMap { public: - LocalMap(OEngine::Render::OgreRenderer*); + LocalMap(OEngine::Render::OgreRenderer*, MWWorld::Environment* env); ~LocalMap(); /** @@ -52,6 +57,7 @@ namespace MWRender private: OEngine::Render::OgreRenderer* mRendering; + MWWorld::Environment* mEnvironment; Ogre::Camera* mCellCamera; diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index f83e16717..e25a6a7a0 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -56,7 +56,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; - mLocalMap = new MWRender::LocalMap(&mRendering); + mLocalMap = new MWRender::LocalMap(&mRendering, &environment); } RenderingManager::~RenderingManager () From a46f8ced05c519a6d6b921ae3eb1ca12385c6583 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 06:18:59 -0700 Subject: [PATCH 075/586] Keep the sound output's listener updated with the camera position --- apps/openmw/mwsound/openal_output.cpp | 7 ++----- apps/openmw/mwsound/soundmanager.cpp | 23 ++++++++++++++++++++++- apps/openmw/mwsound/soundmanager.hpp | 1 + 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 1a02dc258..2dbe4baad 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -245,11 +245,8 @@ Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptrgetPlayer().getPlayer().getCell(); static int total = 0; @@ -363,4 +363,25 @@ namespace MWSound pos += chance; } } + + void SoundManager::update(float duration) + { + static float timePassed = 0.0; + + timePassed += duration; + if(timePassed > (1.0f/30.0f)) + { + timePassed = 0.0f; + Ogre::Camera *cam = mEnvironment.mWorld->getPlayer().getRenderer()->getCamera(); + + Ogre::Vector3 nPos, nDir, nUp; + nPos = cam->getRealPosition(); + nDir = cam->getRealDirection(); + nUp = cam->getRealUp(); + + Output->UpdateListener(&nPos[0], &nDir[0], &nUp[0]); + } + + updateRegionSound(duration); + } } diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 709ab2817..b31e1db7f 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -62,6 +62,7 @@ namespace MWSound bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; void removeCell(const MWWorld::Ptr::CellStore *cell); void updatePositions(MWWorld::Ptr ptr); + void updateRegionSound(float duration); public: SoundManager(Ogre::Root*, Ogre::Camera*, From 656863ec6e13ab9c73b66eca069de9c73a716608 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 06:51:44 -0700 Subject: [PATCH 076/586] Add functions to play sounds --- apps/openmw/mwsound/openal_output.cpp | 16 +++++++++++ apps/openmw/mwsound/openal_output.hpp | 6 ++++ apps/openmw/mwsound/sound_output.hpp | 7 +++++ apps/openmw/mwsound/soundmanager.cpp | 41 +++++++++++++++++++++------ 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 2dbe4baad..a183909d3 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -230,6 +230,22 @@ void OpenAL_Output::Deinitialize() } +Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr decoder, + float volume, float pitch, bool loop) +{ + fail("PlaySound not yet supported"); + return NULL; +} + +Sound* OpenAL_Output::PlaySound3D(const std::string &fname, std::auto_ptr decoder, + MWWorld::Ptr ptr, float volume, float pitch, + float min, float max, bool loop) +{ + fail("PlaySound3D not yet supported"); + return NULL; +} + + Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr decoder) { std::auto_ptr sound; diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index 6dd5a2c23..0ab8dd349 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -22,6 +22,12 @@ namespace MWSound virtual bool Initialize(const std::string &devname=""); virtual void Deinitialize(); + virtual Sound *PlaySound(const std::string &fname, std::auto_ptr decoder, + float volume, float pitch, bool loop); + virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, + MWWorld::Ptr ptr, float volume, float pitch, + float min, float max, bool loop); + virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder); virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index a8a91cca1..ba9809291 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -4,6 +4,8 @@ #include #include +#include "../mwworld/ptr.hpp" + namespace MWSound { class SoundManager; @@ -17,6 +19,11 @@ namespace MWSound virtual bool Initialize(const std::string &devname="") = 0; virtual void Deinitialize() = 0; + virtual Sound *PlaySound(const std::string &fname, std::auto_ptr decoder, + float volume, float pitch, bool loop) = 0; + virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, + MWWorld::Ptr ptr, float volume, float pitch, + float min, float max, bool loop) = 0; virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder) = 0; // FIXME: This should take an MWWorld::Ptr that represents the in-world camera diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 242755e95..b24a74868 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -120,7 +120,17 @@ namespace MWSound float min, float max, bool loop, bool untracked) { - //std::cout << "Cannot load " << file << ", skipping.\n"; + try + { + Sound *sound; + std::auto_ptr decoder(new DEFAULT_DECODER); + sound = Output->PlaySound3D(file, decoder, ptr, volume, pitch, min, max, loop); + delete sound; + } + catch(std::exception &e) + { + std::cout <<"Sound play error: "< decoder(new DEFAULT_DECODER); + sound = Output->PlaySound(file, decoder, volume, pitch, loop); + delete sound; + } + catch(std::exception &e) + { + std::cout <<"Sound play error: "< Date: Sat, 17 Mar 2012 08:02:46 -0700 Subject: [PATCH 077/586] Keep a handle on played sounds --- apps/openmw/mwsound/soundmanager.cpp | 56 ++++++++++++++++++++++++---- apps/openmw/mwsound/soundmanager.hpp | 8 +++- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index b24a74868..535dbe774 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -76,6 +76,8 @@ namespace MWSound SoundManager::~SoundManager() { + LooseSounds.clear(); + ActiveSounds.clear(); if(mMusic) mMusic->Stop(); mMusic.reset(); @@ -113,7 +115,7 @@ namespace MWSound } // Add a sound to the list and play it - void SoundManager::add(const std::string &file, + void SoundManager::play3d(const std::string &file, MWWorld::Ptr ptr, const std::string &id, float volume, float pitch, @@ -125,7 +127,10 @@ namespace MWSound Sound *sound; std::auto_ptr decoder(new DEFAULT_DECODER); sound = Output->PlaySound3D(file, decoder, ptr, volume, pitch, min, max, loop); - delete sound; + if(untracked) + LooseSounds[id] = SoundPtr(sound); + else + ActiveSounds[ptr][id] = SoundPtr(sound); } catch(std::exception &e) { @@ -137,6 +142,22 @@ namespace MWSound // remove the entire object and stop all its sounds. void SoundManager::remove(MWWorld::Ptr ptr, const std::string &id) { + SoundMap::iterator snditer = ActiveSounds.find(ptr); + if(snditer == ActiveSounds.end()) + return; + + if(!id.empty()) + { + IDMap::iterator iditer = snditer->second.find(id); + if(iditer != snditer->second.end()) + { + snditer->second.erase(iditer); + if(snditer->second.size() == 0) + ActiveSounds.erase(snditer); + } + } + else + ActiveSounds.erase(snditer); } bool SoundManager::isPlaying(MWWorld::Ptr ptr, const std::string &id) const @@ -149,6 +170,14 @@ namespace MWSound // Remove all references to objects belonging to a given cell void SoundManager::removeCell(const MWWorld::Ptr::CellStore *cell) { + SoundMap::iterator snditer = ActiveSounds.begin(); + while(snditer != ActiveSounds.end()) + { + if(snditer->first.getCell() == cell) + ActiveSounds.erase(snditer++); + else + snditer++; + } } void SoundManager::updatePositions(MWWorld::Ptr ptr) @@ -260,7 +289,7 @@ namespace MWSound // The range values are not tested std::string filePath = Files::FileListLocator(mSoundFiles, filename, mFSStrict, true); if(!filePath.empty()) - add(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false); + play3d(filePath, ptr, "_say_sound", 1, 1, 100, 20000, false); } bool SoundManager::sayDone(MWWorld::Ptr ptr) const @@ -280,7 +309,7 @@ namespace MWSound Sound *sound; std::auto_ptr decoder(new DEFAULT_DECODER); sound = Output->PlaySound(file, decoder, volume, pitch, loop); - delete sound; + LooseSounds[soundId] = SoundPtr(sound); } catch(std::exception &e) { @@ -298,7 +327,7 @@ namespace MWSound float min, max; std::string file = lookup(soundId, volume, min, max); if(!file.empty()) - add(file, ptr, soundId, volume, pitch, min, max, false); + play3d(file, ptr, soundId, volume, pitch, min, max, false); else std::cout << "Sound file " << soundId << " not found, skipping.\n"; } @@ -315,6 +344,9 @@ namespace MWSound void SoundManager::stopSound(const std::string& soundId) { + IDMap::iterator iditer = LooseSounds.find(soundId); + if(iditer != LooseSounds.end()) + LooseSounds.erase(iditer); } bool SoundManager::getSoundPlaying(MWWorld::Ptr ptr, const std::string& soundId) const @@ -382,7 +414,7 @@ namespace MWSound { //play sound std::cout << "Sound: " << go <<" Chance:" << chance << "\n"; - playSound(go, 20.0, 1.0); + playSound(go, 1.0f, 1.0f); break; } pos += chance; @@ -397,14 +429,24 @@ namespace MWSound if(timePassed > (1.0f/30.0f)) { timePassed = 0.0f; - Ogre::Camera *cam = mEnvironment.mWorld->getPlayer().getRenderer()->getCamera(); + Ogre::Camera *cam = mEnvironment.mWorld->getPlayer().getRenderer()->getCamera(); Ogre::Vector3 nPos, nDir, nUp; nPos = cam->getRealPosition(); nDir = cam->getRealDirection(); nUp = cam->getRealUp(); Output->UpdateListener(&nPos[0], &nDir[0], &nUp[0]); + + + IDMap::iterator snditer = LooseSounds.begin(); + while(snditer != LooseSounds.end()) + { + if(!snditer->second->isPlaying()) + LooseSounds.erase(snditer++); + else + snditer++; + } } updateRegionSound(duration); diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index b31e1db7f..7b103dbad 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -52,9 +52,15 @@ namespace MWSound // Points to the current playlist of music files stored in the music library const Files::PathContainer* mCurrentPlaylist; + typedef boost::shared_ptr SoundPtr; + typedef std::map IDMap; + typedef std::map SoundMap; + SoundMap ActiveSounds; + IDMap LooseSounds; + std::string lookup(const std::string &soundId, float &volume, float &min, float &max); - void add(const std::string &file, + void play3d(const std::string &file, MWWorld::Ptr ptr, const std::string &id, float volume, float pitch, float min, float max, bool loop, bool untracked=false); From d57051375dda480be65fbc5127b4d4433d99e0e1 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:15:47 -0700 Subject: [PATCH 078/586] Implement non-streaming sounds with OpenAL --- apps/openmw/mwsound/openal_output.cpp | 166 +++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index a183909d3..ac639416f 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -47,6 +47,32 @@ static ALenum getALFormat(Sound_Decoder::ChannelConfig chans, Sound_Decoder::Sam } +ALuint LoadBuffer(std::auto_ptr decoder) +{ + int srate; + Sound_Decoder::ChannelConfig chans; + Sound_Decoder::SampleType type; + ALenum format; + + decoder->GetInfo(&srate, &chans, &type); + format = getALFormat(chans, type); + + std::vector data(32768); + size_t got, total = 0; + while((got=decoder->Read(&data[total], data.size()-total)) > 0) + { + total += got; + data.resize(total*2); + } + data.resize(total); + + ALuint buf; + alGenBuffers(1, &buf); + alBufferData(buf, format, &data[0], total, srate); + return buf; +} + + class OpenAL_SoundStream : public Sound { // This should be something sane, like 4, but currently cell loads tend to @@ -71,6 +97,21 @@ public: virtual bool isPlaying(); }; +class OpenAL_Sound : public Sound +{ +public: + ALuint Source; + ALuint Buffer; + + OpenAL_Sound(ALuint src, ALuint buf); + virtual ~OpenAL_Sound(); + + virtual void Play(); + virtual void Stop(); + virtual bool isPlaying(); +}; + + OpenAL_SoundStream::OpenAL_SoundStream(std::auto_ptr decoder) : Decoder(decoder) { @@ -190,6 +231,38 @@ bool OpenAL_SoundStream::isPlaying() } +OpenAL_Sound::OpenAL_Sound(ALuint src, ALuint buf) + : Source(src), Buffer(buf) +{ +} +OpenAL_Sound::~OpenAL_Sound() +{ + alDeleteSources(1, &Source); + alDeleteBuffers(1, &Buffer); + alGetError(); +} + +void OpenAL_Sound::Play() +{ +} + +void OpenAL_Sound::Stop() +{ + alSourceStop(Source); + throwALerror(); +} + +bool OpenAL_Sound::isPlaying() +{ + ALint state; + + alGetSourcei(Source, AL_SOURCE_STATE, &state); + throwALerror(); + + return state==AL_PLAYING; +} + + bool OpenAL_Output::Initialize(const std::string &devname) { if(Context) @@ -233,16 +306,97 @@ void OpenAL_Output::Deinitialize() Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch, bool loop) { - fail("PlaySound not yet supported"); - return NULL; + throwALerror(); + + decoder->Open(fname); + + ALuint src=0, buf=0; + try + { + buf = LoadBuffer(decoder); + alGenSources(1, &src); + throwALerror(); + } + catch(std::exception &e) + { + if(alIsSource(buf)) + alDeleteSources(1, &src); + if(alIsBuffer(buf)) + alDeleteBuffers(1, &buf); + alGetError(); + throw; + } + + std::auto_ptr sound(new OpenAL_Sound(src, buf)); + alSource3f(src, AL_POSITION, 0.0f, 0.0f, 0.0f); + alSource3f(src, AL_DIRECTION, 0.0f, 0.0f, 0.0f); + alSource3f(src, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + + alSourcef(src, AL_REFERENCE_DISTANCE, 1.0f); + alSourcef(src, AL_MAX_DISTANCE, 1000.0f); + alSourcef(src, AL_ROLLOFF_FACTOR, 0.0f); + + alSourcef(src, AL_GAIN, volume); + alSourcef(src, AL_PITCH, pitch); + + alSourcei(src, AL_SOURCE_RELATIVE, AL_TRUE); + alSourcei(src, AL_LOOPING, (loop?AL_TRUE:AL_FALSE)); + throwALerror(); + + alSourcei(src, AL_BUFFER, buf); + alSourcePlay(src); + throwALerror(); + + return sound.release(); } Sound* OpenAL_Output::PlaySound3D(const std::string &fname, std::auto_ptr decoder, - MWWorld::Ptr ptr, float volume, float pitch, - float min, float max, bool loop) + MWWorld::Ptr ptr, float volume, float pitch, + float min, float max, bool loop) { - fail("PlaySound3D not yet supported"); - return NULL; + throwALerror(); + + decoder->Open(fname); + + ALuint src=0, buf=0; + try + { + buf = LoadBuffer(decoder); + alGenSources(1, &src); + throwALerror(); + } + catch(std::exception &e) + { + if(alIsSource(buf)) + alDeleteSources(1, &src); + if(alIsBuffer(buf)) + alDeleteBuffers(1, &buf); + alGetError(); + throw; + } + + std::auto_ptr sound(new OpenAL_Sound(src, buf)); + const float *pos = ptr.getCellRef().pos.pos; + alSource3f(src, AL_POSITION, pos[0], pos[2], -pos[1]); + alSource3f(src, AL_DIRECTION, 0.0f, 0.0f, 0.0f); + alSource3f(src, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + + alSourcef(src, AL_REFERENCE_DISTANCE, min); + alSourcef(src, AL_MAX_DISTANCE, max); + alSourcef(src, AL_ROLLOFF_FACTOR, 1.0f); + + alSourcef(src, AL_GAIN, volume); + alSourcef(src, AL_PITCH, pitch); + + alSourcei(src, AL_SOURCE_RELATIVE, AL_FALSE); + alSourcei(src, AL_LOOPING, (loop?AL_TRUE:AL_FALSE)); + throwALerror(); + + alSourcei(src, AL_BUFFER, buf); + alSourcePlay(src); + throwALerror(); + + return sound.release(); } From e49a090af787faf4115f0dece1a4aee7dd0bb70d Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:16:09 -0700 Subject: [PATCH 079/586] Remove unnecessary hack --- apps/openmw/mwsound/soundmanager.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 535dbe774..796c490d9 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -162,9 +162,15 @@ namespace MWSound bool SoundManager::isPlaying(MWWorld::Ptr ptr, const std::string &id) const { - // HACK: Return true to prevent the engine from trying to keep playing - // sounds and tanking the framerate. - return true; + SoundMap::const_iterator snditer = ActiveSounds.find(ptr); + if(snditer == ActiveSounds.end()) + return false; + + IDMap::const_iterator iditer = snditer->second.find(id); + if(iditer == snditer->second.end()) + return false; + + return iditer->second->isPlaying(); } // Remove all references to objects belonging to a given cell From cac07d0fbf5035f47dbeb4d8ed7fa64dac615394 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:27:31 -0700 Subject: [PATCH 080/586] Remove some unnecessary methods --- apps/openmw/mwsound/openal_output.cpp | 7 +------ apps/openmw/mwsound/sound.hpp | 1 - apps/openmw/mwsound/soundmanager.cpp | 6 +----- apps/openmw/mwsound/soundmanager.hpp | 1 - 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index ac639416f..bf972512b 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -92,7 +92,7 @@ public: OpenAL_SoundStream(std::auto_ptr decoder); virtual ~OpenAL_SoundStream(); - virtual void Play(); + void Play(); virtual void Stop(); virtual bool isPlaying(); }; @@ -106,7 +106,6 @@ public: OpenAL_Sound(ALuint src, ALuint buf); virtual ~OpenAL_Sound(); - virtual void Play(); virtual void Stop(); virtual bool isPlaying(); }; @@ -242,10 +241,6 @@ OpenAL_Sound::~OpenAL_Sound() alGetError(); } -void OpenAL_Sound::Play() -{ -} - void OpenAL_Sound::Stop() { alSourceStop(Source); diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp index 5ffb48820..5fb996e28 100644 --- a/apps/openmw/mwsound/sound.hpp +++ b/apps/openmw/mwsound/sound.hpp @@ -7,7 +7,6 @@ namespace MWSound { class Sound { - virtual void Play() = 0; virtual void Stop() = 0; virtual bool isPlaying() = 0; diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 796c490d9..b1caf7ff3 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -186,10 +186,6 @@ namespace MWSound } } - void SoundManager::updatePositions(MWWorld::Ptr ptr) - { - } - void SoundManager::stopMusic() { if(mMusic) @@ -365,7 +361,7 @@ namespace MWSound void SoundManager::updateObject(MWWorld::Ptr ptr) { - updatePositions(ptr); + // FIXME: Update tracked sounds that are using this ptr } void SoundManager::updateRegionSound(float duration) diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 7b103dbad..df7e696da 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -67,7 +67,6 @@ namespace MWSound void remove(MWWorld::Ptr ptr, const std::string &id = ""); bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; void removeCell(const MWWorld::Ptr::CellStore *cell); - void updatePositions(MWWorld::Ptr ptr); void updateRegionSound(float duration); public: From 979ae89aab8dadde4efff46e5a01e91436665fa7 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:37:41 -0700 Subject: [PATCH 081/586] Pass volume and pitch parameters to streamed sounds --- apps/openmw/mwsound/openal_output.cpp | 10 ++++++---- apps/openmw/mwsound/openal_output.hpp | 3 ++- apps/openmw/mwsound/sound_output.hpp | 3 ++- apps/openmw/mwsound/soundmanager.cpp | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index bf972512b..9131bbe29 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -92,7 +92,7 @@ public: OpenAL_SoundStream(std::auto_ptr decoder); virtual ~OpenAL_SoundStream(); - void Play(); + void Play(float volume, float pitch); virtual void Stop(); virtual bool isPlaying(); }; @@ -156,12 +156,14 @@ OpenAL_SoundStream::~OpenAL_SoundStream() Decoder->Close(); } -void OpenAL_SoundStream::Play() +void OpenAL_SoundStream::Play(float volume, float pitch) { std::vector data(BufferSize); alSourceStop(Source); alSourcei(Source, AL_BUFFER, 0); + alSourcef(Source, AL_GAIN, volume); + alSourcef(Source, AL_PITCH, pitch); throwALerror(); for(ALuint i = 0;i < NumBuffers;i++) @@ -395,14 +397,14 @@ Sound* OpenAL_Output::PlaySound3D(const std::string &fname, std::auto_ptr decoder) +Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch) { std::auto_ptr sound; decoder->Open(fname); sound.reset(new OpenAL_SoundStream(decoder)); - sound->Play(); + sound->Play(volume, pitch); return sound.release(); } diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index 0ab8dd349..65fe89c9e 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -28,7 +28,8 @@ namespace MWSound MWWorld::Ptr ptr, float volume, float pitch, float min, float max, bool loop); - virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder); + virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, + float volume, float pitch); virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index ba9809291..9c8d0303b 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -24,7 +24,8 @@ namespace MWSound virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, MWWorld::Ptr ptr, float volume, float pitch, float min, float max, bool loop) = 0; - virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder) = 0; + virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, + float volume, float pitch) = 0; // FIXME: This should take an MWWorld::Ptr that represents the in-world camera virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]) = 0; diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index b1caf7ff3..cab179f61 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -199,7 +199,7 @@ namespace MWSound if(mMusic) mMusic->Stop(); std::auto_ptr decoder(new DEFAULT_DECODER); - mMusic.reset(Output->StreamSound(filename, decoder)); + mMusic.reset(Output->StreamSound(filename, decoder, 0.4f, 1.0f)); } void SoundManager::streamMusic(const std::string& filename) From 5563f583ff6821337ae49c385986c84730925c6f Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:51:03 -0700 Subject: [PATCH 082/586] Add and implement methods to update tracked sounds on an object --- apps/openmw/mwsound/openal_output.cpp | 20 ++++++++++++++++++++ apps/openmw/mwsound/sound.hpp | 3 +++ apps/openmw/mwsound/soundmanager.cpp | 14 ++++++++++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 9131bbe29..c460aeb29 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -95,6 +95,7 @@ public: void Play(float volume, float pitch); virtual void Stop(); virtual bool isPlaying(); + virtual void Update(MWWorld::Ptr ptr); }; class OpenAL_Sound : public Sound @@ -108,6 +109,7 @@ public: virtual void Stop(); virtual bool isPlaying(); + virtual void Update(MWWorld::Ptr ptr); }; @@ -231,6 +233,15 @@ bool OpenAL_SoundStream::isPlaying() return true; } +void OpenAL_SoundStream::Update(MWWorld::Ptr ptr) +{ + const float *pos = ptr.getCellRef().pos.pos; + alSource3f(Source, AL_POSITION, pos[0], pos[2], -pos[1]); + alSource3f(Source, AL_DIRECTION, 0.0f, 0.0f, 0.0f); + alSource3f(Source, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + throwALerror(); +} + OpenAL_Sound::OpenAL_Sound(ALuint src, ALuint buf) : Source(src), Buffer(buf) @@ -259,6 +270,15 @@ bool OpenAL_Sound::isPlaying() return state==AL_PLAYING; } +void OpenAL_Sound::Update(MWWorld::Ptr ptr) +{ + const float *pos = ptr.getCellRef().pos.pos; + alSource3f(Source, AL_POSITION, pos[0], pos[2], -pos[1]); + alSource3f(Source, AL_DIRECTION, 0.0f, 0.0f, 0.0f); + alSource3f(Source, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + throwALerror(); +} + bool OpenAL_Output::Initialize(const std::string &devname) { diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp index 5fb996e28..99be9dfeb 100644 --- a/apps/openmw/mwsound/sound.hpp +++ b/apps/openmw/mwsound/sound.hpp @@ -3,12 +3,15 @@ #include +#include "../mwworld/ptr.hpp" + namespace MWSound { class Sound { virtual void Stop() = 0; virtual bool isPlaying() = 0; + virtual void Update(MWWorld::Ptr ptr) = 0; public: virtual ~Sound() { } diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index cab179f61..5918a9cf7 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -353,15 +353,21 @@ namespace MWSound bool SoundManager::getSoundPlaying(MWWorld::Ptr ptr, const std::string& soundId) const { - // Mark all sounds as playing, otherwise the scripts will just - // keep trying to play them every frame. - return isPlaying(ptr, soundId); } void SoundManager::updateObject(MWWorld::Ptr ptr) { - // FIXME: Update tracked sounds that are using this ptr + SoundMap::iterator snditer = ActiveSounds.find(ptr); + if(snditer == ActiveSounds.end()) + return; + + IDMap::iterator iditer = snditer->second.begin(); + while(iditer != snditer->second.end()) + { + iditer->second->Update(ptr); + iditer++; + } } void SoundManager::updateRegionSound(float duration) From 87adf6002a4c8933269177038771db4a71d449d2 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 09:57:39 -0700 Subject: [PATCH 083/586] Fix a copy-paste typo in the openal output --- apps/openmw/mwsound/openal_output.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index c460aeb29..c8ed2ad8b 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -336,7 +336,7 @@ Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr Date: Sat, 17 Mar 2012 10:16:22 -0700 Subject: [PATCH 084/586] Pass the loop and untracked flags when playing a 3d sound --- apps/openmw/mwsound/soundmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 5918a9cf7..9f80a8e20 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -329,7 +329,7 @@ namespace MWSound float min, max; std::string file = lookup(soundId, volume, min, max); if(!file.empty()) - play3d(file, ptr, soundId, volume, pitch, min, max, false); + play3d(file, ptr, soundId, volume, pitch, min, max, loop, untracked); else std::cout << "Sound file " << soundId << " not found, skipping.\n"; } From 7160d20db33f4b9e3d136dc613aa64a4c780412d Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 10:36:34 -0700 Subject: [PATCH 085/586] Be more consistent with the vector orientations given the sound handler --- apps/openmw/mwsound/openal_output.cpp | 13 ++++++++----- apps/openmw/mwsound/openal_output.hpp | 4 ++-- apps/openmw/mwsound/sound_output.hpp | 5 ++--- apps/openmw/mwsound/soundmanager.cpp | 8 ++++++-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index c8ed2ad8b..0cff2303f 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -368,7 +368,7 @@ Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr decoder, - MWWorld::Ptr ptr, float volume, float pitch, + const float *pos, float volume, float pitch, float min, float max, bool loop) { throwALerror(); @@ -393,7 +393,6 @@ Sound* OpenAL_Output::PlaySound3D(const std::string &fname, std::auto_ptr sound(new OpenAL_Sound(src, buf)); - const float *pos = ptr.getCellRef().pos.pos; alSource3f(src, AL_POSITION, pos[0], pos[2], -pos[1]); alSource3f(src, AL_DIRECTION, 0.0f, 0.0f, 0.0f); alSource3f(src, AL_VELOCITY, 0.0f, 0.0f, 0.0f); @@ -430,10 +429,14 @@ Sound* OpenAL_Output::StreamSound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch, bool loop); virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, - MWWorld::Ptr ptr, float volume, float pitch, + const float *pos, float volume, float pitch, float min, float max, bool loop); virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch); - virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]); + virtual void UpdateListener(const float *pos, const float *atdir, const float *updir); OpenAL_Output(SoundManager &mgr); virtual ~OpenAL_Output(); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index 9c8d0303b..c69247cc9 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -22,13 +22,12 @@ namespace MWSound virtual Sound *PlaySound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch, bool loop) = 0; virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, - MWWorld::Ptr ptr, float volume, float pitch, + const float *pos, float volume, float pitch, float min, float max, bool loop) = 0; virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, float volume, float pitch) = 0; - // FIXME: This should take an MWWorld::Ptr that represents the in-world camera - virtual void UpdateListener(float pos[3], float atdir[3], float updir[3]) = 0; + virtual void UpdateListener(const float *pos, const float *atdir, const float *updir) = 0; Sound_Output(SoundManager &mgr) : mgr(mgr) { } public: diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 9f80a8e20..af1cdf76d 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -125,8 +125,9 @@ namespace MWSound try { Sound *sound; + const float *pos = ptr.getCellRef().pos.pos; std::auto_ptr decoder(new DEFAULT_DECODER); - sound = Output->PlaySound3D(file, decoder, ptr, volume, pitch, min, max, loop); + sound = Output->PlaySound3D(file, decoder, pos, volume, pitch, min, max, loop); if(untracked) LooseSounds[id] = SoundPtr(sound); else @@ -444,7 +445,10 @@ namespace MWSound nDir = cam->getRealDirection(); nUp = cam->getRealUp(); - Output->UpdateListener(&nPos[0], &nDir[0], &nUp[0]); + float pos[3] = { nPos[0], -nPos[2], nPos[1] }; + float at[3] = { nDir[0], -nDir[2], nDir[1] }; + float up[3] = { nUp[0], -nUp[2], nUp[1] }; + Output->UpdateListener(pos, at, up); IDMap::iterator snditer = LooseSounds.begin(); From a91085a1b904bb26cf8410721e978fc73c3392b6 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 10:45:11 -0700 Subject: [PATCH 086/586] Add a couple comments --- apps/openmw/mwsound/soundmanager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index af1cdf76d..5d872476e 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -445,12 +445,16 @@ namespace MWSound nDir = cam->getRealDirection(); nUp = cam->getRealUp(); + // The output handler is expecting vectors oriented like the game + // (that is, -Z goes down, +Y goes forward), but that's not what we + // get from Ogre's camera, so we have to convert. float pos[3] = { nPos[0], -nPos[2], nPos[1] }; float at[3] = { nDir[0], -nDir[2], nDir[1] }; float up[3] = { nUp[0], -nUp[2], nUp[1] }; Output->UpdateListener(pos, at, up); - + // Check if any "untracked" sounds are finished playing, and trash + // them IDMap::iterator snditer = LooseSounds.begin(); while(snditer != LooseSounds.end()) { From a69ec91242eb1a781d944283af1c17b2d4110b2b Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 22:13:57 -0700 Subject: [PATCH 087/586] Remove some unnecessary wrappers and do some small cleanups --- apps/openmw/mwsound/soundmanager.cpp | 68 ++++++++++++---------------- apps/openmw/mwsound/soundmanager.hpp | 2 - 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 5d872476e..5b050e612 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -78,8 +78,6 @@ namespace MWSound { LooseSounds.clear(); ActiveSounds.clear(); - if(mMusic) - mMusic->Stop(); mMusic.reset(); Output.reset(); } @@ -135,30 +133,8 @@ namespace MWSound } catch(std::exception &e) { - std::cout <<"Sound play error: "<second.find(id); - if(iditer != snditer->second.end()) - { - snditer->second.erase(iditer); - if(snditer->second.size() == 0) - ActiveSounds.erase(snditer); - } + std::cout <<"Sound Error: "<second->isPlaying(); } - // Remove all references to objects belonging to a given cell - void SoundManager::removeCell(const MWWorld::Ptr::CellStore *cell) - { - SoundMap::iterator snditer = ActiveSounds.begin(); - while(snditer != ActiveSounds.end()) - { - if(snditer->first.getCell() == cell) - ActiveSounds.erase(snditer++); - else - snditer++; - } - } void SoundManager::stopMusic() { @@ -194,7 +158,6 @@ namespace MWSound setPlaylist(); } - void SoundManager::streamMusicFull(const std::string& filename) { if(mMusic) @@ -337,12 +300,37 @@ namespace MWSound void SoundManager::stopSound3D(MWWorld::Ptr ptr, const std::string& soundId) { - remove(ptr, soundId); + // Stop a sound and remove it from the list. If soundId="" then + // stop all its sounds. + SoundMap::iterator snditer = ActiveSounds.find(ptr); + if(snditer == ActiveSounds.end()) + return; + + if(!soundId.empty()) + { + IDMap::iterator iditer = snditer->second.find(soundId); + if(iditer != snditer->second.end()) + { + snditer->second.erase(iditer); + if(snditer->second.size() == 0) + ActiveSounds.erase(snditer); + } + } + else + ActiveSounds.erase(snditer); } void SoundManager::stopSound(MWWorld::Ptr::CellStore *cell) { - removeCell(cell); + // Remove all references to objects belonging to a given cell + SoundMap::iterator snditer = ActiveSounds.begin(); + while(snditer != ActiveSounds.end()) + { + if(snditer->first.getCell() == cell) + ActiveSounds.erase(snditer++); + else + snditer++; + } } void SoundManager::stopSound(const std::string& soundId) diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index df7e696da..62e452cde 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -64,9 +64,7 @@ namespace MWSound MWWorld::Ptr ptr, const std::string &id, float volume, float pitch, float min, float max, bool loop, bool untracked=false); - void remove(MWWorld::Ptr ptr, const std::string &id = ""); bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; - void removeCell(const MWWorld::Ptr::CellStore *cell); void updateRegionSound(float duration); public: From ddfa9069220c3560df1a14332f1c8b2266c7b04c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 22:45:28 -0700 Subject: [PATCH 088/586] Add a missing include --- apps/openmw/mwsound/soundmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 5b050e612..7cd8f4ea7 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -23,6 +23,7 @@ CMakeLists.txt. */ #ifdef OPENMW_USE_FFMPEG +#include "ffmpeg_decoder.hpp" #define SOUND_IN "FFmpeg" #endif From 44fc204864f15485c53d9f80492679d0b7b19d5a Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 23:30:43 -0700 Subject: [PATCH 089/586] Avoid passing a sound decoder to the play methods --- apps/openmw/mwsound/mpgsnd_decoder.hpp | 1 + apps/openmw/mwsound/openal_output.cpp | 20 +++++++++++--------- apps/openmw/mwsound/openal_output.hpp | 9 +++------ apps/openmw/mwsound/sound_output.hpp | 9 +++------ apps/openmw/mwsound/soundmanager.cpp | 17 ++++++++++------- apps/openmw/mwsound/soundmanager.hpp | 6 ++++++ 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/apps/openmw/mwsound/mpgsnd_decoder.hpp b/apps/openmw/mwsound/mpgsnd_decoder.hpp index 391cfbd6d..cd7e468da 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.hpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.hpp @@ -26,6 +26,7 @@ namespace MWSound virtual size_t Read(char *buffer, size_t bytes); MpgSnd_Decoder(); + public: virtual ~MpgSnd_Decoder(); friend class SoundManager; diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 0cff2303f..e9df0738b 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -5,6 +5,7 @@ #include "openal_output.hpp" #include "sound_decoder.hpp" #include "sound.hpp" +#include "soundmanager.hpp" namespace MWSound @@ -47,7 +48,7 @@ static ALenum getALFormat(Sound_Decoder::ChannelConfig chans, Sound_Decoder::Sam } -ALuint LoadBuffer(std::auto_ptr decoder) +ALuint LoadBuffer(DecoderPtr decoder) { int srate; Sound_Decoder::ChannelConfig chans; @@ -86,10 +87,10 @@ class OpenAL_SoundStream : public Sound ALenum Format; ALsizei SampleRate; - std::auto_ptr Decoder; + DecoderPtr Decoder; public: - OpenAL_SoundStream(std::auto_ptr decoder); + OpenAL_SoundStream(DecoderPtr decoder); virtual ~OpenAL_SoundStream(); void Play(float volume, float pitch); @@ -113,7 +114,7 @@ public: }; -OpenAL_SoundStream::OpenAL_SoundStream(std::auto_ptr decoder) +OpenAL_SoundStream::OpenAL_SoundStream(DecoderPtr decoder) : Decoder(decoder) { throwALerror(); @@ -320,11 +321,11 @@ void OpenAL_Output::Deinitialize() } -Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr decoder, - float volume, float pitch, bool loop) +Sound* OpenAL_Output::PlaySound(const std::string &fname, float volume, float pitch, bool loop) { throwALerror(); + DecoderPtr decoder = mgr.getDecoder(); decoder->Open(fname); ALuint src=0, buf=0; @@ -367,12 +368,12 @@ Sound* OpenAL_Output::PlaySound(const std::string &fname, std::auto_ptr decoder, - const float *pos, float volume, float pitch, +Sound* OpenAL_Output::PlaySound3D(const std::string &fname, const float *pos, float volume, float pitch, float min, float max, bool loop) { throwALerror(); + DecoderPtr decoder = mgr.getDecoder(); decoder->Open(fname); ALuint src=0, buf=0; @@ -416,10 +417,11 @@ Sound* OpenAL_Output::PlaySound3D(const std::string &fname, std::auto_ptr decoder, float volume, float pitch) +Sound* OpenAL_Output::StreamSound(const std::string &fname, float volume, float pitch) { std::auto_ptr sound; + DecoderPtr decoder = mgr.getDecoder(); decoder->Open(fname); sound.reset(new OpenAL_SoundStream(decoder)); diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index b941aea3a..7d5bd25f6 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -22,14 +22,11 @@ namespace MWSound virtual bool Initialize(const std::string &devname=""); virtual void Deinitialize(); - virtual Sound *PlaySound(const std::string &fname, std::auto_ptr decoder, - float volume, float pitch, bool loop); - virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, - const float *pos, float volume, float pitch, + virtual Sound *PlaySound(const std::string &fname, float volume, float pitch, bool loop); + virtual Sound *PlaySound3D(const std::string &fname, const float *pos, float volume, float pitch, float min, float max, bool loop); - virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, - float volume, float pitch); + virtual Sound *StreamSound(const std::string &fname, float volume, float pitch); virtual void UpdateListener(const float *pos, const float *atdir, const float *updir); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index c69247cc9..8dfc0f21e 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -19,13 +19,10 @@ namespace MWSound virtual bool Initialize(const std::string &devname="") = 0; virtual void Deinitialize() = 0; - virtual Sound *PlaySound(const std::string &fname, std::auto_ptr decoder, - float volume, float pitch, bool loop) = 0; - virtual Sound *PlaySound3D(const std::string &fname, std::auto_ptr decoder, - const float *pos, float volume, float pitch, + virtual Sound *PlaySound(const std::string &fname, float volume, float pitch, bool loop) = 0; + virtual Sound *PlaySound3D(const std::string &fname, const float *pos, float volume, float pitch, float min, float max, bool loop) = 0; - virtual Sound *StreamSound(const std::string &fname, std::auto_ptr decoder, - float volume, float pitch) = 0; + virtual Sound *StreamSound(const std::string &fname, float volume, float pitch) = 0; virtual void UpdateListener(const float *pos, const float *atdir, const float *updir) = 0; diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index 7cd8f4ea7..a603763e5 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -83,6 +83,12 @@ namespace MWSound Output.reset(); } + // Return a new decoder instance, used as needed by the output implementations + DecoderPtr SoundManager::getDecoder() + { + return DecoderPtr(new DEFAULT_DECODER); + } + // Convert a soundId to file name, and modify the volume // according to the sounds local volume setting, minRange and // maxRange. @@ -124,9 +130,8 @@ namespace MWSound try { Sound *sound; - const float *pos = ptr.getCellRef().pos.pos; - std::auto_ptr decoder(new DEFAULT_DECODER); - sound = Output->PlaySound3D(file, decoder, pos, volume, pitch, min, max, loop); + const ESM::Position &pos = ptr.getCellRef().pos; + sound = Output->PlaySound3D(file, pos.pos, volume, pitch, min, max, loop); if(untracked) LooseSounds[id] = SoundPtr(sound); else @@ -163,8 +168,7 @@ namespace MWSound { if(mMusic) mMusic->Stop(); - std::auto_ptr decoder(new DEFAULT_DECODER); - mMusic.reset(Output->StreamSound(filename, decoder, 0.4f, 1.0f)); + mMusic.reset(Output->StreamSound(filename, 0.4f, 1.0f)); } void SoundManager::streamMusic(const std::string& filename) @@ -274,8 +278,7 @@ namespace MWSound try { Sound *sound; - std::auto_ptr decoder(new DEFAULT_DECODER); - sound = Output->PlaySound(file, decoder, volume, pitch, loop); + sound = Output->PlaySound(file, volume, pitch, loop); LooseSounds[soundId] = SoundPtr(sound); } catch(std::exception &e) diff --git a/apps/openmw/mwsound/soundmanager.hpp b/apps/openmw/mwsound/soundmanager.hpp index 62e452cde..6b188c9e4 100644 --- a/apps/openmw/mwsound/soundmanager.hpp +++ b/apps/openmw/mwsound/soundmanager.hpp @@ -25,6 +25,8 @@ namespace MWSound class Sound_Decoder; class Sound; + typedef boost::shared_ptr DecoderPtr; + class SoundManager { // This is used for case insensitive and slash-type agnostic file @@ -67,6 +69,10 @@ namespace MWSound bool isPlaying(MWWorld::Ptr ptr, const std::string &id) const; void updateRegionSound(float duration); + protected: + DecoderPtr getDecoder(); + friend class OpenAL_Output; + public: SoundManager(Ogre::Root*, Ogre::Camera*, const Files::PathContainer& dataDir, bool useSound, bool fsstrict, From f7ac94d6860fc43344e403ce7904b2197262059a Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 23:41:45 -0700 Subject: [PATCH 090/586] Pass the new position to the sound update method --- apps/openmw/mwsound/openal_output.cpp | 10 ++++------ apps/openmw/mwsound/sound.hpp | 2 +- apps/openmw/mwsound/soundmanager.cpp | 3 ++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index e9df0738b..e37924088 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -96,7 +96,7 @@ public: void Play(float volume, float pitch); virtual void Stop(); virtual bool isPlaying(); - virtual void Update(MWWorld::Ptr ptr); + virtual void Update(const float *pos); }; class OpenAL_Sound : public Sound @@ -110,7 +110,7 @@ public: virtual void Stop(); virtual bool isPlaying(); - virtual void Update(MWWorld::Ptr ptr); + virtual void Update(const float *pos); }; @@ -234,9 +234,8 @@ bool OpenAL_SoundStream::isPlaying() return true; } -void OpenAL_SoundStream::Update(MWWorld::Ptr ptr) +void OpenAL_SoundStream::Update(const float *pos) { - const float *pos = ptr.getCellRef().pos.pos; alSource3f(Source, AL_POSITION, pos[0], pos[2], -pos[1]); alSource3f(Source, AL_DIRECTION, 0.0f, 0.0f, 0.0f); alSource3f(Source, AL_VELOCITY, 0.0f, 0.0f, 0.0f); @@ -271,9 +270,8 @@ bool OpenAL_Sound::isPlaying() return state==AL_PLAYING; } -void OpenAL_Sound::Update(MWWorld::Ptr ptr) +void OpenAL_Sound::Update(const float *pos) { - const float *pos = ptr.getCellRef().pos.pos; alSource3f(Source, AL_POSITION, pos[0], pos[2], -pos[1]); alSource3f(Source, AL_DIRECTION, 0.0f, 0.0f, 0.0f); alSource3f(Source, AL_VELOCITY, 0.0f, 0.0f, 0.0f); diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp index 99be9dfeb..3b4736fd6 100644 --- a/apps/openmw/mwsound/sound.hpp +++ b/apps/openmw/mwsound/sound.hpp @@ -11,7 +11,7 @@ namespace MWSound { virtual void Stop() = 0; virtual bool isPlaying() = 0; - virtual void Update(MWWorld::Ptr ptr) = 0; + virtual void Update(const float *pos) = 0; public: virtual ~Sound() { } diff --git a/apps/openmw/mwsound/soundmanager.cpp b/apps/openmw/mwsound/soundmanager.cpp index a603763e5..650c8f0d9 100644 --- a/apps/openmw/mwsound/soundmanager.cpp +++ b/apps/openmw/mwsound/soundmanager.cpp @@ -358,7 +358,8 @@ namespace MWSound IDMap::iterator iditer = snditer->second.begin(); while(iditer != snditer->second.end()) { - iditer->second->Update(ptr); + const ESM::Position &pos = ptr.getCellRef().pos; + iditer->second->Update(pos.pos); iditer++; } } From 3fea3e7d25e59e45c5357616f46fc05e3fb56fa5 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 17 Mar 2012 23:47:12 -0700 Subject: [PATCH 091/586] Fix stereo files with libsndfile --- apps/openmw/mwsound/mpgsnd_decoder.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp index 2c35adeb3..9b51319dd 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.cpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -22,8 +22,8 @@ void MpgSnd_Decoder::Open(const std::string &fname) { if(info.channels == 1) chanConfig = MonoChannels; - else if(info.channels == 1) - chanConfig = MonoChannels; + else if(info.channels == 2) + chanConfig = StereoChannels; else { sf_close(sndFile); From 3a00fbb95034938abe3f069398f0a0d9d1dbcead Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 18 Mar 2012 15:11:37 +0100 Subject: [PATCH 092/586] removed mygui from source tree and use system install instead --- CMakeLists.txt | 15 +- apps/openmw/CMakeLists.txt | 4 +- cmake/FindMyGUI.cmake | 125 + extern/mygui_3.0.1/CMakeLists.txt | 20 - extern/mygui_3.0.1/MyGUIEngine/CMakeLists.txt | 35 - .../mygui_3.0.1/MyGUIEngine/MyGUIEngine.list | 561 ---- .../mygui_3.0.1/MyGUIEngine/include/MyGUI.h | 92 - .../include/MyGUI_ActionController.h | 75 - .../MyGUIEngine/include/MyGUI_Align.h | 202 -- .../MyGUIEngine/include/MyGUI_Allocator.h | 89 - .../MyGUIEngine/include/MyGUI_Any.h | 213 -- .../MyGUIEngine/include/MyGUI_BiIndexBase.h | 216 -- .../MyGUIEngine/include/MyGUI_Bitwise.h | 78 - .../MyGUIEngine/include/MyGUI_Button.h | 111 - .../MyGUIEngine/include/MyGUI_Canvas.h | 246 -- .../MyGUIEngine/include/MyGUI_CastWidget.h | 47 - .../MyGUIEngine/include/MyGUI_ChildSkinInfo.h | 73 - .../include/MyGUI_ClipboardManager.h | 70 - .../MyGUIEngine/include/MyGUI_Colour.h | 163 - .../MyGUIEngine/include/MyGUI_ComboBox.h | 237 -- .../MyGUIEngine/include/MyGUI_Common.h | 57 - .../include/MyGUI_CommonStateInfo.h | 145 - .../include/MyGUI_ControllerEdgeHide.h | 84 - .../include/MyGUI_ControllerFadeAlpha.h | 78 - .../include/MyGUI_ControllerItem.h | 73 - .../include/MyGUI_ControllerManager.h | 74 - .../include/MyGUI_ControllerPosition.h | 95 - .../include/MyGUI_CoordConverter.h | 92 - .../include/MyGUI_CustomAllocator.h | 101 - .../MyGUIEngine/include/MyGUI_DDContainer.h | 175 -- .../MyGUIEngine/include/MyGUI_DDItemInfo.h | 120 - .../include/MyGUI_DataFileStream.h | 45 - .../MyGUIEngine/include/MyGUI_DataManager.h | 56 - .../MyGUIEngine/include/MyGUI_DataStream.h | 51 - .../MyGUIEngine/include/MyGUI_Delegate.h | 137 - .../include/MyGUI_DelegateImplement.h | 319 -- .../MyGUIEngine/include/MyGUI_Diagnostic.h | 115 - .../MyGUIEngine/include/MyGUI_DynLib.h | 111 - .../MyGUIEngine/include/MyGUI_DynLibManager.h | 58 - .../MyGUIEngine/include/MyGUI_Edit.h | 443 --- .../MyGUIEngine/include/MyGUI_EditText.h | 164 - .../MyGUIEngine/include/MyGUI_Enumerator.h | 108 - .../MyGUIEngine/include/MyGUI_EventPair.h | 118 - .../MyGUIEngine/include/MyGUI_Exception.h | 69 - .../include/MyGUI_FactoryManager.h | 79 - .../MyGUIEngine/include/MyGUI_FontData.h | 129 - .../MyGUIEngine/include/MyGUI_FontManager.h | 60 - .../include/MyGUI_GenericFactory.h | 36 - .../MyGUIEngine/include/MyGUI_Gui.h | 287 -- .../MyGUIEngine/include/MyGUI_Guid.h | 137 - .../MyGUIEngine/include/MyGUI_HScroll.h | 67 - .../MyGUIEngine/include/MyGUI_IBItemInfo.h | 111 - .../include/MyGUI_ICroppedRectangle.h | 213 -- .../MyGUIEngine/include/MyGUI_IDataStream.h | 46 - .../MyGUIEngine/include/MyGUI_IFont.h | 54 - .../MyGUIEngine/include/MyGUI_ILayer.h | 79 - .../MyGUIEngine/include/MyGUI_ILayerItem.h | 50 - .../MyGUIEngine/include/MyGUI_ILayerNode.h | 91 - .../MyGUIEngine/include/MyGUI_IObject.h | 43 - .../MyGUIEngine/include/MyGUI_IPointer.h | 47 - .../MyGUIEngine/include/MyGUI_IRenderTarget.h | 52 - .../MyGUIEngine/include/MyGUI_IResource.h | 77 - .../MyGUIEngine/include/MyGUI_ISerializable.h | 49 - .../MyGUIEngine/include/MyGUI_IStateInfo.h | 47 - .../MyGUIEngine/include/MyGUI_ISubWidget.h | 62 - .../include/MyGUI_ISubWidgetRect.h | 47 - .../include/MyGUI_ISubWidgetText.h | 114 - .../MyGUIEngine/include/MyGUI_ITexture.h | 73 - .../MyGUIEngine/include/MyGUI_IUnlinkWidget.h | 43 - .../MyGUIEngine/include/MyGUI_IVertexBuffer.h | 47 - .../include/MyGUI_IWidgetCreator.h | 64 - .../include/MyGUI_IWidgetFactory.h | 95 - .../MyGUIEngine/include/MyGUI_ImageInfo.h | 64 - .../MyGUIEngine/include/MyGUI_InputDefine.h | 227 -- .../MyGUIEngine/include/MyGUI_InputManager.h | 180 -- .../MyGUIEngine/include/MyGUI_Instance.h | 45 - .../MyGUIEngine/include/MyGUI_ItemBox.h | 368 --- .../include/MyGUI_LanguageManager.h | 96 - .../MyGUIEngine/include/MyGUI_LayerItem.h | 88 - .../MyGUIEngine/include/MyGUI_LayerManager.h | 99 - .../MyGUIEngine/include/MyGUI_LayerNode.h | 105 - .../MyGUIEngine/include/MyGUI_LayoutManager.h | 78 - .../MyGUIEngine/include/MyGUI_List.h | 333 -- .../MyGUIEngine/include/MyGUI_ListBox.h | 147 - .../MyGUIEngine/include/MyGUI_ListCtrl.h | 301 -- .../MyGUIEngine/include/MyGUI_LogManager.h | 88 - .../MyGUIEngine/include/MyGUI_LogStream.h | 74 - .../MyGUIEngine/include/MyGUI_Macros.h | 41 - .../MyGUIEngine/include/MyGUI_MainSkin.h | 47 - .../MyGUIEngine/include/MyGUI_MaskPickInfo.h | 61 - .../MyGUIEngine/include/MyGUI_MenuBar.h | 56 - .../MyGUIEngine/include/MyGUI_MenuCtrl.h | 371 --- .../MyGUIEngine/include/MyGUI_MenuItem.h | 131 - .../MyGUIEngine/include/MyGUI_MenuItemType.h | 89 - .../MyGUIEngine/include/MyGUI_Message.h | 155 - .../MyGUIEngine/include/MyGUI_MessageStyle.h | 224 -- .../MyGUIEngine/include/MyGUI_MultiList.h | 385 --- .../include/MyGUI_OverlappedLayer.h | 74 - .../MyGUIEngine/include/MyGUI_Platform.h | 151 - .../MyGUIEngine/include/MyGUI_Plugin.h | 67 - .../MyGUIEngine/include/MyGUI_PluginManager.h | 91 - .../include/MyGUI_PointerManager.h | 131 - .../MyGUIEngine/include/MyGUI_PopupMenu.h | 56 - .../MyGUIEngine/include/MyGUI_Precompiled.h | 49 - .../MyGUIEngine/include/MyGUI_Prerequest.h | 192 -- .../MyGUIEngine/include/MyGUI_Progress.h | 131 - .../MyGUIEngine/include/MyGUI_RTTI.h | 104 - .../MyGUIEngine/include/MyGUI_RawRect.h | 77 - .../MyGUIEngine/include/MyGUI_RenderFormat.h | 100 - .../MyGUIEngine/include/MyGUI_RenderItem.h | 94 - .../MyGUIEngine/include/MyGUI_RenderManager.h | 69 - .../MyGUIEngine/include/MyGUI_RenderOut.h | 71 - .../include/MyGUI_RenderTargetInfo.h | 65 - .../include/MyGUI_ResourceHolder.h | 96 - .../include/MyGUI_ResourceImageSet.h | 139 - .../include/MyGUI_ResourceImageSetPointer.h | 54 - .../include/MyGUI_ResourceManager.h | 102 - .../include/MyGUI_ResourceManualFont.h | 83 - .../include/MyGUI_ResourceManualPointer.h | 55 - .../MyGUIEngine/include/MyGUI_ResourceSkin.h | 86 - .../include/MyGUI_ResourceTrueTypeFont.h | 105 - .../MyGUIEngine/include/MyGUI_RotatingSkin.h | 77 - .../MyGUIEngine/include/MyGUI_ScrollView.h | 156 - .../include/MyGUI_ScrollViewBase.h | 75 - .../MyGUIEngine/include/MyGUI_SharedLayer.h | 75 - .../include/MyGUI_SharedLayerNode.h | 50 - .../MyGUIEngine/include/MyGUI_SimpleText.h | 51 - .../MyGUIEngine/include/MyGUI_SkinManager.h | 73 - .../MyGUIEngine/include/MyGUI_StaticImage.h | 246 -- .../MyGUIEngine/include/MyGUI_StaticText.h | 85 - .../MyGUIEngine/include/MyGUI_SubSkin.h | 84 - .../include/MyGUI_SubWidgetBinding.h | 88 - .../MyGUIEngine/include/MyGUI_SubWidgetInfo.h | 50 - .../include/MyGUI_SubWidgetManager.h | 44 - .../MyGUIEngine/include/MyGUI_TCoord.h | 229 -- .../MyGUIEngine/include/MyGUI_TPoint.h | 155 - .../MyGUIEngine/include/MyGUI_TRect.h | 191 -- .../MyGUIEngine/include/MyGUI_TSize.h | 156 - .../MyGUIEngine/include/MyGUI_Tab.h | 369 --- .../MyGUIEngine/include/MyGUI_TabItem.h | 90 - .../include/MyGUI_TextChangeHistory.h | 67 - .../MyGUIEngine/include/MyGUI_TextIterator.h | 125 - .../MyGUIEngine/include/MyGUI_TextView.h | 358 --- .../include/MyGUI_TextureUtility.h | 50 - .../MyGUIEngine/include/MyGUI_TileRect.h | 94 - .../MyGUIEngine/include/MyGUI_Timer.h | 48 - .../MyGUIEngine/include/MyGUI_Types.h | 70 - .../MyGUIEngine/include/MyGUI_UString.h | 2765 ----------------- .../MyGUIEngine/include/MyGUI_Utility.h | 355 --- .../MyGUIEngine/include/MyGUI_VScroll.h | 176 -- .../MyGUIEngine/include/MyGUI_Version.h | 96 - .../MyGUIEngine/include/MyGUI_VertexData.h | 87 - .../MyGUIEngine/include/MyGUI_Widget.h | 503 --- .../MyGUIEngine/include/MyGUI_WidgetDefines.h | 41 - .../MyGUIEngine/include/MyGUI_WidgetEvent.h | 335 -- .../MyGUIEngine/include/MyGUI_WidgetManager.h | 130 - .../MyGUIEngine/include/MyGUI_WidgetStyle.h | 91 - .../MyGUIEngine/include/MyGUI_WidgetToolTip.h | 55 - .../include/MyGUI_WidgetTranslate.h | 72 - .../include/MyGUI_WidgetUserData.h | 123 - .../MyGUIEngine/include/MyGUI_Window.h | 197 -- .../MyGUIEngine/include/MyGUI_XmlDocument.h | 334 -- .../src/MyGUI_ActionController.cpp | 72 - .../mygui_3.0.1/MyGUIEngine/src/MyGUI_Any.cpp | 32 - .../MyGUIEngine/src/MyGUI_Button.cpp | 217 -- .../MyGUIEngine/src/MyGUI_Canvas.cpp | 281 -- .../src/MyGUI_ClipboardManager.cpp | 183 -- .../MyGUIEngine/src/MyGUI_Colour.cpp | 36 - .../MyGUIEngine/src/MyGUI_ComboBox.cpp | 438 --- .../src/MyGUI_ControllerEdgeHide.cpp | 179 -- .../src/MyGUI_ControllerFadeAlpha.cpp | 105 - .../src/MyGUI_ControllerManager.cpp | 153 - .../src/MyGUI_ControllerPosition.cpp | 132 - .../MyGUIEngine/src/MyGUI_DDContainer.cpp | 311 -- .../MyGUIEngine/src/MyGUI_DataFileStream.cpp | 50 - .../MyGUIEngine/src/MyGUI_DataManager.cpp | 56 - .../MyGUIEngine/src/MyGUI_DataStream.cpp | 76 - .../MyGUIEngine/src/MyGUI_DynLib.cpp | 110 - .../MyGUIEngine/src/MyGUI_DynLibManager.cpp | 91 - .../MyGUIEngine/src/MyGUI_Edit.cpp | 1947 ------------ .../MyGUIEngine/src/MyGUI_EditText.cpp | 834 ----- .../MyGUIEngine/src/MyGUI_Exception.cpp | 74 - .../MyGUIEngine/src/MyGUI_FactoryManager.cpp | 142 - .../MyGUIEngine/src/MyGUI_FontManager.cpp | 219 -- .../mygui_3.0.1/MyGUIEngine/src/MyGUI_Gui.cpp | 320 -- .../MyGUIEngine/src/MyGUI_Guid.cpp | 180 -- .../MyGUIEngine/src/MyGUI_HScroll.cpp | 149 - .../MyGUIEngine/src/MyGUI_IWidgetCreator.cpp | 35 - .../MyGUIEngine/src/MyGUI_InputManager.cpp | 601 ---- .../MyGUIEngine/src/MyGUI_ItemBox.cpp | 905 ------ .../MyGUIEngine/src/MyGUI_LanguageManager.cpp | 319 -- .../MyGUIEngine/src/MyGUI_LayerItem.cpp | 213 -- .../MyGUIEngine/src/MyGUI_LayerManager.cpp | 255 -- .../MyGUIEngine/src/MyGUI_LayerNode.cpp | 302 -- .../MyGUIEngine/src/MyGUI_LayoutManager.cpp | 178 -- .../MyGUIEngine/src/MyGUI_List.cpp | 971 ------ .../MyGUIEngine/src/MyGUI_ListBox.cpp | 174 -- .../MyGUIEngine/src/MyGUI_ListCtrl.cpp | 890 ------ .../MyGUIEngine/src/MyGUI_LogManager.cpp | 184 -- .../MyGUIEngine/src/MyGUI_LogStream.cpp | 113 - .../MyGUIEngine/src/MyGUI_MainSkin.cpp | 49 - .../MyGUIEngine/src/MyGUI_MaskPickInfo.cpp | 77 - .../MyGUIEngine/src/MyGUI_MenuBar.cpp | 62 - .../MyGUIEngine/src/MyGUI_MenuCtrl.cpp | 694 ----- .../MyGUIEngine/src/MyGUI_MenuItem.cpp | 175 -- .../MyGUIEngine/src/MyGUI_Message.cpp | 449 --- .../MyGUIEngine/src/MyGUI_MultiList.cpp | 637 ---- .../MyGUIEngine/src/MyGUI_OverlappedLayer.cpp | 167 - .../MyGUIEngine/src/MyGUI_PluginManager.cpp | 184 -- .../MyGUIEngine/src/MyGUI_PointerManager.cpp | 355 --- .../MyGUIEngine/src/MyGUI_PopupMenu.cpp | 61 - .../MyGUIEngine/src/MyGUI_Precompiled.cpp | 1 - .../MyGUIEngine/src/MyGUI_Progress.cpp | 345 -- .../MyGUIEngine/src/MyGUI_RawRect.cpp | 183 -- .../MyGUIEngine/src/MyGUI_RenderItem.cpp | 194 -- .../MyGUIEngine/src/MyGUI_RenderManager.cpp | 56 - .../MyGUIEngine/src/MyGUI_RenderOut.cpp | 132 - .../src/MyGUI_ResourceImageSet.cpp | 173 -- .../src/MyGUI_ResourceImageSetPointer.cpp | 64 - .../MyGUIEngine/src/MyGUI_ResourceManager.cpp | 288 -- .../src/MyGUI_ResourceManualFont.cpp | 181 -- .../src/MyGUI_ResourceManualPointer.cpp | 68 - .../MyGUIEngine/src/MyGUI_ResourceSkin.cpp | 266 -- .../src/MyGUI_ResourceTrueTypeFont.cpp | 490 --- .../MyGUIEngine/src/MyGUI_RotatingSkin.cpp | 134 - .../MyGUIEngine/src/MyGUI_ScrollView.cpp | 357 --- .../MyGUIEngine/src/MyGUI_ScrollViewBase.cpp | 327 -- .../MyGUIEngine/src/MyGUI_SharedLayer.cpp | 155 - .../MyGUIEngine/src/MyGUI_SharedLayerNode.cpp | 40 - .../MyGUIEngine/src/MyGUI_SimpleText.cpp | 77 - .../MyGUIEngine/src/MyGUI_SkinManager.cpp | 132 - .../MyGUIEngine/src/MyGUI_StaticImage.cpp | 538 ---- .../MyGUIEngine/src/MyGUI_StaticText.cpp | 140 - .../MyGUIEngine/src/MyGUI_SubSkin.cpp | 291 -- .../src/MyGUI_SubWidgetManager.cpp | 95 - .../mygui_3.0.1/MyGUIEngine/src/MyGUI_Tab.cpp | 730 ----- .../MyGUIEngine/src/MyGUI_TabItem.cpp | 122 - .../MyGUIEngine/src/MyGUI_TextIterator.cpp | 554 ---- .../MyGUIEngine/src/MyGUI_TextureUtility.cpp | 98 - .../MyGUIEngine/src/MyGUI_TileRect.cpp | 381 --- .../MyGUIEngine/src/MyGUI_Timer.cpp | 79 - .../MyGUIEngine/src/MyGUI_VScroll.cpp | 403 --- .../MyGUIEngine/src/MyGUI_Widget.cpp | 1724 ---------- .../MyGUIEngine/src/MyGUI_WidgetManager.cpp | 296 -- .../MyGUIEngine/src/MyGUI_Window.cpp | 462 --- .../MyGUIEngine/src/MyGUI_XmlDocument.cpp | 835 ----- .../mygui_3.0.1/OgrePlatform/CMakeLists.txt | 9 - .../OgrePlatform/MyGUI.OgrePlatform.list | 41 - .../OgrePlatform/include/MyGUI_LastHeader.h | 33 - .../include/MyGUI_OgreDataManager.h | 49 - .../include/MyGUI_OgreDataStream.h | 38 - .../include/MyGUI_OgreDiagnostic.h | 38 - .../OgrePlatform/include/MyGUI_OgrePlatform.h | 83 - .../include/MyGUI_OgreRTTexture.h | 45 - .../include/MyGUI_OgreRenderManager.h | 115 - .../OgrePlatform/include/MyGUI_OgreTexture.h | 86 - .../include/MyGUI_OgreVertexBuffer.h | 56 - .../src/MyGUI_OgreDataManager.cpp | 134 - .../OgrePlatform/src/MyGUI_OgreDataStream.cpp | 49 - .../OgrePlatform/src/MyGUI_OgreRTTexture.cpp | 82 - .../src/MyGUI_OgreRenderManager.cpp | 366 --- .../OgrePlatform/src/MyGUI_OgreTexture.cpp | 305 -- .../src/MyGUI_OgreVertexBuffer.cpp | 93 - 263 files changed, 131 insertions(+), 48809 deletions(-) create mode 100644 cmake/FindMyGUI.cmake delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/CMakeLists.txt delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/MyGUIEngine.list delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ActionController.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Align.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Allocator.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Any.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_BiIndexBase.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Bitwise.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Button.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Canvas.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CastWidget.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ChildSkinInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ClipboardManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Colour.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ComboBox.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Common.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CommonStateInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerEdgeHide.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerFadeAlpha.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerPosition.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CoordConverter.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CustomAllocator.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDContainer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDItemInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataFileStream.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataStream.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Delegate.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DelegateImplement.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Diagnostic.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLib.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLibManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Edit.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EditText.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Enumerator.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EventPair.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Exception.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FactoryManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontData.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_GenericFactory.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Gui.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Guid.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_HScroll.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IBItemInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ICroppedRectangle.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IDataStream.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IFont.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerNode.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IObject.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IPointer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IRenderTarget.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IResource.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISerializable.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IStateInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidget.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetRect.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetText.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ITexture.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IUnlinkWidget.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IVertexBuffer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetCreator.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetFactory.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ImageInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputDefine.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Instance.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ItemBox.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LanguageManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerNode.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayoutManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_List.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListBox.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListCtrl.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogStream.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Macros.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MainSkin.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MaskPickInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuBar.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuCtrl.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItemType.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Message.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MessageStyle.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MultiList.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_OverlappedLayer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Platform.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Plugin.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PluginManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PointerManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PopupMenu.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Precompiled.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Prerequest.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Progress.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RTTI.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RawRect.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderFormat.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderOut.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderTargetInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceHolder.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSet.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSetPointer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualFont.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualPointer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceSkin.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceTrueTypeFont.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RotatingSkin.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollView.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollViewBase.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayerNode.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SimpleText.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SkinManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticImage.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticText.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubSkin.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetBinding.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetInfo.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TCoord.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TPoint.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TRect.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TSize.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Tab.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TabItem.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextChangeHistory.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextIterator.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextView.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextureUtility.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TileRect.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Timer.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Types.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_UString.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Utility.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VScroll.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Version.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VertexData.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Widget.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetDefines.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetEvent.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetManager.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetStyle.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetToolTip.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetTranslate.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetUserData.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Window.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_XmlDocument.h delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ActionController.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Any.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Button.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Canvas.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ClipboardManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Colour.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ComboBox.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ControllerEdgeHide.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ControllerFadeAlpha.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ControllerManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ControllerPosition.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DDContainer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DataFileStream.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DataManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DataStream.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DynLib.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_DynLibManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Edit.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_EditText.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Exception.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_FactoryManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_FontManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Gui.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Guid.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_HScroll.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_IWidgetCreator.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_InputManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ItemBox.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LanguageManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LayerItem.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LayerManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LayerNode.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LayoutManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_List.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ListBox.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ListCtrl.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LogManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_LogStream.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MainSkin.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MaskPickInfo.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MenuBar.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MenuCtrl.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MenuItem.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Message.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_MultiList.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_OverlappedLayer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_PluginManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_PointerManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_PopupMenu.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Precompiled.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Progress.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_RawRect.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_RenderItem.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_RenderManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_RenderOut.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceImageSet.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceImageSetPointer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceManualFont.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceManualPointer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceSkin.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ResourceTrueTypeFont.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_RotatingSkin.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ScrollView.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ScrollViewBase.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SharedLayer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SharedLayerNode.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SimpleText.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SkinManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_StaticImage.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_StaticText.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SubSkin.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_SubWidgetManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Tab.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_TabItem.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_TextIterator.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_TextureUtility.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_TileRect.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Timer.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_VScroll.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Widget.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_WidgetManager.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Window.cpp delete mode 100644 extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_XmlDocument.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/CMakeLists.txt delete mode 100644 extern/mygui_3.0.1/OgrePlatform/MyGUI.OgrePlatform.list delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_LastHeader.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreDataManager.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreDataStream.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreDiagnostic.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgrePlatform.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreRTTexture.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreRenderManager.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreTexture.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/include/MyGUI_OgreVertexBuffer.h delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreDataManager.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreDataStream.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreRTTexture.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreRenderManager.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreTexture.cpp delete mode 100644 extern/mygui_3.0.1/OgrePlatform/src/MyGUI_OgreVertexBuffer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a12126c2a..338a5e7e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,7 +177,6 @@ include_directories(${UUID_INCLUDE_DIR}) endif (WIN32) if (MSVC10) set(PLATFORM_INCLUDE_DIR "") - add_definitions(-DMYGUI_DONT_REPLACE_NULLPTR) endif() if (APPLE) @@ -187,6 +186,7 @@ endif (APPLE) # Dependencies find_package(OGRE REQUIRED) +find_package(MyGUI REQUIRED) find_package(Boost REQUIRED COMPONENTS system filesystem program_options thread) find_package(OIS REQUIRED) find_package(OpenAL REQUIRED) @@ -203,14 +203,14 @@ include_directories("." ${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE ${OGRE_PLUGIN_INCLUDE_DIRS} ${OIS_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} ${PLATFORM_INCLUDE_DIR} - ${CMAKE_HOME_DIRECTORY}/extern/mygui_3.0.1/MyGUIEngine/include - ${CMAKE_HOME_DIRECTORY}/extern/mygui_3.0.1/OgrePlatform/include + ${MYGUI_INCLUDE_DIRS} + ${MYGUI_PLATFORM_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR} ${UUID_INCLUDE_DIR} ${LIBDIR} ) -link_directories(${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR}) +link_directories(${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR} ${MYGUI_LIB_DIR}) if(APPLE) # List used Ogre plugins @@ -222,13 +222,6 @@ endif(APPLE) add_subdirectory( extern/mygui_3.0.1 ) -# Make sure that certain libraries are used as static libraries -# This is in effect turns off __declspec (dllexport) for windows -# Each library will also need to be configured to build as a static lib - -# MyGUI: extern/mygui_3.0.0/ -add_definitions(-DMYGUI_STATIC) - # Specify build paths if (APPLE) diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 6d33298df..d6101c919 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -87,9 +87,9 @@ target_link_libraries(openmw ${OPENAL_LIBRARY} ${SOUND_INPUT_LIBRARY} ${BULLET_LIBRARIES} + ${MYGUI_LIBRARIES} + MyGUI.OgrePlatform #TODO MyGUI ogre platform is not added by the find script components - MyGUIEngine - MyGUIOgrePlatform ) if(APPLE) diff --git a/cmake/FindMyGUI.cmake b/cmake/FindMyGUI.cmake new file mode 100644 index 000000000..339f494dd --- /dev/null +++ b/cmake/FindMyGUI.cmake @@ -0,0 +1,125 @@ +# - Find MyGUI includes and library +# +# This module defines +# MYGUI_INCLUDE_DIRS +# MYGUI_LIBRARIES, the libraries to link against to use MYGUI. +# MYGUI_LIB_DIR, the location of the libraries +# MYGUI_FOUND, If false, do not try to use MYGUI +# +# Copyright © 2007, Matt Williams +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +CMAKE_POLICY(PUSH) +include(FindPkgMacros) + +# IF (MYGUI_LIBRARIES AND MYGUI_INCLUDE_DIRS) + # SET(MYGUI_FIND_QUIETLY TRUE) +# ENDIF (MYGUI_LIBRARIES AND MYGUI_INCLUDE_DIRS) + +IF (WIN32) #Windows + MESSAGE(STATUS "Looking for MyGUI") + SET(MYGUISDK $ENV{MYGUI_HOME}) + IF (MYGUISDK) + findpkg_begin ( "MYGUI" ) + MESSAGE(STATUS "Using MyGUI in OGRE SDK") + STRING(REGEX REPLACE "[\\]" "/" MYGUISDK "${MYGUISDK}" ) + + find_path ( MYGUI_INCLUDE_DIRS + MyGUI.h + "${MYGUISDK}/MyGUIEngine/include" + NO_DEFAULT_PATH ) + + find_path ( MYGUI_PLATFORM_INCLUDE_DIRS + MyGUI_OgrePlatform.h + "${MYGUISDK}/Platforms/Ogre/OgrePlatform/include" + NO_DEFAULT_PATH ) + + SET ( MYGUI_LIB_DIR ${MYGUISDK}/*/lib ) + + find_library ( MYGUI_LIBRARIES_REL NAMES + MyGUIEngine.lib + MyGUI.OgrePlatform.lib + HINTS + ${MYGUI_LIB_DIR} + PATH_SUFFIXES "" release relwithdebinfo minsizerel ) + + find_library ( MYGUI_LIBRARIES_DBG NAMES + MyGUIEngine_d.lib + MyGUI.OgrePlatform_d.lib + HINTS + ${MYGUI_LIB_DIR} + PATH_SUFFIXES "" debug ) + + find_library ( MYGUI_PLATFORM_LIBRARIES_REL NAMES + MyGUI.OgrePlatform.lib + HINTS + ${MYGUI_LIB_DIR} + PATH_SUFFIXES "" release relwithdebinfo minsizerel ) + + find_library ( MYGUI_PLATFORM_LIBRARIES_DBG NAMES + MyGUI.OgrePlatform_d.lib + HINTS + ${MYGUI_LIB_DIR} + PATH_SUFFIXES "" debug ) + + make_library_set ( MYGUI_LIBRARIES ) + make_library_set ( MYGUI_PLATFORM_LIBRARIES ) + + MESSAGE ("${MYGUI_LIBRARIES}") + MESSAGE ("${MYGUI_PLATFORM_LIBRARIES}") + + findpkg_finish ( "MYGUI" ) + + ENDIF (MYGUISDK) + IF (OGRESOURCE) + MESSAGE(STATUS "Using MyGUI in OGRE dependencies") + STRING(REGEX REPLACE "[\\]" "/" OGRESDK "${OGRESOURCE}" ) + SET(MYGUI_INCLUDE_DIRS ${OGRESOURCE}/OgreMain/include/MYGUI) + SET(MYGUI_LIB_DIR ${OGRESOURCE}/lib) + SET(MYGUI_LIBRARIES debug Debug/MyGUIEngine_d optimized Release/MyGUIEngine) + ENDIF (OGRESOURCE) +ELSE (WIN32) #Unix + CMAKE_MINIMUM_REQUIRED(VERSION 2.4.7 FATAL_ERROR) + FIND_PACKAGE(PkgConfig) + PKG_SEARCH_MODULE(MYGUI MYGUI MyGUI) + IF (MYGUI_INCLUDE_DIRS) + SET(MYGUI_INCLUDE_DIRS ${MYGUI_INCLUDE_DIRS}) + SET(MYGUI_LIB_DIR ${MYGUI_LIBDIR}) + SET(MYGUI_LIBRARIES ${MYGUI_LIBRARIES} CACHE STRING "") + ELSE (MYGUI_INCLUDE_DIRS) + FIND_PATH(MYGUI_INCLUDE_DIRS MyGUI.h PATHS /usr/local/include /usr/include PATH_SUFFIXES MyGUI MYGUI) + FIND_LIBRARY(MYGUI_LIBRARIES mygui PATHS /usr/lib /usr/local/lib) + SET(MYGUI_LIB_DIR ${MYGUI_LIBRARIES}) + STRING(REGEX REPLACE "(.*)/.*" "\\1" MYGUI_LIB_DIR "${MYGUI_LIB_DIR}") + STRING(REGEX REPLACE ".*/" "" MYGUI_LIBRARIES "${MYGUI_LIBRARIES}") + ENDIF (MYGUI_INCLUDE_DIRS) +ENDIF (WIN32) + +#Do some preparation +SEPARATE_ARGUMENTS(MYGUI_INCLUDE_DIRS) +SEPARATE_ARGUMENTS(MYGUI_LIBRARIES) +SEPARATE_ARGUMENTS(MYGUI_PLATFORM_LIBRARIES) + +SET(MYGUI_INCLUDE_DIRS ${MYGUI_INCLUDE_DIRS} CACHE PATH "") +SET(MYGUI_LIBRARIES ${MYGUI_LIBRARIES} CACHE STRING "") +SET(MYGUI_LIBRARIES ${MYGUI_PLATFORM_LIBRARIES} CACHE STRING "") +SET(MYGUI_LIB_DIR ${MYGUI_LIB_DIR} CACHE PATH "") + +IF (MYGUI_INCLUDE_DIRS AND MYGUI_LIBRARIES) + SET(MYGUI_FOUND TRUE) +ENDIF (MYGUI_INCLUDE_DIRS AND MYGUI_LIBRARIES) + +IF (MYGUI_FOUND) + MARK_AS_ADVANCED(MYGUI_LIB_DIR) + IF (NOT MYGUI_FIND_QUIETLY) + MESSAGE(STATUS " libraries : ${MYGUI_LIBRARIES} from ${MYGUI_LIB_DIR}") + MESSAGE(STATUS " includes : ${MYGUI_INCLUDE_DIRS}") + ENDIF (NOT MYGUI_FIND_QUIETLY) +ELSE (MYGUI_FOUND) + IF (MYGUI_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find MYGUI") + ENDIF (MYGUI_FIND_REQUIRED) +ENDIF (MYGUI_FOUND) + +CMAKE_POLICY(POP) \ No newline at end of file diff --git a/extern/mygui_3.0.1/CMakeLists.txt b/extern/mygui_3.0.1/CMakeLists.txt index 2cbe8aabe..38f8abbba 100644 --- a/extern/mygui_3.0.1/CMakeLists.txt +++ b/extern/mygui_3.0.1/CMakeLists.txt @@ -1,25 +1,5 @@ # Minimal MyGUI build system for OpenMW -cmake_minimum_required(VERSION 2.6) -project(MYGUI) - -# Use Freetype -find_package(Freetype REQUIRED) -set(MYGUI_USE_FREETYPE TRUE) - -# Use Ogre -add_definitions("-DMYGUI_OGRE_PLATFORM") - -# Static linking -set(MYGUI_LIB_TYPE STATIC) -add_definitions(-DMYGUI_STATIC) - -# Setup MyGUIEngine project -add_subdirectory(MyGUIEngine) - -# Setup OgrePlatform -add_subdirectory(OgrePlatform) - # Copy resource files into the build directory set(SDIR ${CMAKE_CURRENT_SOURCE_DIR}/openmw_resources) set(DDIR ${OpenMW_BINARY_DIR}/resources/mygui) diff --git a/extern/mygui_3.0.1/MyGUIEngine/CMakeLists.txt b/extern/mygui_3.0.1/MyGUIEngine/CMakeLists.txt deleted file mode 100644 index 27362e027..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -set (PROJECT_NAME MyGUIEngine) - -project( ${PROJECT_NAME} ) - -include(${PROJECT_NAME}.list) - -include_directories(include) -if (MYGUI_USE_FREETYPE) - include_directories( - ${FREETYPE_INCLUDE_DIRS} - ) - add_definitions(-DMYGUI_USE_FREETYPE) -endif () - -add_definitions(-DMYGUI_BUILD) - -if (WIN32) - add_definitions(-DNOMINMAX) -endif () - -add_library(${PROJECT_NAME} ${MYGUI_LIB_TYPE} ${HEADER_FILES} ${SOURCE_FILES}) -if (MYGUI_USE_FREETYPE) - target_link_libraries(${PROJECT_NAME} - ${FREETYPE_LIBRARIES} - ) -endif() - -# We don't need this lib in OS X. uuid functions is in libc here. -if (NOT APPLE) - target_link_libraries(${PROJECT_NAME} ${CMAKE_DL_LIBS} uuid) -endif(NOT APPLE) - -if (MINGW) - target_link_libraries(${PROJECT_NAME} libwinmm.a) -endif (MINGW) diff --git a/extern/mygui_3.0.1/MyGUIEngine/MyGUIEngine.list b/extern/mygui_3.0.1/MyGUIEngine/MyGUIEngine.list deleted file mode 100644 index 42fa44718..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/MyGUIEngine.list +++ /dev/null @@ -1,561 +0,0 @@ -set (HEADER_FILES - include/MyGUI_Allocator.h - include/MyGUI_CustomAllocator.h - include/MyGUI_DDItemInfo.h - include/MyGUI_IBItemInfo.h - include/MyGUI_MenuItemType.h - include/MyGUI_MessageStyle.h - include/MyGUI_WidgetToolTip.h - include/MyGUI_Button.h - include/MyGUI_Canvas.h - include/MyGUI_ComboBox.h - include/MyGUI_DDContainer.h - include/MyGUI_Edit.h - include/MyGUI_HScroll.h - include/MyGUI_ItemBox.h - include/MyGUI_List.h - include/MyGUI_ListBox.h - include/MyGUI_ListCtrl.h - include/MyGUI_MenuBar.h - include/MyGUI_MenuCtrl.h - include/MyGUI_MenuItem.h - include/MyGUI_Message.h - include/MyGUI_MultiList.h - include/MyGUI_PopupMenu.h - include/MyGUI_Progress.h - include/MyGUI_ScrollView.h - include/MyGUI_StaticImage.h - include/MyGUI_StaticText.h - include/MyGUI_Tab.h - include/MyGUI_TabItem.h - include/MyGUI_VScroll.h - include/MyGUI_Widget.h - include/MyGUI_Window.h - include/MyGUI_IWidgetFactory.h - include/MyGUI_Bitwise.h - include/MyGUI_CoordConverter.h - include/MyGUI_DataFileStream.h - include/MyGUI_DataStream.h - include/MyGUI_Delegate.h - include/MyGUI_DelegateImplement.h - include/MyGUI_DynLib.h - include/MyGUI_Enumerator.h - include/MyGUI_EventPair.h - include/MyGUI_Guid.h - include/MyGUI_RenderOut.h - include/MyGUI_TextChangeHistory.h - include/MyGUI_TextIterator.h - include/MyGUI_TextureUtility.h - include/MyGUI_TextView.h - include/MyGUI_Timer.h - include/MyGUI_UString.h - include/MyGUI_Utility.h - include/MyGUI_WidgetTranslate.h - include/MyGUI_XmlDocument.h - include/MyGUI_LogManager.h - include/MyGUI_LogStream.h - include/MyGUI.h - include/MyGUI_CastWidget.h - include/MyGUI_Common.h - include/MyGUI_Diagnostic.h - include/MyGUI_Exception.h - include/MyGUI_GenericFactory.h - include/MyGUI_Macros.h - include/MyGUI_Platform.h - include/MyGUI_Precompiled.h - include/MyGUI_Prerequest.h - include/MyGUI_RenderFormat.h - include/MyGUI_ResourceHolder.h - include/MyGUI_WidgetDefines.h - include/MyGUI_ICroppedRectangle.h - include/MyGUI_IDataStream.h - include/MyGUI_Instance.h - include/MyGUI_IObject.h - include/MyGUI_ISerializable.h - include/MyGUI_ITexture.h - include/MyGUI_IUnlinkWidget.h - include/MyGUI_IVertexBuffer.h - include/MyGUI_IWidgetCreator.h - include/MyGUI_Plugin.h - include/MyGUI_RTTI.h - include/MyGUI_BiIndexBase.h - include/MyGUI_ScrollViewBase.h - include/MyGUI_WidgetEvent.h - include/MyGUI_WidgetUserData.h - include/MyGUI_EditText.h - include/MyGUI_MainSkin.h - include/MyGUI_RawRect.h - include/MyGUI_RotatingSkin.h - include/MyGUI_SimpleText.h - include/MyGUI_SubSkin.h - include/MyGUI_TileRect.h - include/MyGUI_IStateInfo.h - include/MyGUI_ISubWidget.h - include/MyGUI_ISubWidgetRect.h - include/MyGUI_ISubWidgetText.h - include/MyGUI_LayerItem.h - include/MyGUI_LayerNode.h - include/MyGUI_OverlappedLayer.h - include/MyGUI_RenderItem.h - include/MyGUI_SharedLayer.h - include/MyGUI_SharedLayerNode.h - include/MyGUI_ILayer.h - include/MyGUI_ILayerItem.h - include/MyGUI_ILayerNode.h - include/MyGUI_IRenderTarget.h - include/MyGUI_ActionController.h - include/MyGUI_ControllerEdgeHide.h - include/MyGUI_ControllerFadeAlpha.h - include/MyGUI_ControllerItem.h - include/MyGUI_ControllerPosition.h - include/MyGUI_ResourceImageSet.h - include/MyGUI_ResourceImageSetPointer.h - include/MyGUI_ResourceManualFont.h - include/MyGUI_ResourceManualPointer.h - include/MyGUI_ResourceSkin.h - include/MyGUI_ResourceTrueTypeFont.h - include/MyGUI_IFont.h - include/MyGUI_IPointer.h - include/MyGUI_IResource.h - include/MyGUI_ChildSkinInfo.h - include/MyGUI_FontData.h - include/MyGUI_MaskPickInfo.h - include/MyGUI_SubWidgetBinding.h - include/MyGUI_SubWidgetInfo.h - include/MyGUI_Align.h - include/MyGUI_Any.h - include/MyGUI_Colour.h - include/MyGUI_CommonStateInfo.h - include/MyGUI_ImageInfo.h - include/MyGUI_InputDefine.h - include/MyGUI_RenderTargetInfo.h - include/MyGUI_TCoord.h - include/MyGUI_TPoint.h - include/MyGUI_TRect.h - include/MyGUI_TSize.h - include/MyGUI_Types.h - include/MyGUI_Version.h - include/MyGUI_VertexData.h - include/MyGUI_WidgetStyle.h - include/MyGUI_ClipboardManager.h - include/MyGUI_ControllerManager.h - include/MyGUI_DataManager.h - include/MyGUI_DynLibManager.h - include/MyGUI_FactoryManager.h - include/MyGUI_FontManager.h - include/MyGUI_Gui.h - include/MyGUI_InputManager.h - include/MyGUI_LanguageManager.h - include/MyGUI_LayerManager.h - include/MyGUI_LayoutManager.h - include/MyGUI_PluginManager.h - include/MyGUI_PointerManager.h - include/MyGUI_RenderManager.h - include/MyGUI_ResourceManager.h - include/MyGUI_SkinManager.h - include/MyGUI_SubWidgetManager.h - include/MyGUI_WidgetManager.h -) -set (SOURCE_FILES - src/MyGUI_Button.cpp - src/MyGUI_Canvas.cpp - src/MyGUI_ComboBox.cpp - src/MyGUI_DDContainer.cpp - src/MyGUI_Edit.cpp - src/MyGUI_HScroll.cpp - src/MyGUI_ItemBox.cpp - src/MyGUI_List.cpp - src/MyGUI_ListBox.cpp - src/MyGUI_ListCtrl.cpp - src/MyGUI_MenuBar.cpp - src/MyGUI_MenuCtrl.cpp - src/MyGUI_MenuItem.cpp - src/MyGUI_Message.cpp - src/MyGUI_MultiList.cpp - src/MyGUI_PopupMenu.cpp - src/MyGUI_Progress.cpp - src/MyGUI_ScrollView.cpp - src/MyGUI_StaticImage.cpp - src/MyGUI_StaticText.cpp - src/MyGUI_Tab.cpp - src/MyGUI_TabItem.cpp - src/MyGUI_VScroll.cpp - src/MyGUI_Widget.cpp - src/MyGUI_Window.cpp - src/MyGUI_EditText.cpp - src/MyGUI_MainSkin.cpp - src/MyGUI_RawRect.cpp - src/MyGUI_RotatingSkin.cpp - src/MyGUI_SimpleText.cpp - src/MyGUI_SubSkin.cpp - src/MyGUI_TileRect.cpp - src/MyGUI_LayerItem.cpp - src/MyGUI_LayerNode.cpp - src/MyGUI_OverlappedLayer.cpp - src/MyGUI_RenderItem.cpp - src/MyGUI_SharedLayer.cpp - src/MyGUI_SharedLayerNode.cpp - src/MyGUI_ActionController.cpp - src/MyGUI_ControllerEdgeHide.cpp - src/MyGUI_ControllerFadeAlpha.cpp - src/MyGUI_ControllerPosition.cpp - src/MyGUI_Exception.cpp - src/MyGUI_Precompiled.cpp - src/MyGUI_IWidgetCreator.cpp - src/MyGUI_ScrollViewBase.cpp - src/MyGUI_ResourceImageSet.cpp - src/MyGUI_ResourceImageSetPointer.cpp - src/MyGUI_ResourceManualFont.cpp - src/MyGUI_ResourceManualPointer.cpp - src/MyGUI_ResourceSkin.cpp - src/MyGUI_ResourceTrueTypeFont.cpp - src/MyGUI_MaskPickInfo.cpp - src/MyGUI_Any.cpp - src/MyGUI_Colour.cpp - src/MyGUI_ClipboardManager.cpp - src/MyGUI_ControllerManager.cpp - src/MyGUI_DataManager.cpp - src/MyGUI_DynLibManager.cpp - src/MyGUI_FactoryManager.cpp - src/MyGUI_FontManager.cpp - src/MyGUI_Gui.cpp - src/MyGUI_InputManager.cpp - src/MyGUI_LanguageManager.cpp - src/MyGUI_LayerManager.cpp - src/MyGUI_LayoutManager.cpp - src/MyGUI_PluginManager.cpp - src/MyGUI_PointerManager.cpp - src/MyGUI_RenderManager.cpp - src/MyGUI_ResourceManager.cpp - src/MyGUI_SkinManager.cpp - src/MyGUI_SubWidgetManager.cpp - src/MyGUI_WidgetManager.cpp - src/MyGUI_DataFileStream.cpp - src/MyGUI_DataStream.cpp - src/MyGUI_DynLib.cpp - src/MyGUI_Guid.cpp - src/MyGUI_RenderOut.cpp - src/MyGUI_TextIterator.cpp - src/MyGUI_TextureUtility.cpp - src/MyGUI_Timer.cpp - src/MyGUI_XmlDocument.cpp - src/MyGUI_LogManager.cpp - src/MyGUI_LogStream.cpp -) -SOURCE_GROUP("Source Files\\Widget\\Widget" FILES - src/MyGUI_Button.cpp - src/MyGUI_Canvas.cpp - src/MyGUI_ComboBox.cpp - src/MyGUI_DDContainer.cpp - src/MyGUI_Edit.cpp - src/MyGUI_HScroll.cpp - src/MyGUI_ItemBox.cpp - src/MyGUI_List.cpp - src/MyGUI_ListBox.cpp - src/MyGUI_ListCtrl.cpp - src/MyGUI_MenuBar.cpp - src/MyGUI_MenuCtrl.cpp - src/MyGUI_MenuItem.cpp - src/MyGUI_Message.cpp - src/MyGUI_MultiList.cpp - src/MyGUI_PopupMenu.cpp - src/MyGUI_Progress.cpp - src/MyGUI_ScrollView.cpp - src/MyGUI_StaticImage.cpp - src/MyGUI_StaticText.cpp - src/MyGUI_Tab.cpp - src/MyGUI_TabItem.cpp - src/MyGUI_VScroll.cpp - src/MyGUI_Widget.cpp - src/MyGUI_Window.cpp -) -SOURCE_GROUP("Source Files\\Widget" FILES -) -SOURCE_GROUP("Source Files\\Core\\SubWidget" FILES - src/MyGUI_EditText.cpp - src/MyGUI_MainSkin.cpp - src/MyGUI_RawRect.cpp - src/MyGUI_RotatingSkin.cpp - src/MyGUI_SimpleText.cpp - src/MyGUI_SubSkin.cpp - src/MyGUI_TileRect.cpp -) -SOURCE_GROUP("Source Files\\Core\\LayerItem" FILES - src/MyGUI_LayerItem.cpp - src/MyGUI_LayerNode.cpp - src/MyGUI_OverlappedLayer.cpp - src/MyGUI_RenderItem.cpp - src/MyGUI_SharedLayer.cpp - src/MyGUI_SharedLayerNode.cpp -) -SOURCE_GROUP("Source Files\\Core\\Controller" FILES - src/MyGUI_ActionController.cpp - src/MyGUI_ControllerEdgeHide.cpp - src/MyGUI_ControllerFadeAlpha.cpp - src/MyGUI_ControllerPosition.cpp -) -SOURCE_GROUP("Source Files\\Core\\Common\\Interfaces" FILES - src/MyGUI_IWidgetCreator.cpp -) -SOURCE_GROUP("Source Files\\Core\\Common\\Base" FILES - src/MyGUI_ScrollViewBase.cpp -) -SOURCE_GROUP("Source Files\\Core\\Common" FILES - src/MyGUI_Exception.cpp - src/MyGUI_Precompiled.cpp -) -SOURCE_GROUP("Source Files\\Core\\Resource\\Data" FILES - src/MyGUI_MaskPickInfo.cpp -) -SOURCE_GROUP("Source Files\\Core\\Resource" FILES - src/MyGUI_ResourceImageSet.cpp - src/MyGUI_ResourceImageSetPointer.cpp - src/MyGUI_ResourceManualFont.cpp - src/MyGUI_ResourceManualPointer.cpp - src/MyGUI_ResourceSkin.cpp - src/MyGUI_ResourceTrueTypeFont.cpp -) -SOURCE_GROUP("Source Files\\Core\\Types" FILES - src/MyGUI_Any.cpp - src/MyGUI_Colour.cpp -) -SOURCE_GROUP("Source Files\\Core\\Manager" FILES - src/MyGUI_ClipboardManager.cpp - src/MyGUI_ControllerManager.cpp - src/MyGUI_DataManager.cpp - src/MyGUI_DynLibManager.cpp - src/MyGUI_FactoryManager.cpp - src/MyGUI_FontManager.cpp - src/MyGUI_Gui.cpp - src/MyGUI_InputManager.cpp - src/MyGUI_LanguageManager.cpp - src/MyGUI_LayerManager.cpp - src/MyGUI_LayoutManager.cpp - src/MyGUI_PluginManager.cpp - src/MyGUI_PointerManager.cpp - src/MyGUI_RenderManager.cpp - src/MyGUI_ResourceManager.cpp - src/MyGUI_SkinManager.cpp - src/MyGUI_SubWidgetManager.cpp - src/MyGUI_WidgetManager.cpp -) -SOURCE_GROUP("Source Files\\Core" FILES -) -SOURCE_GROUP("Source Files\\Utility\\Logging" FILES - src/MyGUI_LogManager.cpp - src/MyGUI_LogStream.cpp -) -SOURCE_GROUP("Source Files\\Utility" FILES - src/MyGUI_DataFileStream.cpp - src/MyGUI_DataStream.cpp - src/MyGUI_DynLib.cpp - src/MyGUI_Guid.cpp - src/MyGUI_RenderOut.cpp - src/MyGUI_TextIterator.cpp - src/MyGUI_TextureUtility.cpp - src/MyGUI_Timer.cpp - src/MyGUI_XmlDocument.cpp -) -SOURCE_GROUP("Source Files" FILES -) -SOURCE_GROUP("Header Files\\Widget\\Types" FILES - include/MyGUI_DDItemInfo.h - include/MyGUI_IBItemInfo.h - include/MyGUI_MenuItemType.h - include/MyGUI_MessageStyle.h - include/MyGUI_WidgetToolTip.h -) -SOURCE_GROUP("Header Files\\Widget\\Widget" FILES - include/MyGUI_Button.h - include/MyGUI_Canvas.h - include/MyGUI_ComboBox.h - include/MyGUI_DDContainer.h - include/MyGUI_Edit.h - include/MyGUI_HScroll.h - include/MyGUI_ItemBox.h - include/MyGUI_List.h - include/MyGUI_ListBox.h - include/MyGUI_ListCtrl.h - include/MyGUI_MenuBar.h - include/MyGUI_MenuCtrl.h - include/MyGUI_MenuItem.h - include/MyGUI_Message.h - include/MyGUI_MultiList.h - include/MyGUI_PopupMenu.h - include/MyGUI_Progress.h - include/MyGUI_ScrollView.h - include/MyGUI_StaticImage.h - include/MyGUI_StaticText.h - include/MyGUI_Tab.h - include/MyGUI_TabItem.h - include/MyGUI_VScroll.h - include/MyGUI_Widget.h - include/MyGUI_Window.h -) -SOURCE_GROUP("Header Files\\Widget\\Interfaces" FILES - include/MyGUI_IWidgetFactory.h -) -SOURCE_GROUP("Header Files\\Widget" FILES -) -SOURCE_GROUP("Header Files\\Utility\\Logging" FILES - include/MyGUI_LogManager.h - include/MyGUI_LogStream.h -) -SOURCE_GROUP("Header Files\\Utility" FILES - include/MyGUI_Bitwise.h - include/MyGUI_CoordConverter.h - include/MyGUI_DataFileStream.h - include/MyGUI_DataStream.h - include/MyGUI_Delegate.h - include/MyGUI_DelegateImplement.h - include/MyGUI_DynLib.h - include/MyGUI_Enumerator.h - include/MyGUI_EventPair.h - include/MyGUI_Guid.h - include/MyGUI_RenderOut.h - include/MyGUI_TextChangeHistory.h - include/MyGUI_TextIterator.h - include/MyGUI_TextureUtility.h - include/MyGUI_TextView.h - include/MyGUI_Timer.h - include/MyGUI_UString.h - include/MyGUI_Utility.h - include/MyGUI_WidgetTranslate.h - include/MyGUI_XmlDocument.h -) -SOURCE_GROUP("Header Files\\Core\\Common\\Interfaces" FILES - include/MyGUI_ICroppedRectangle.h - include/MyGUI_IDataStream.h - include/MyGUI_Instance.h - include/MyGUI_IObject.h - include/MyGUI_ISerializable.h - include/MyGUI_ITexture.h - include/MyGUI_IUnlinkWidget.h - include/MyGUI_IVertexBuffer.h - include/MyGUI_IWidgetCreator.h - include/MyGUI_Plugin.h - include/MyGUI_RTTI.h -) -SOURCE_GROUP("Header Files\\Core\\Common\\Base" FILES - include/MyGUI_BiIndexBase.h - include/MyGUI_ScrollViewBase.h - include/MyGUI_WidgetEvent.h - include/MyGUI_WidgetUserData.h -) -SOURCE_GROUP("Header Files\\Core\\Common" FILES - include/MyGUI.h - include/MyGUI_CastWidget.h - include/MyGUI_Common.h - include/MyGUI_Diagnostic.h - include/MyGUI_Exception.h - include/MyGUI_GenericFactory.h - include/MyGUI_Macros.h - include/MyGUI_Platform.h - include/MyGUI_Precompiled.h - include/MyGUI_Prerequest.h - include/MyGUI_RenderFormat.h - include/MyGUI_ResourceHolder.h - include/MyGUI_WidgetDefines.h -) -SOURCE_GROUP("Header Files\\Core\\SubWidget\\Interfaces" FILES - include/MyGUI_IStateInfo.h - include/MyGUI_ISubWidget.h - include/MyGUI_ISubWidgetRect.h - include/MyGUI_ISubWidgetText.h -) -SOURCE_GROUP("Header Files\\Core\\SubWidget" FILES - include/MyGUI_EditText.h - include/MyGUI_MainSkin.h - include/MyGUI_RawRect.h - include/MyGUI_RotatingSkin.h - include/MyGUI_SimpleText.h - include/MyGUI_SubSkin.h - include/MyGUI_TileRect.h -) -SOURCE_GROUP("Header Files\\Core\\LayerItem\\Interfaces" FILES - include/MyGUI_ILayer.h - include/MyGUI_ILayerItem.h - include/MyGUI_ILayerNode.h - include/MyGUI_IRenderTarget.h -) -SOURCE_GROUP("Header Files\\Core\\LayerItem" FILES - include/MyGUI_LayerItem.h - include/MyGUI_LayerNode.h - include/MyGUI_OverlappedLayer.h - include/MyGUI_RenderItem.h - include/MyGUI_SharedLayer.h - include/MyGUI_SharedLayerNode.h -) -SOURCE_GROUP("Header Files\\Core\\Controller" FILES - include/MyGUI_ActionController.h - include/MyGUI_ControllerEdgeHide.h - include/MyGUI_ControllerFadeAlpha.h - include/MyGUI_ControllerItem.h - include/MyGUI_ControllerPosition.h -) -SOURCE_GROUP("Header Files\\Core\\Resource\\Interface" FILES - include/MyGUI_IFont.h - include/MyGUI_IPointer.h - include/MyGUI_IResource.h -) -SOURCE_GROUP("Header Files\\Core\\Resource\\Data" FILES - include/MyGUI_ChildSkinInfo.h - include/MyGUI_FontData.h - include/MyGUI_MaskPickInfo.h - include/MyGUI_SubWidgetBinding.h - include/MyGUI_SubWidgetInfo.h -) -SOURCE_GROUP("Header Files\\Core\\Resource" FILES - include/MyGUI_ResourceImageSet.h - include/MyGUI_ResourceImageSetPointer.h - include/MyGUI_ResourceManualFont.h - include/MyGUI_ResourceManualPointer.h - include/MyGUI_ResourceSkin.h - include/MyGUI_ResourceTrueTypeFont.h -) -SOURCE_GROUP("Header Files\\Core\\Types" FILES - include/MyGUI_Align.h - include/MyGUI_Any.h - include/MyGUI_Colour.h - include/MyGUI_CommonStateInfo.h - include/MyGUI_ImageInfo.h - include/MyGUI_InputDefine.h - include/MyGUI_RenderTargetInfo.h - include/MyGUI_TCoord.h - include/MyGUI_TPoint.h - include/MyGUI_TRect.h - include/MyGUI_TSize.h - include/MyGUI_Types.h - include/MyGUI_Version.h - include/MyGUI_VertexData.h - include/MyGUI_WidgetStyle.h -) -SOURCE_GROUP("Header Files\\Core\\Manager" FILES - include/MyGUI_ClipboardManager.h - include/MyGUI_ControllerManager.h - include/MyGUI_DataManager.h - include/MyGUI_DynLibManager.h - include/MyGUI_FactoryManager.h - include/MyGUI_FontManager.h - include/MyGUI_Gui.h - include/MyGUI_InputManager.h - include/MyGUI_LanguageManager.h - include/MyGUI_LayerManager.h - include/MyGUI_LayoutManager.h - include/MyGUI_PluginManager.h - include/MyGUI_PointerManager.h - include/MyGUI_RenderManager.h - include/MyGUI_ResourceManager.h - include/MyGUI_SkinManager.h - include/MyGUI_SubWidgetManager.h - include/MyGUI_WidgetManager.h -) -SOURCE_GROUP("Header Files\\Core" FILES -) -SOURCE_GROUP("Header Files" FILES - include/MyGUI_Allocator.h - include/MyGUI_CustomAllocator.h -) -SOURCE_GROUP("" FILES - CMakeLists.txt -) diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI.h deleted file mode 100644 index db960fc8b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI.h +++ /dev/null @@ -1,92 +0,0 @@ -/*! - @file - @author Georgiy Evmenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_H__ -#define __MYGUI_H__ - -#include "MyGUI_Gui.h" - -#include "MyGUI_Button.h" -#include "MyGUI_ComboBox.h" -#include "MyGUI_Edit.h" -#include "MyGUI_HScroll.h" -#include "MyGUI_List.h" -#include "MyGUI_StaticText.h" -#include "MyGUI_StaticImage.h" -#include "MyGUI_Tab.h" -#include "MyGUI_TabItem.h" -#include "MyGUI_VScroll.h" -#include "MyGUI_Window.h" -#include "MyGUI_Progress.h" -#include "MyGUI_Message.h" -#include "MyGUI_ItemBox.h" -#include "MyGUI_MultiList.h" -#include "MyGUI_MenuCtrl.h" -#include "MyGUI_MenuItem.h" -#include "MyGUI_PopupMenu.h" -#include "MyGUI_MenuBar.h" -#include "MyGUI_ScrollView.h" -#include "MyGUI_DDContainer.h" -#include "MyGUI_Canvas.h" -#include "MyGUI_ListCtrl.h" -#include "MyGUI_ListBox.h" - -#include "MyGUI_InputManager.h" -#include "MyGUI_SubWidgetManager.h" -#include "MyGUI_ClipboardManager.h" -#include "MyGUI_LayerManager.h" -#include "MyGUI_LogManager.h" -#include "MyGUI_SkinManager.h" -#include "MyGUI_WidgetManager.h" -#include "MyGUI_LayoutManager.h" -#include "MyGUI_FontManager.h" -#include "MyGUI_PointerManager.h" -#include "MyGUI_PluginManager.h" -#include "MyGUI_DynLibManager.h" -#include "MyGUI_ControllerManager.h" -#include "MyGUI_LanguageManager.h" -#include "MyGUI_ResourceManager.h" -#include "MyGUI_RenderManager.h" -#include "MyGUI_DataManager.h" -#include "MyGUI_FactoryManager.h" - -#include "MyGUI_ActionController.h" -#include "MyGUI_ControllerEdgeHide.h" -#include "MyGUI_ControllerFadeAlpha.h" -#include "MyGUI_ControllerPosition.h" -#include "MyGUI_CoordConverter.h" -#include "MyGUI_IResource.h" -#include "MyGUI_CastWidget.h" -#include "MyGUI_Any.h" -#include "MyGUI_MenuItemType.h" -#include "MyGUI_Version.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_WidgetStyle.h" -#include "MyGUI_IObject.h" -#include "MyGUI_ISerializable.h" -#include "MyGUI_RenderOut.h" - -#include "MyGUI_RawRect.h" -#include "MyGUI_RotatingSkin.h" -#include "MyGUI_TextureUtility.h" - -#endif // __MYGUI_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ActionController.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ActionController.h deleted file mode 100644 index 7f89b4fd3..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ActionController.h +++ /dev/null @@ -1,75 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ACTION_CONTROLLER_H__ -#define __MYGUI_ACTION_CONTROLLER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include - -namespace MyGUI -{ - - namespace action - { - - /** Function used for hiding widget with one of controller event */ - void MYGUI_EXPORT actionWidgetHide(Widget* _widget); - - /** Function used for showing widget with one of controller event */ - void MYGUI_EXPORT actionWidgetShow(Widget* _widget); - - /** Function used for destroying widget with one of controller event */ - void MYGUI_EXPORT actionWidgetDestroy(Widget* _widget); - - /** Function for ControllerPosition per frame action : Move with constant speed */ - void MYGUI_EXPORT linearMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _k); - - /** Function for ControllerPosition per frame action : Move with accelerated speed - if N == 10 then this function is same as linearMoveFunction - if N > 10 speed will be increasing - if N < 10 speed will be decreasing - */ - template - inline void acceleratedMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _current_time) - { - float k = (float)pow (_current_time, N/10.f /*3 by default as Accelerated and 0.4 by default as Slowed*/); - linearMoveFunction(_startRect, _destRect, _result, k); - } - - /** Function for ControllerPosition per frame action : Move with accelerated speed a bit farther than necessary and then return it back */ - template - inline void jumpMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _current_time) - { - float k = pow (_current_time, 2) * (-2 - N/10.f) + _current_time * (3 + N/10.f); - linearMoveFunction(_startRect, _destRect, _result, k); - } - - /** Function for ControllerPosition per frame action : Start with zero speed increasing half time and then decreasing to zero */ - void MYGUI_EXPORT inertionalMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _current_time); - - } // namespace action - -} // namespace MyGUI - -#endif // __MYGUI_ACTION_CONTROLLER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Align.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Align.h deleted file mode 100644 index ca1e6c64a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Align.h +++ /dev/null @@ -1,202 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 08/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ALIGN_H__ -#define __MYGUI_ALIGN_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Macros.h" -#include "MyGUI_Diagnostic.h" -#include - -namespace MyGUI -{ - - struct MYGUI_EXPORT Align - { - enum Enum - { - HCenter = MYGUI_FLAG_NONE, /**< center horizontally */ - VCenter = MYGUI_FLAG_NONE, /**< center vertically */ - Center = HCenter | VCenter, /**< center in the dead center */ - - Left = MYGUI_FLAG(1), /**< value from the left (and center vertically) */ - Right = MYGUI_FLAG(2), /**< value from the right (and center vertically) */ - HStretch = Left | Right, /**< stretch horizontally proportionate to parent window (and center vertically) */ - - Top = MYGUI_FLAG(3), /**< value from the top (and center horizontally) */ - Bottom = MYGUI_FLAG(4), /**< value from the bottom (and center horizontally) */ - VStretch = Top | Bottom, /**< stretch vertically proportionate to parent window (and center horizontally) */ - - Stretch = HStretch | VStretch, /**< stretch proportionate to parent window */ - Default = Left | Top, /**< default value (value from left and top) */ - - HRelative = MYGUI_FLAG(5), - VRelative = MYGUI_FLAG(6), - Relative = HRelative | VRelative - }; - - Align(Enum _value = Default) : value(_value) { } - - bool isHCenter() const { return HCenter == (value & ((int)HStretch | (int)HRelative)); } - bool isVCenter() const { return VCenter == (value & ((int)VStretch | (int)VRelative)); } - bool isCenter() const { return Center == (value & ((int)Stretch | (int)Relative)); } - - bool isLeft() const { return Left == (value & ((int)HStretch | (int)HRelative)); } - bool isRight() const { return Right == (value & ((int)HStretch | (int)HRelative)); } - bool isHStretch() const { return HStretch == (value & ((int)HStretch | (int)HRelative)); } - - bool isTop() const { return Top == (value & ((int)VStretch | (int)VRelative)); } - bool isBottom() const { return (Bottom == (value & ((int)VStretch | (int)VRelative))); } - bool isVStretch() const { return (VStretch == (value & ((int)VStretch | (int)VRelative))); } - - bool isStretch() const { return (Stretch == (value & ((int)Stretch | (int)Relative))); } - bool isDefault() const { return (Default == (value & ((int)Stretch | (int)Relative))); } - - bool isHRelative() const { return HRelative == (value & (int)HRelative); } - bool isVRelative() const { return VRelative == (value & (int)VRelative); } - bool isRelative() const { return Relative == (value & (int)Relative); } - - Align& operator |= (Align const& _other) { value = Enum(int(value) | int(_other.value)); return *this; } - friend Align operator | (Enum const& a, Enum const& b) { return Align(Enum(int(a) | int(b))); } - friend Align operator | (Align const& a, Align const& b) { return Align(Enum(int(a.value) | int(b.value))); } - - friend bool operator == (Align const& a, Align const& b) { return a.value == b.value; } - friend bool operator != (Align const& a, Align const& b) { return a.value != b.value; } - - typedef std::map MapAlign; - - static Align parse(const std::string& _value) - { - Align result(Enum(0)); - const MapAlign& map_names = result.getValueNames(); - const std::vector& vec = utility::split(_value); - for (size_t pos=0; possecond)); - } - } - return result; - } - - std::string print() const - { - std::string result; - - if (value & Left) - { - if (value & Right) result = "HStretch"; - else result = "Left"; - } - else if (value & Right) result = "Right"; - else result = "HCenter"; - - if (value & Top) - { - if (value & Bottom) result += " VStretch"; - else result += " Top"; - } - else if (value & Bottom) result += " Bottom"; - else result += " VCenter"; - - return result; - } - - friend std::ostream& operator << ( std::ostream& _stream, const Align& _value ) - { - _stream << _value.print(); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, Align& _value ) - { - _value.value = Enum(0); - std::string value; - _stream >> value; - - const MapAlign& map_names = _value.getValueNames(); - MapAlign::const_iterator iter = map_names.find(value); - if (iter != map_names.end()) - _value.value = Enum(int(_value.value) | int(iter->second)); - - - if (!_stream.eof()) - { - std::string value2; - _stream >> value2; - iter = map_names.find(value2); - if (iter != map_names.end()) - _value.value = Enum(int(_value.value) | int(iter->second)); - } - - return _stream; - } - - private: - const MapAlign& getValueNames() const - { - static MapAlign map_names; - - if (map_names.empty()) - { - // OBSOLETE - map_names["ALIGN_HCENTER"] = HCenter; - map_names["ALIGN_VCENTER"] = VCenter; - map_names["ALIGN_CENTER"] = Center; - map_names["ALIGN_LEFT"] = Left; - map_names["ALIGN_RIGHT"] = Right; - map_names["ALIGN_HSTRETCH"] = HStretch; - map_names["ALIGN_TOP"] = Top; - map_names["ALIGN_BOTTOM"] = Bottom; - map_names["ALIGN_VSTRETCH"] = VStretch; - map_names["ALIGN_STRETCH"] = Stretch; - map_names["ALIGN_DEFAULT"] = Default; - - MYGUI_REGISTER_VALUE(map_names, HCenter); - MYGUI_REGISTER_VALUE(map_names, VCenter); - MYGUI_REGISTER_VALUE(map_names, Center); - MYGUI_REGISTER_VALUE(map_names, Left); - MYGUI_REGISTER_VALUE(map_names, Right); - MYGUI_REGISTER_VALUE(map_names, HStretch); - MYGUI_REGISTER_VALUE(map_names, Top); - MYGUI_REGISTER_VALUE(map_names, Bottom); - MYGUI_REGISTER_VALUE(map_names, VStretch); - MYGUI_REGISTER_VALUE(map_names, Stretch); - MYGUI_REGISTER_VALUE(map_names, Default); - MYGUI_REGISTER_VALUE(map_names, HRelative); - MYGUI_REGISTER_VALUE(map_names, VRelative); - MYGUI_REGISTER_VALUE(map_names, Relative); - } - - return map_names; - } - - private: - Enum value; - }; - -} // namespace MyGUI - -#endif // __MYGUI_ALIGN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Allocator.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Allocator.h deleted file mode 100644 index ca107dcbd..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Allocator.h +++ /dev/null @@ -1,89 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ALLOCATOR_H__ -#define __MYGUI_ALLOCATOR_H__ - -#include -#include - -namespace MyGUI -{ - - template - class Allocator - { - public: - // typedefs - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - public: - // convert an allocator to allocator - template - struct rebind - { - typedef Allocator other; - }; - - public: - inline explicit Allocator() { } - inline ~Allocator() { } - template - inline explicit Allocator(Allocator const&) { } - - // address - inline pointer address(reference r) { return &r; } - inline const_pointer address(const_reference r) { return &r; } - - // memory allocation - inline pointer allocate(size_type cnt, typename std::allocator::const_pointer = 0) - { - return reinterpret_cast(::operator new (cnt * sizeof (T))); - } - inline void deallocate(pointer p, size_type) - { - ::operator delete (p); - } - - // size - inline size_type max_size() const - { - return std::numeric_limits::max() / sizeof(T); - } - - // construction/destruction - inline void construct(pointer p, const T& t) { new (p) T(t); } - inline void destroy(pointer p) { p->~T(); } - - inline bool operator==(Allocator const&) { return true; } - inline bool operator!=(Allocator const& a) { return !operator==(a); } - }; - -} // namespace MyGUI - -#endif // __MYGUI_ALLOCATOR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Any.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Any.h deleted file mode 100644 index bf5ae0fbe..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Any.h +++ /dev/null @@ -1,213 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -// -- Based on boost::any, original copyright information follows -- -// Copyright Kevlin Henney, 2000, 2001, 2002. All rights reserved. -// -// Distributed under the Boost Software License, Version 1.0. -// (See at http://www.boost.org/LICENSE_1_0.txt) -// -- End original copyright -- - -#ifndef __MYGUI_ANY_H__ -#define __MYGUI_ANY_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Diagnostic.h" -#include -#include - -namespace MyGUI -{ - - /** @example "Class Any usage" - @code - void f() - { - // RU: теÑтовый клаÑÑ, Ñ Ð¿Ñ€Ð¾Ñтыми типами вÑе аналогично - // EN: test class, with simple types all is similar - struct Data { int value; }; - - // RU: ÑкземплÑÑ€ и Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ - // EN: instance and initialization - Data data; - data.value = 0xDEAD; - - // RU: ÑоздаÑÑ‚ÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ»Ð°ÑÑа Data - // EN: copy of class Data will be created - MyGUI::Any any = data; - // RU: ÐºÐ¾Ð¿Ð¸Ñ ÐºÐ»Ð°ÑÑа Data - // EN: copy of class Data - Data copy_data = *any.castType(); - // RU: теперь value == 0xDEAD - // EN: now value == 0xDEAD - int value = copy_data.value; - - - // RU: ÑоздаÑÑ‚ÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° клаÑÑ Data - // EN: copy of pointer on class Data will be created - any = &data; - // RU: ÐºÐ¾Ð¿Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° клаÑÑ Data и конкретно на объект data - // EN: copy of pointer on class Data and on object data - Data * copy_ptr = *any.castType(); - // RU: теперь data.value == 0 - // EN: now value == 0 - copy_ptr->value = 0; - - } - @endcode - */ - - class MYGUI_EXPORT Any - { - - private: - struct AnyEmpty { }; - - public: - static AnyEmpty Null; - - public: - Any() : - mContent(nullptr) - { - } - - template Any(const ValueType& value) : - mContent(new Holder(value)) - { - } - - Any(const Any::AnyEmpty& value) : - mContent(nullptr) - { - } - - Any(const Any& other) : - mContent(other.mContent ? other.mContent->clone() : nullptr) - { - } - - ~Any() - { - delete mContent; - } - - Any& swap(Any& rhs) - { - std::swap(mContent, rhs.mContent); - return *this; - } - - template Any& operator = (const ValueType& rhs) - { - Any(rhs).swap(*this); - return *this; - } - - Any& operator = (const Any::AnyEmpty& rhs) - { - delete mContent; - mContent = nullptr; - return *this; - } - - Any& operator = (const Any& rhs) - { - Any(rhs).swap(*this); - return *this; - } - - bool empty() const - { - return !mContent; - } - - const std::type_info& getType() const - { - return mContent ? mContent->getType() : typeid(void); - } - - template - ValueType * castType(bool _throw = true) const - { - if (this->getType() == typeid(ValueType)) - { - return &static_cast *>(this->mContent)->held; - } - MYGUI_ASSERT(!_throw, "Bad cast from type '" << getType().name() << "' to '" << typeid(ValueType).name() << "'"); - return nullptr; - } - - void * castUnsafe() const - { - return mContent ? static_cast *>(this->mContent)->held : nullptr; - } - - private: - class Placeholder - { - public: - virtual ~Placeholder() { } - - public: - virtual const std::type_info& getType() const = 0; - virtual Placeholder * clone() const = 0; - - }; - - template class Holder : public Placeholder - { - public: - Holder(const ValueType& value) : - held(value) - { - } - - public: - virtual const std::type_info& getType() const - { - return typeid(ValueType); - } - - virtual Placeholder * clone() const - { - return new Holder(held); - } - - public: - ValueType held; - - private: - Holder& operator=(const Holder &); - - }; - - - private: // representation - Placeholder * mContent; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_ANY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_BiIndexBase.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_BiIndexBase.h deleted file mode 100644 index f9f38a76d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_BiIndexBase.h +++ /dev/null @@ -1,216 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_BIINDEX_BASE_H__ -#define __MYGUI_BIINDEX_BASE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - class BiIndexBase - { - public: - virtual ~BiIndexBase() { } - protected: - - size_t getIndexCount() { return mIndexFace.size(); } - - size_t insertItemAt(size_t _index) - { - #if MYGUI_DEBUG_MODE == 1 - MYGUI_ASSERT_RANGE_INSERT(_index, mIndexFace.size(), "BiIndexBase::insertItemAt"); - checkIndexes(); - #endif - - if (_index == MyGUI::ITEM_NONE) _index = mIndexFace.size(); - - size_t index; - - if (_index == mIndexFace.size()) - { - // Ð´Ð»Ñ Ð²Ñтавки айтема - index = mIndexFace.size(); - - mIndexFace.push_back(_index); - mIndexBack.push_back(_index); - } - else - { - // Ð´Ð»Ñ Ð²Ñтавки айтема - index = mIndexFace[_index]; - - size_t count = mIndexFace.size(); - for (size_t pos=0; pos= index) mIndexFace[pos]++; - } - mIndexFace.insert(mIndexFace.begin() + _index, index); - - count ++; - mIndexBack.push_back(0); - for (size_t pos=0; pos index) mIndexFace[pos]--; - mIndexBack[mIndexFace[pos]] = pos; - } - - #if MYGUI_DEBUG_MODE == 1 - checkIndexes(); - #endif - - return index; - } - - void removeAllItems() - { - mIndexFace.clear(); - mIndexBack.clear(); - } - - // на входе индекÑÑ‹ пользователÑ, на выходе реальные индекÑÑ‹ - size_t convertToBack(size_t _index) const - { - #if MYGUI_DEBUG_MODE == 1 - MYGUI_ASSERT_RANGE_AND_NONE(_index, mIndexFace.size(), "BiIndexBase::convertToBack"); - #endif - return _index == ITEM_NONE ? ITEM_NONE : mIndexFace[_index]; - } - - // на входе индекÑÑ‹ реальные, на выходе, то что видит пользователь - size_t convertToFace(size_t _index) const - { - #if MYGUI_DEBUG_MODE == 1 - MYGUI_ASSERT_RANGE_AND_NONE(_index, mIndexFace.size(), "BiIndexBase::convertToFace"); - #endif - return _index == ITEM_NONE ? ITEM_NONE : mIndexBack[_index]; - } - - // менÑет меÑтами два индекÑа, индекÑÑ‹ Ñо Ñтороны Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - void swapItemsFaceAt(size_t _index1, size_t _index2) - { - #if MYGUI_DEBUG_MODE == 1 - MYGUI_ASSERT_RANGE(_index1, mIndexFace.size(), "BiIndexBase::swapItemsFaceAt"); - MYGUI_ASSERT_RANGE(_index2, mIndexFace.size(), "BiIndexBase::swapItemsFaceAt"); - #endif - - std::swap(mIndexFace[_index1], mIndexFace[_index2]); - std::swap(mIndexBack[mIndexFace[_index1]], mIndexBack[mIndexFace[_index2]]); - } - - // менÑет меÑтами два индекÑа, индекÑÑ‹ Ñо Ñторонны данных - void swapItemsBackAt(size_t _index1, size_t _index2) - { - #if MYGUI_DEBUG_MODE == 1 - MYGUI_ASSERT_RANGE(_index1, mIndexFace.size(), "BiIndexBase::swapItemsBackAt"); - MYGUI_ASSERT_RANGE(_index2, mIndexFace.size(), "BiIndexBase::swapItemsBackAt"); - #endif - - std::swap(mIndexBack[_index1], mIndexBack[_index2]); - std::swap(mIndexFace[mIndexBack[_index1]], mIndexFace[mIndexBack[_index2]]); - } - - #if MYGUI_DEBUG_MODE == 1 - - void checkIndexes() - { - assert(mIndexFace.size() == mIndexBack.size()); - - // проверÑем на уникальноÑÑ‚ÑŒ каждого индекÑа в маппинге - std::vector vec; - size_t count = mIndexFace.size(); - - vec.reserve(count); - for (size_t pos=0; pos= count) throw new std::exception(); - - // макÑимум - index = mIndexFace[pos]; - if (index >= count) throw new std::exception(); - - if (vec[index]) throw new std::exception(); - vec[index] = true; - } - - for (size_t pos=0; pos VectorSizeT; - - // маппинг Ñ Ð¸Ð½Ð´ÐµÐºÑов, которые видны наружу - // на индекÑÑ‹ которые реально иÑпользуютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ - VectorSizeT mIndexFace; - - // маппинг Ñ Ð¸Ð½Ð´ÐµÐºÑов, которые иÑпользуют данные - // на индекÑÑ‹ которые виндны наружу - VectorSizeT mIndexBack; - }; - -} // namespace MyGUI - -#endif // __MYGUI_BIINDEX_BASE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Bitwise.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Bitwise.h deleted file mode 100644 index 9ba9cc298..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Bitwise.h +++ /dev/null @@ -1,78 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_BITWISE_H__ -#define __MYGUI_BITWISE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - class Bitwise - { - public: - /** Returns the closest power-of-two number greater or equal to value. - */ - template - static MYGUI_FORCEINLINE Type firstPO2From(Type _value) - { - --_value; - _value |= _value >> 16; - _value |= _value >> 8; - _value |= _value >> 4; - _value |= _value >> 2; - _value |= _value >> 1; - ++_value; - return _value; - } - - /** Determines whether the number is power-of-two or not. */ - template - static MYGUI_FORCEINLINE bool isPO2(Type _value) - { - return (_value & (_value-1)) == 0; - } - - /** Returns the number of bits a pattern must be shifted right by to - remove right-hand zeros. - */ - template - static MYGUI_FORCEINLINE size_t getBitShift(Type _mask) - { - if (_mask == 0) - return 0; - - size_t result = 0; - while ((_mask & 1) == 0) - { - ++result; - _mask >>= 1; - } - return result; - } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_BITWISE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Button.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Button.h deleted file mode 100644 index 0766de105..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Button.h +++ /dev/null @@ -1,111 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_BUTTON_H__ -#define __MYGUI_BUTTON_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_StaticText.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT Button : - public StaticText - { - MYGUI_RTTI_DERIVED( Button ) - - public: - Button(); - - //! OLD Set button check state - void setButtonPressed(bool _value) { setStateCheck(_value); } - //! OLD Get buton check - bool getButtonPressed() { return getStateCheck(); } - - //! Set button check state - void setStateCheck(bool _value); - - //! Get buton check - bool getStateCheck() { return mIsStateCheck; } - - //! Set image index (image should be defined in skin) - void setImageIndex(size_t _value); - //! Get image index - size_t getImageIndex(); - - /** Enable or disable Image mode\n - Image mode: when button state changed Image on button also change it's picture.\n - Disabled (false) by default. - */ - void setModeImage(bool _value); - /** Get Image mode flag */ - bool getModeImage() { return mModeImage; } - - /** Get pointer to glyph image for this button (if it exist in button skin) */ - StaticImage* getStaticImage() { return mImage; } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - void _setMouseFocus(bool _focus); - - protected: - virtual ~Button(); - - virtual void baseChangeWidgetSkin(ResourceSkin* _info); - - virtual void onMouseLostFocus(Widget* _new); - virtual void onMouseSetFocus(Widget* _old); - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); - - virtual void baseUpdateEnable(); - - bool _setState(const std::string& _value); - void setImageResource(const std::string& _name); - - private: - void updateButtonState(); - - void shutdownWidgetSkin(); - void initialiseWidgetSkin(ResourceSkin* _info); - - private: - // нажата ли кнопка - bool mIsMousePressed; - // в фокуÑе ли кнопка - bool mIsMouseFocus; - // ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ нажата или нет - bool mIsStateCheck; - - StaticImage* mImage; - bool mModeImage; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_BUTTON_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Canvas.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Canvas.h deleted file mode 100644 index da1c77fe2..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Canvas.h +++ /dev/null @@ -1,246 +0,0 @@ -/*! - @file - @author Alexander Ptakhin - @date 01/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CANVAS_H__ -#define __MYGUI_CANVAS_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_ITexture.h" - -namespace MyGUI -{ - - /** - * Widget wrapper over Texture - shows the texture. - * Implemented: resizing of texture (see TextureResizeMode); recovery after lossing device; - */ - class MYGUI_EXPORT Canvas : - public Widget, - public ITextureInvalidateListener - { - MYGUI_RTTI_DERIVED( Canvas ) - - public: - Canvas(); - - struct Event - { - Event( bool _textureChanged, bool _widgetResized, bool _requested ) : - textureChanged( _textureChanged ), - widgetResized( _widgetResized ), - requested( _requested ) - { - } - - bool textureChanged; - bool widgetResized; - - /// This update was caused by calling updateTexture(); - bool requested; - }; - - typedef delegates::CDelegate1 EventInfo_Canvas; - typedef delegates::CDelegate2 EventInfo_CanvasEvent; - - //FIXME - /** - Available resize and view modes of texture - @remarks PT - Power of Two (size) - */ - enum TextureResizeMode - { - // - TRM_PT_CONST_SIZE, /// Texture doesn't resizes and fills all widget space - TRM_PT_VIEW_REQUESTED, /// You can view all pixels of texture, texture cropped by sizes of widget - TRM_PT_VIEW_ALL /// Texture resizes and fills all widget space - }; - - public: - - /// Creates texture - void createTexture( TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat() ); - - /// Creates texture - void createTexture( int _width, int _height, TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat() ); - - /// Creates texture - void createTexture( const IntSize& _size, TextureResizeMode _resizeMode, TextureUsage _usage = getDefaultTextureUsage(), PixelFormat _format = getDefaultTextureFormat() ); - - /// Destroys texture - void destroyTexture(); - - /// Call user delegate update and removes old texture if it isn't original. - void updateTexture(); - - /// Locks hardware pixel buffer. - void* lock(TextureUsage _usage = TextureUsage::Write); - - /// Unlocks hardware pixel buffer. - void unlock(); - - /// Checks lockness of hardware _pixel buffer. - bool isLocked() const { return mTexture->isLocked(); } - - /// Returns real width of texture. - int getTextureRealWidth() const { return (int) mTexture->getWidth(); } - - /// Returns real height of texture. - int getTextureRealHeight() const { return (int) mTexture->getHeight(); } - - /// Returns real _size of texture. - IntSize getTextureRealSize() const { return IntSize( getTextureRealWidth(), getTextureRealHeight() ); } - - /// Returns needed width while creating texture. - int getTextureSrcWidth() const { return mReqTexSize.width; } - - /// Returns needed height while creating texture. - int getTextureSrcHeight() const { return mReqTexSize.height; } - - /// Returns needed sizes while creating texture. - IntSize getTextureSrcSize() const { return mReqTexSize; } - - /// Returns needed sizes while creating texture. - PixelFormat getTextureFormat() const { return mTexture->getFormat(); } - - /// Returns name of the current texture. - const std::string& getTextureName() const { return mTexture->getName(); } - - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /// Returns resize mode - TextureResizeMode getResizeMode() const { return mTexResizeMode; } - - /// Sets resize mode of texture \sa TextureResizeMode - void setResizeMode( TextureResizeMode _set ) { mTexResizeMode = _set; } - - /// Checks if the texture has the source (required by user) size, otherwise real texture size are bigger. - bool isTextureSrcSize() const; - - /// Returns true if the texture was created (and exists), otherwise false - bool isTextureCreated() const { return mTexture != nullptr; } - - /// Returns true if we own the texture, otherwise false. \sa mManaged - bool isTextureManaged() const { return mTexManaged; } - - /// Reurns interface texture. - ITexture* getTexture() { return mTexture; } - - /// Sets the texture managed @remarks Be careful with assigning managed status to texture, which wasn't created in Canvas! \sa mManaged - void setTextureManaged( bool _value ) { mTexManaged = _value; } - - /// Returns default GUI texture usage - static TextureUsage getDefaultTextureUsage() { return TextureUsage::Stream | TextureUsage::Write; } - - /// Returns default GUI texture format - static PixelFormat getDefaultTextureFormat() { return PixelFormat::R8G8B8A8; } - - /*event:*/ - /** Event : Notify user texture instance will be changed \sa requestUpdateCanvas\n - signature : void method(MyGUI::Canvas* _canvas)\n - @param _canvas, which will be updated - */ - EventInfo_Canvas eventPreTextureChanges; - - /** Event : Texture instance was changed (May be caused by resizing texture or lossing device). User have to update all references to new instance of texture.\n - signature : void method(MyGUI::Canvas* _canvas, MyGUI::Canvas::Event _event)\n - @param _canvas, which needs to update - @param _event - */ - EventInfo_CanvasEvent requestUpdateCanvas; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~Canvas(); - - /// Destroys texture - void _destroyTexture( bool _sendEvent ); - - /// Update entered parameters according to current texture resize mode(size) and restore (if can) parameters of usage and format from texture - void validate( int& _width, int& _height, TextureUsage& _usage, PixelFormat& _format ) const; - - /// Creates the texture itself - void createExactTexture( int _width, int _height, TextureUsage _usage, PixelFormat _format ); - - /// Checks if we need to create a texture with such sizes. - bool checkCreate( int _width, int _height ) const; - - /// Calls when resize widget - void resize( const IntSize& _size ); - - /// Correct texture uv-coordinates - void correctUV(); - - //! @copydoc Widget::baseChangeWidgetSkin(ResourceSkin* _info) - void baseChangeWidgetSkin( ResourceSkin* _info ); - - //! @copydoc Widget::initialiseWidgetSkin(ResourceSkin* _info) - void initialiseWidgetSkin( ResourceSkin* _info ); - - //! @copydoc Widget::shutdownWidgetSkin() - void shutdownWidgetSkin(); - - /// For updating once per frame. - void frameAdvise( bool _advise ); - - /// For updating once per frame. - void frameEntered( float _time ); - - virtual void textureInvalidate(ITexture* _texture); - - protected: - /// Current texture - ITexture* mTexture; - - /// Requested bu user sizes - IntSize mReqTexSize; - - /// Generated texture name - std::string mGenTexName; - - /// Texture resize mode \sa TextureResizeMode - TextureResizeMode mTexResizeMode; - - /// Saved pointer from last calling lock. \sa lock - uint8* mTexData; - - /// true if we own the texture (can delete it or replace by another instance), otherwise false - bool mTexManaged; - - /// For updating once per frame. True state means updating before next frame starts. - bool mFrameAdvise; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_CANVAS_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CastWidget.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CastWidget.h deleted file mode 100644 index 28ac57789..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CastWidget.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CAST_WIDGET_H__ -#define __MYGUI_CAST_WIDGET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" - -namespace MyGUI -{ - -#ifndef MYGUI_DONT_USE_OBSOLETE - - // шаблонный клаÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ типа виджета - template - MYGUI_OBSOLETE("use : template Type* Widget::castType(bool _throw)") - T* castWidget(Widget * _widget) - { - MYGUI_DEBUG_ASSERT(nullptr != _widget, "Error static cast, widget == nullptr"); - return _widget->castType(); - } - -#endif // MYGUI_DONT_USE_OBSOLETE - -} // namespace MyGUI - -#endif // __MYGUI_CAST_WIDGET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ChildSkinInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ChildSkinInfo.h deleted file mode 100644 index 4a129252d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ChildSkinInfo.h +++ /dev/null @@ -1,73 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CHILD_SKIN_INFO_H__ -#define __MYGUI_CHILD_SKIN_INFO_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetStyle.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT ChildSkinInfo - { - ChildSkinInfo() : style(WidgetStyle::Child), align(Align::Default) { } - - ChildSkinInfo(const std::string& _type, const WidgetStyle& _style, const std::string& _skin, const IntCoord& _coord, const Align& _align, const std::string& _layer, const std::string& _name) : - type(_type), - skin(_skin), - name(_name), - layer(_layer), - style(_style), - coord(_coord), - align(_align) - { - // set Child style by default - if (style == WidgetStyle::MAX) style = WidgetStyle::Child; - } - - void addParam(const std::string& _key, const std::string& _value) - { - params[_key] = _value; - } - - std::string findValue(const std::string& _key) const - { - MapString::const_iterator iter = params.find(_key); - if (iter != params.end()) return iter->second; - return ""; - } - - std::string type, skin, name, layer; - WidgetStyle style; - IntCoord coord; - Align align; - MapString params; - }; - - typedef std::vector VectorChildSkinInfo; - -} // namespace MyGUI - - -#endif // __MYGUI_CHILD_SKIN_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ClipboardManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ClipboardManager.h deleted file mode 100644 index 857ce012a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ClipboardManager.h +++ /dev/null @@ -1,70 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CLIPBOARD_MANAGER_H__ -#define __MYGUI_CLIPBOARD_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Types.h" -#include "MyGUI_UString.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ClipboardManager - { - MYGUI_INSTANCE_HEADER( ClipboardManager ) - - public: - void initialise(); - void shutdown(); - - /** Set current data in clipboard - @param _type of data (for example "Text") - @param _data - */ - void setClipboardData(const std::string& _type, const std::string& _data); - /** Clear specific type data - @param _type of data to delete (for example "Text") - */ - void clearClipboardData(const std::string& _type); - /** Get specific type data - @param _type of data to get (for example "Text") - */ - std::string getClipboardData(const std::string& _type); - - private: - MapString mClipboardData; - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 - // диÑкриптор нашего главного окна - size_t mHwnd; - // Ñтрока, которую мы положили в буфер обмена винды - UString mPutTextInClipboard; -#endif - - }; - -} - -#endif // __MYGUI_CLIPBOARD_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Colour.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Colour.h deleted file mode 100644 index bb51b3239..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Colour.h +++ /dev/null @@ -1,163 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_COLOUR_H__ -#define __MYGUI_COLOUR_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT Colour - { - float red, green, blue, alpha; - - static const Colour Zero; - static const Colour Black; - static const Colour White; - static const Colour Red; - static const Colour Green; - static const Colour Blue; - - Colour() : red( 1 ), green( 1 ), blue( 1 ), alpha( 1 ) { } - Colour( float _red, float _green, float _blue, float _alpha = 1 ) : red( _red ), green( _green ), blue( _blue ), alpha( _alpha ) { } - explicit Colour(const std::string& _value) { *this = parse(_value); } - - - Colour& operator=( Colour const& _value ) - { - red = _value.red; - green = _value.green; - blue = _value.blue; - alpha = _value.alpha; - return *this; - } - - bool operator==( Colour const& _value ) const - { - return ((red == _value.red) && (green == _value.green) && (blue == _value.blue) && (alpha == _value.alpha)); - } - - bool operator!=( Colour const& _value ) const - { - return ! (*this == _value); - } - - void set( float _red, float _green, float _blue, float _alpha = 1 ) - { - red = _red; - green = _green; - blue = _blue; - alpha = _alpha; - } - - void clear() - { - red = green = blue = alpha = 0; - } - - std::string print() const - { - std::ostringstream stream; - stream << *this; - return stream.str(); - } - - static Colour parse(const std::string& _value) - { - if (!_value.empty()) - { - if (_value[0] == '#') - { - std::istringstream stream(_value.substr(1)); - int result = 0; - stream >> std::hex >> result; - if (!stream.fail()) - { - return Colour( (unsigned char)( result >> 16 ) / 256.0f, (unsigned char)( result >> 8 ) / 256.0f, (unsigned char)( result ) / 256.0f ); - } - } - else - { - float red, green, blue, alpha = 1; - std::istringstream stream(_value); - stream >> red >> green >> blue; - if (!stream.fail()) - { - if (!stream.eof()) - stream >> alpha; - return Colour(red, green, blue, alpha); - } - } - } - return Colour::Zero; - } - - friend std::ostream& operator << ( std::ostream& _stream, const Colour& _value ) - { - _stream << _value.red << " " << _value.green << " " << _value.blue << " " << _value.alpha; - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, Colour& _value ) - { - _value.clear(); - - std::string value; - _stream >> value; - - if (value.empty()) - return _stream; - - if (value[0] == '#') - { - _value = Colour::parse(value); - } - else - { - std::istringstream stream(value); - stream >> _value.red; - if (stream.fail()) - _value.clear(); - else - { - _stream >> _value.green >> _value.blue; - if (!_stream.eof()) - _stream >> _value.alpha; - else - _value.alpha = 1; - - if (_stream.fail()) - _value.clear(); - } - } - - return _stream; - } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_COLOUR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ComboBox.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ComboBox.h deleted file mode 100644 index ffdd1b158..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ComboBox.h +++ /dev/null @@ -1,237 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_COMBO_BOX_H__ -#define __MYGUI_COMBO_BOX_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Edit.h" -#include "MyGUI_List.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ControllerFadeAlpha.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_ComboBoxPtrSizeT; - - class MYGUI_EXPORT ComboBox : - public Edit - { - MYGUI_RTTI_DERIVED( ComboBox ) - - public: - ComboBox(); - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mList->getItemCount(); } - - //! Insert an item into a array at a specified position - void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); - - //! Add an item to the end of a array - void addItem(const UString& _name, Any _data = Any::Null) { return insertItemAt(ITEM_NONE, _name, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - //! Remove all items - void removeAllItems(); - - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndexWith(const UString& _name); - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - //! Get index of selected item (ITEM_NONE if none selected) - size_t getIndexSelected() { return mItemIndex; } - - //! Select specified _index - void setIndexSelected(size_t _index); - - //! Clear item selection - void clearIndexSelected() { setIndexSelected(ITEM_NONE); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - return mList->getItemDataAt(_index, _throw); - } - - - //------------------------------------------------------------------------------// - // манипулÑции отображением - - //! Replace an item name at a specified position - void setItemNameAt(size_t _index, const UString& _name); - - //! Get item name from specified position - const UString& getItemNameAt(size_t _index) { return mList->getItemNameAt(_index); } - - - //------------------------------------------------------------------------------// - // манипулÑции выдимоÑтью - - //! Move all elements so specified becomes visible - void beginToItemAt(size_t _index) { mList->beginToItemAt(_index); } - - //! Move all elements so first becomes visible - void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } - - //! Move all elements so last becomes visible - void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } - - //! Move all elements so selected becomes visible - void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } - - - //------------------------------------------------------------------------------------// - // методы Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ - - //! Set drop list mode (text can not be edited) - void setComboModeDrop(bool _value); - //! Get drop list mode flag - bool getComboModeDrop() { return mModeDrop; } - - //! Set smooth show of list - void setSmoothShow(bool _value) { mShowSmooth = _value; } - //! Get smooth show of list flag - bool getSmoothShow() { return mShowSmooth; } - - //! Get max list height - void setMaxListHeight(int _value) { mMaxHeight = _value; } - //! Set max list height - int getMaxListHeight() { return mMaxHeight; } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : Enter pressed in combo mode or item selected in drop.\n - signature : void method(MyGUI::ComboBox* _sender, size_t _index) - @param _sender widget that called this event - @param _index item - */ - EventPair eventComboAccept; - - /** Event : Position changed.\n - signature : void method(MyGUI::ComboBox* _sender, size_t _index) - @param _sender widget that called this event - @param _index of new position - */ - EventPair eventComboChangePosition; - - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : size_t ComboBox::getIndexSelected()") - size_t getItemIndexSelected() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void ComboBox::setIndexSelected(size_t _index)") - void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void ComboBox::clearIndexSelected()") - void clearItemSelected() { clearIndexSelected(); } - - MYGUI_OBSOLETE("use : void ComboBox::insertItemAt(size_t _index, const UString& _name)") - void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); } - MYGUI_OBSOLETE("use : void ComboBox::setItemNameAt(size_t _index, const UString& _name)") - void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); } - MYGUI_OBSOLETE("use : const UString& ComboBox::getItemNameAt(size_t _index)") - const UString& getItem(size_t _index) { return getItemNameAt(_index); } - MYGUI_OBSOLETE("use : void ComboBox::removeItemAt(size_t _index)") - void deleteItem(size_t _index) { removeItemAt(_index); } - MYGUI_OBSOLETE("use : void ComboBox::removeAllItems()") - void deleteAllItems() { removeAllItems(); } - MYGUI_OBSOLETE("use : size_t ComboBox::getIndexSelected()") - size_t getItemSelect() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void void ComboBox::clearIndexSelected()") - void resetItemSelect() { clearIndexSelected(); } - MYGUI_OBSOLETE("use : void ComboBox::setIndexSelected(size_t _index)") - void setItemSelect(size_t _index) { setIndexSelected(_index); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~ComboBox(); - - virtual void onKeyButtonPressed(KeyCode _key, Char _char); - - virtual void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void notifyButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyListLostFocus(Widget* _sender, MyGUI::Widget* _new); - void notifyListSelectAccept(List* _widget, size_t _position); - void notifyListMouseItemActivate(List* _widget, size_t _position); - void notifyListChangePosition(List* _widget, size_t _position); - void notifyMouseWheel(Widget* _sender, int _rel); - void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyEditTextChange(Edit* _sender); - - void showList(); - void hideList(); - - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void actionWidgetHide(Widget* _widget); - - ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); - - private: - Button* mButton; - List* mList; - - bool mListShow; - int mMaxHeight; - size_t mItemIndex; - bool mModeDrop; - bool mDropMouse; - bool mShowSmooth; - bool mManualList; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_COMBO_BOX_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Common.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Common.h deleted file mode 100644 index 079a92ee2..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Common.h +++ /dev/null @@ -1,57 +0,0 @@ -/*! - @file - @author Albert Semenov - @author baho_is - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_COMMON_H__ -#define __MYGUI_COMMON_H__ - -#include "MyGUI_Prerequest.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef MYGUI_CUSTOM_ALLOCATOR -# include "MyGUI_CustomAllocator.h" -#else // MYGUI_CUSTOM_ALLOCATOR -# include "MyGUI_Allocator.h" -#endif // MYGUI_CUSTOM_ALLOCATOR - -#include "MyGUI_Macros.h" -#include "MyGUI_Diagnostic.h" -#include "MyGUI_LogManager.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Types.h" -#include "MyGUI_RenderOut.h" -#include "MyGUI_Utility.h" -#include "MyGUI_InputDefine.h" -#include "MyGUI_Version.h" -#include "MyGUI_WidgetStyle.h" -#include "MyGUI_UString.h" -#include "MyGUI_Delegate.h" - -#endif // __MYGUI_COMMON_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CommonStateInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CommonStateInfo.h deleted file mode 100644 index 1788c558e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CommonStateInfo.h +++ /dev/null @@ -1,145 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_COMMON_STATE_INFO_H__ -#define __MYGUI_COMMON_STATE_INFO_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IStateInfo.h" -#include "MyGUI_CoordConverter.h" -#include "MyGUI_LanguageManager.h" -#include "MyGUI_TextureUtility.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SubSkinStateInfo : - public IStateInfo - { - MYGUI_RTTI_DERIVED( SubSkinStateInfo ) - - public: - virtual ~SubSkinStateInfo() { } - - const FloatRect& getRect() { return mRect; } - - private: - virtual void deserialization(xml::ElementPtr _node, Version _version) - { - std::string texture = _node->getParent()->getParent()->findAttribute("texture"); - - // ïîääåðæêà çàìåíû òåãîâ â ñêèíàõ - if (_version >= Version(1, 1)) - { - texture = LanguageManager::getInstance().replaceTags(texture); - } - - const IntSize& size = texture_utility::getTextureSize(texture); - const IntCoord& coord = IntCoord::parse(_node->findAttribute("offset")); - mRect = CoordConverter::convertTextureCoord(coord, size); - } - - private: - FloatRect mRect; - }; - - class MYGUI_EXPORT TileRectStateInfo : - public IStateInfo - { - MYGUI_RTTI_DERIVED( TileRectStateInfo ) - - public: - TileRectStateInfo() : mTileH(true), mTileV(true) { } - virtual ~TileRectStateInfo() { } - - const FloatRect& getRect() { return mRect; } - const IntSize& getTileSize() { return mTileSize; } - bool getTileH() { return mTileH; } - bool getTileV() { return mTileV; } - - private: - virtual void deserialization(xml::ElementPtr _node, Version _version) - { - std::string texture = _node->getParent()->getParent()->findAttribute("texture"); - - // ïîääåðæêà çàìåíû òåãîâ â ñêèíàõ - if (_version >= Version(1, 1)) - { - texture = LanguageManager::getInstance().replaceTags(texture); - } - - const IntSize& size = texture_utility::getTextureSize(texture); - const IntCoord& coord = IntCoord::parse(_node->findAttribute("offset")); - mRect = CoordConverter::convertTextureCoord(coord, size); - - xml::ElementEnumerator prop = _node->getElementEnumerator(); - while (prop.next("Property")) - { - const std::string& key = prop->findAttribute("key"); - const std::string& value = prop->findAttribute("value"); - if (key == "TileH") mTileH = utility::parseBool(value); - else if (key == "TileV") mTileV = utility::parseBool(value); - else if (key == "TileSize") mTileSize = IntSize::parse(value); - } - } - - private: - FloatRect mRect; - IntSize mTileSize; - bool mTileH; - bool mTileV; - }; - - class MYGUI_EXPORT EditTextStateInfo : - public IStateInfo - { - MYGUI_RTTI_DERIVED( EditTextStateInfo ) - - public: - EditTextStateInfo() : mColour(Colour::White), mShift(false) { } - virtual ~EditTextStateInfo() { } - - const Colour& getColour() { return mColour; } - bool getShift() { return mShift; } - - private: - virtual void deserialization(xml::ElementPtr _node, Version _version) - { - mShift = utility::parseBool(_node->findAttribute("shift")); - - std::string colour = _node->findAttribute("colour"); - if (_version >= Version(1, 1)) - { - colour = LanguageManager::getInstance().replaceTags(colour); - } - - mColour = Colour::parse(colour); - } - - private: - Colour mColour; - bool mShift; - }; - -} // namespace MyGUI - -#endif // __MYGUI_COMMON_STATE_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerEdgeHide.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerEdgeHide.h deleted file mode 100644 index 5a050e778..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerEdgeHide.h +++ /dev/null @@ -1,84 +0,0 @@ -/*! - @file - @author Evmenov Georgiy - @date 04/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CONTROLLER_EDGE_HIDE_H__ -#define __MYGUI_CONTROLLER_EDGE_HIDE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_ControllerItem.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - /** This controller used for hiding widgets near screen edges. - Widget will start hiding(move out of screen) if it's near - border and it and it's childrens don't have any focus. Hiding - till only small part of widget be visible. Widget will move - inside screen if it have any focus. - */ - class MYGUI_EXPORT ControllerEdgeHide : - public ControllerItem - { - MYGUI_RTTI_DERIVED( ControllerEdgeHide ) - - public: - ControllerEdgeHide(); - virtual ~ControllerEdgeHide() { } - - /** - @param _value in which widget will be hidden or shown - */ - void setTime(float _value) { mTime = _value; } - - /** - @param _remainPixels how many pixels you will see afterr full hide - */ - void setRemainPixels(int _value) { mRemainPixels = _value; } - - /** - @param _shadowSize adds to _remainPixels when hiding left or top (for example used for windows with shadows) - */ - void setShadowSize(int _value) { mShadowSize = _value; } - - virtual void setProperty(const std::string& _key, const std::string& _value); - - private: - bool addTime(Widget* _widget, float _time); - void prepareItem(Widget* _widget); - - void recalculateTime(Widget* _widget); - - delegates::CDelegate1 eventPostAction; - - float mTime; - int mRemainPixels; - int mShadowSize; - float mElapsedTime; - // for checking if widget was moved - MyGUI::IntCoord mLastCoord; - }; - -} - -#endif // __MYGUI_CONTROLLER_EDGE_HIDE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerFadeAlpha.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerFadeAlpha.h deleted file mode 100644 index 2bbe58ccc..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerFadeAlpha.h +++ /dev/null @@ -1,78 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CONTROLLER_FADE_ALPHA_H__ -#define __MYGUI_CONTROLLER_FADE_ALPHA_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_ControllerItem.h" - -namespace MyGUI -{ - - /** This controller used for smooth changing alpha of widget in time */ - class MYGUI_EXPORT ControllerFadeAlpha : - public ControllerItem - { - MYGUI_RTTI_DERIVED( ControllerFadeAlpha ) - - public: - ControllerFadeAlpha(); - virtual ~ControllerFadeAlpha() { } - - /** - @param _alpha that will be as result of changing - */ - void setAlpha(float _value) { mAlpha = _value; } - - /** - @param _coef of alpha changing speed (1. mean that alpha will change from 0 to 1 at 1 second) - */ - void setCoef(float _value) { mCoef = _value; } - - /** - @param _enabled if true then widget will be inactive after start of alpha changing - */ - void setEnabled(bool _value) { mEnabled = _value; } - - - virtual void setProperty(const std::string& _key, const std::string& _value); - - private: - bool addTime(Widget* _widget, float _time); - void prepareItem(Widget* _widget); - - bool getEnabled() { return mEnabled; } - float getAlpha() { return mAlpha; } - float getCoef() { return mCoef; } - - private: - float mAlpha; - float mCoef; - bool mEnabled; - - }; - -} - -#endif // __MYGUI_CONTROLLER_FADE_ALPHA_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerItem.h deleted file mode 100644 index 74d162ff8..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerItem.h +++ /dev/null @@ -1,73 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CONTROLLER_ITEM_H__ -#define __MYGUI_CONTROLLER_ITEM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_IObject.h" -#include "MyGUI_Delegate.h" - -namespace MyGUI -{ - - /** Base interface for controllers */ - class MYGUI_EXPORT ControllerItem : - public IObject - { - MYGUI_RTTI_DERIVED( ControllerItem ) - - public: - virtual ~ControllerItem() { } - - virtual void prepareItem(Widget* _widget) = 0; - virtual bool addTime(Widget* _widget, float _time) = 0; - - virtual void setProperty(const std::string& _key, const std::string& _value) { } - - /** Event : Before controller started working.\n - signature : void method(MyGUI::Widget* _sender)\n - @param _sender widget under control - */ - delegates::CDelegate1 - eventPreAction; - - /** Event : Controller updated (called every frame).\n - signature : void method(MyGUI::Widget* _sender)\n - @param _sender widget under control - */ - delegates::CDelegate1 - eventUpdateAction; - - /** Event : After controller finished working.\n - signature : void method(MyGUI::Widget* _sender)\n - @param _sender widget under control - */ - delegates::CDelegate1 - eventPostAction; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_CONTROLLER_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerManager.h deleted file mode 100644 index 4910313e0..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerManager.h +++ /dev/null @@ -1,74 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CONTROLLER_MANAGER_H__ -#define __MYGUI_CONTROLLER_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_ControllerItem.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_ActionController.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ControllerManager : public IUnlinkWidget - { - MYGUI_INSTANCE_HEADER( ControllerManager ) - - public: - void initialise(); - void shutdown(); - - // ñîçäàåò êîíòðîëëåð - ControllerItem* createItem(const std::string& _type); - - /** Add controlled widget - @param _widget to be controlled - @param _item controller with some actions (for example ControllerFadeAlpha or your own) - @note _item will be deleted automatically at end of controller lifetime - (if not removed by removeItem(Widget* _widget) before) - */ - void addItem(Widget* _widget, ControllerItem * _item); - - /** Stop the control over a widget - @param _widget to be removed - */ - void removeItem(Widget* _widget); - - private: - void _unlinkWidget(Widget* _widget); - void frameEntered(float _time); - void clear(); - - private: - typedef std::pair PairControllerItem; - typedef std::list ListControllerItem; - ListControllerItem mListItem; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_CONTROLLER_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerPosition.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerPosition.h deleted file mode 100644 index 147770915..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ControllerPosition.h +++ /dev/null @@ -1,95 +0,0 @@ -/*! - @file - @author Evmenov Georgiy - @date 03/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CONTROLLER_POSITION_H__ -#define __MYGUI_CONTROLLER_POSITION_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Delegate.h" -#include "MyGUI_Types.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_ControllerItem.h" - -namespace MyGUI -{ - - /** This controller used for smooth changing position of widget in time */ - class MYGUI_EXPORT ControllerPosition : - public ControllerItem - { - MYGUI_RTTI_DERIVED( ControllerPosition ) - - public: - typedef delegates::CDelegate4 FrameAction; - - ControllerPosition(); - virtual ~ControllerPosition() { } - - void setCoord(const IntCoord& _value); - - void setSize(const IntSize& _value); - - void setPosition(const IntPoint& _value); - - void setFunction(const std::string& _value); - - /** - @param _value seconds in which widget planned to reach destination coordinate - */ - void setTime(float _value) { mTime = _value; } - - /** - @param _action applied to widget every frame (see ControllerPosition::eventFrameAction) - */ - void setAction(FrameAction::IDelegate* _value) { eventFrameAction = _value; } - - virtual void setProperty(const std::string& _key, const std::string& _value); - - private: - bool addTime(Widget* _widget, float _time); - void prepareItem(Widget* _widget); - - float getElapsedTime() { return mElapsedTime; } - - IntCoord mStartCoord; - IntCoord mDestCoord; - float mTime; - float mElapsedTime; - - // controller changing position - bool mCalcPosition; - // controller changing size - bool mCalcSize; - - /** Event : Every frame action while controller exist.\n - signature : void method(const IntRect& _startRect, const IntRect& _destRect, IntRect& _result, float _current_time)\n - @param _startRect start coordinate of widget - @param _destRect destination coordinate - @param _result resultRect - @param _current_time elapsed time (_current_time is real elapsed time divided by _time(see constructor) so _current_time == 1 mean that _time seconds elapsed) - */ - FrameAction eventFrameAction; - }; - -} - -#endif // __MYGUI_CONTROLLER_POSITION_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CoordConverter.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CoordConverter.h deleted file mode 100644 index 82a0f7e3d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CoordConverter.h +++ /dev/null @@ -1,92 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_COORD_CONVERTER_H__ -#define __MYGUI_COORD_CONVERTER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT CoordConverter - { - public: - /** Convert pixel coordinates to texture UV coordinates */ - static FloatRect convertTextureCoord(const IntCoord& _coord, const IntSize& _textureSize) - { - if (!_textureSize.width || !_textureSize.height) return FloatRect(); - return FloatRect( - (float)_coord.left / (float)_textureSize.width, - (float)_coord.top / (float)_textureSize.height, - (float)_coord.right() / (float)_textureSize.width, - (float)_coord.bottom() / (float)_textureSize.height); - } - - /* Convert from relative to pixel coordinates. - @param _coord relative coordinates. - */ - static IntCoord convertFromRelative(const FloatCoord& _coord, const IntSize& _view) - { - return IntCoord(int(_coord.left * _view.width), int(_coord.top * _view.height), int(_coord.width * _view.width), int(_coord.height * _view.height)); - } - - /* Convert from relative to pixel coordinates. - @param _coord relative coordinates. - */ - static IntSize convertFromRelative(const FloatSize& _size, const IntSize& _view) - { - return IntSize(int(_size.width * _view.width), int(_size.height * _view.height)); - } - - /* Convert from relative to pixel coordinates. - @param _coord relative coordinates. - */ - static IntPoint convertFromRelative(const FloatPoint& _point, const IntSize& _view) - { - return IntPoint(int(_point.left * _view.width), int(_point.top * _view.height)); - } - - /* Convert from pixel to relative coordinates. - @param _coord pixel coordinates. - */ - static FloatCoord convertToRelative(const IntCoord& _coord, const IntSize& _view) - { - return FloatCoord(_coord.left / (float)_view.width, _coord.top / (float)_view.height, _coord.width / (float)_view.width, _coord.height / (float)_view.height); - } - - static FloatSize convertToRelative(const IntSize& _size, const IntSize& _view) - { - return FloatSize(_size.width / (float)_view.width, _size.height / (float)_view.height); - } - - static FloatPoint convertToRelative(const IntPoint& _point, const IntSize& _view) - { - return FloatPoint(_point.left / (float)_view.width, _point.top / (float)_view.height); - } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_COORD_CONVERTER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CustomAllocator.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CustomAllocator.h deleted file mode 100644 index 870092a64..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_CustomAllocator.h +++ /dev/null @@ -1,101 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_CUSTOM_ALLOCATOR_H__ -#define __MYGUI_CUSTOM_ALLOCATOR_H__ - -#include -#include - -// for Ogre version -#include - -#if OGRE_VERSION < MYGUI_DEFINE_VERSION(1, 6, 0) -#include -#include -#endif - -namespace MyGUI -{ - - template - class Allocator - { - public: - // typedefs - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - public: - // convert an allocator to allocator - template - struct rebind - { - typedef Allocator other; - }; - - public: - inline explicit Allocator() { } - inline ~Allocator() { } - template - inline explicit Allocator(Allocator const&) { } - - // address - inline pointer address(reference r) { return &r; } - inline const_pointer address(const_reference r) { return &r; } - - // memory allocation - inline pointer allocate(size_type cnt, typename std::allocator::const_pointer = 0) - { - return reinterpret_cast(::operator new (cnt * sizeof (T))); - } - inline void deallocate(pointer p, size_type) - { - ::operator delete (p); - } - - // size - inline size_type max_size() const - { - return std::numeric_limits::max() / sizeof(T); - } - - // construction/destruction - inline void construct(pointer p, const T& t) { new (p) T(t); } - inline void destroy(pointer p) { p->~T(); } - - inline bool operator==(Allocator const&) { return true; } - inline bool operator!=(Allocator const& a) { return !operator==(a); } - }; - -} // namespace MyGUI - -#if OGRE_VERSION < MYGUI_DEFINE_VERSION(1, 6, 0) -#include -#endif - -#endif // __MYGUI_CUSTOM_ALLOCATOR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDContainer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDContainer.h deleted file mode 100644 index 560cb9018..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDContainer.h +++ /dev/null @@ -1,175 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DDCONTAINER_H__ -#define __MYGUI_DDCONTAINER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_DDItemInfo.h" -#include "MyGUI_EventPair.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate3 EventHandle_DDContainerPtrCDDItemInfoRefBoolRef; - typedef delegates::CDelegate3 EventHandle_DDContainerPtrCDDItemInfoRefBool; - typedef delegates::CDelegate2 EventHandle_EventHandle_DDContainerPtrDDItemState; - typedef delegates::CDelegate3 EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef; - - - class MYGUI_EXPORT DDContainer : - public Widget - { - MYGUI_RTTI_DERIVED( DDContainer ) - - public: - DDContainer(); - - /** Set drag'n'drop mode flag. - Disabled (false) by default. - */ - void setNeedDragDrop(bool _value) { mNeedDragDrop = _value; } - /** Get drag'n'drop mode flag */ - bool getNeedDragDrop() { return mNeedDragDrop; } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : request for start drag - signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool& _result) - @param _sender widget that called this event - @param _info information about DDContainers - @param _result write here true if container can be draggedor false if it can't - */ - EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventStartDrag; - - /** Event : request for start drag (moving mouse over container, but not dropped yet) - signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool& _result) - @param _sender widget that called this event - @param _info information about DDContainers - @param _result write here true if container accept dragged widget or false if it isn't - */ - EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventRequestDrop; - - /** Event : end drag (drop) - signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool _result) - @param _sender widget that called this event - @param _info information about DDContainers - @param _result if true then drop was successfull - */ - EventHandle_DDContainerPtrCDDItemInfoRefBool eventDropResult; - - /** Event : drag'n'drop state changed - signature : void method(MyGUI::DDContainer* _sender, MyGUI::DDItemState _state) - @param _sender widget that called this event - @param _state new state - */ - EventHandle_EventHandle_DDContainerPtrDDItemState eventChangeDDState; - - /** Event : [not used] request widget for dragging - signature : void method(MyGUI::DDContainer* _sender, MyGUI::Widget*& _item, MyGUI::IntCoord& _dimension) - @param _sender widget that called this event - @param _item write widget pointer here - @param _dimension write widget coordinate here - */ - EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef requestDragWidgetInfo; - - - /*internal:*/ - // метод Ð´Ð»Ñ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтейта айтема - virtual void _setContainerItemInfo(size_t _index, bool _set, bool _accept) { } - - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /** Event : внутреннее Ñобытие, невалидна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð° - signature : void method(MyGUI::DDContainer* _sender) - @param _sender widget that called this event - */ - EventPair > - _eventInvalideContainer; - - /** Event : !!обновить виджеты дропа DD_FIXME наверное internal - signature : void method(MyGUI::DDContainer* _sender, MyGUI::Widget* _item, const MyGUI::DDWidgetState& _state) - @param _sender widget that called this event - @param _items - @param _state - */ - delegates::CDelegate3 - eventUpdateDropState; - - protected: - virtual ~DDContainer(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); - virtual void onMouseDrag(int _left, int _top); - - virtual void notifyInvalideDrop(DDContainer* _sender); - - virtual void _getContainer(Widget*& _container, size_t& _index); - - virtual void removeDropItems(); - virtual void updateDropItems(); - virtual void updateDropItemsState(const DDWidgetState& _state); - - void mouseDrag(); - void mouseButtonReleased(MouseButton _id); - void mouseButtonPressed(MouseButton _id); - - void endDrop(bool _reset); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - - protected: - bool mDropResult; - bool mNeedDrop; - bool mStartDrop; - - Widget* mOldDrop; - Widget* mCurrentSender; - - DDItemInfo mDropInfo; - - size_t mDropSenderIndex; - - // ÑпиÑок виджетов Ð´Ð»Ñ Ð´Ñ€Ð¾Ð¿Ð° - Widget* mDropItem; - IntCoord mDropDimension; - - IntPoint mClickInWidget; - - // нужно и виджету поддержка драг Ñнд дропа - bool mNeedDragDrop; - - DDContainer* mReseiverContainer; - }; - -} // namespace MyGUI - -#endif // __MYGUI_DDCONTAINER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDItemInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDItemInfo.h deleted file mode 100644 index 288598073..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DDItemInfo.h +++ /dev/null @@ -1,120 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ITEM_DROP_INFO_H__ -#define __MYGUI_ITEM_DROP_INFO_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT DDItemState - { - enum Enum - { - None, - Start, /**< start drag */ - End, /**< end drag (drop) */ - Miss, /**< drag DDContainer over empty space or widgets that don't have drag'n'drop */ - Accept, /**< drag DDContainer over another DDContainer that accept dropping on it */ - Refuse /**< drag DDContainer over another DDContainer that refuse dropping on it */ - }; - - DDItemState(Enum _value = None) : value(_value) { } - - friend bool operator == (DDItemState const& a, DDItemState const& b) { return a.value == b.value; } - friend bool operator != (DDItemState const& a, DDItemState const& b) { return a.value != b.value; } - - private: - Enum value; - }; - - // Ñтруктура информации об индекÑах дропа - /** Inormation about drag'n'drop indexes */ - struct MYGUI_EXPORT DDItemInfo - { - DDItemInfo() : - sender(nullptr), - sender_index(ITEM_NONE), - receiver(nullptr), - receiver_index(ITEM_NONE) - { - } - - DDItemInfo(DDContainer* _sender, size_t _sender_index, DDContainer* _receiver, size_t _receiver_index) : - sender(_sender), - sender_index(_sender_index), - receiver(_receiver), - receiver_index(_receiver_index) - { - } - - void set(DDContainer* _sender, size_t _sender_index, DDContainer* _receiver, size_t _receiver_index) - { - sender = _sender; - sender_index = _sender_index; - receiver = _receiver; - receiver_index = _receiver_index; - } - - void reset() - { - sender = nullptr; - sender_index = ITEM_NONE; - receiver = nullptr; - receiver_index = ITEM_NONE; - } - - /** DDContainer that send this event (container from which we started drag) */ - DDContainer* sender; - /** Index of sender container */ - size_t sender_index; - - /** DDContainer that receive dragged widget (container to which we want to drop) */ - DDContainer* receiver; - /** Index of receiver container */ - size_t receiver_index; - }; - - struct MYGUI_EXPORT DDWidgetState - { - DDWidgetState(size_t _index) : - index(_index), - update(true), - accept(false), - refuse(false) - { } - - /** Index of element */ - size_t index; - /** State and internal data changed */ - bool update; - /** Is widget accept drop */ - bool accept; - /** Is widget refuse drop */ - bool refuse; - }; - -} // namespace MyGUI - -#endif // __MYGUI_ITEM_DROP_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataFileStream.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataFileStream.h deleted file mode 100644 index 0907f21b6..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataFileStream.h +++ /dev/null @@ -1,45 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DATA_FILE_STREAM_H__ -#define __MYGUI_DATA_FILE_STREAM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_DataStream.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT DataFileStream : public DataStream - { - public: - DataFileStream(); - DataFileStream(std::ifstream* _stream); - ~DataFileStream(); - - private: - std::ifstream* mFileStream; - }; - -} // namespace MyGUI - -#endif // __MYGUI_DATA_STREAM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataManager.h deleted file mode 100644 index be7649e8f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataManager.h +++ /dev/null @@ -1,56 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DATA_MANAGER_H__ -#define __MYGUI_DATA_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IDataStream.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT DataManager - { - public: - DataManager(); - virtual ~DataManager() = 0; - - static DataManager& getInstance(); - static DataManager* getInstancePtr(); - - virtual IDataStream* getData(const std::string& _name) = 0; - - virtual bool isDataExist(const std::string& _name) = 0; - - virtual const VectorString& getDataListNames(const std::string& _pattern) = 0; - - virtual const std::string& getDataPath(const std::string& _name) = 0; - - private: - static DataManager* msInstance; - bool mIsInitialise; - }; - -} // namespace MyGUI - -#endif // __MYGUI_DATA_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataStream.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataStream.h deleted file mode 100644 index a532eebee..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DataStream.h +++ /dev/null @@ -1,51 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DATA_STREAM_H__ -#define __MYGUI_DATA_STREAM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IDataStream.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT DataStream : public IDataStream - { - public: - DataStream(); - DataStream(std::istream* _stream); - virtual ~DataStream(); - - virtual bool eof(); - virtual size_t size(); - virtual void readline(std::string& _source, Char _delim); - virtual size_t read(void* _buf, size_t _count); - - protected: - std::istream* mStream; - size_t mSize; - }; - -} // namespace MyGUI - -#endif // __MYGUI_DATA_STREAM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Delegate.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Delegate.h deleted file mode 100644 index 5dd843c85..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Delegate.h +++ /dev/null @@ -1,137 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DELEGATE_H__ -#define __MYGUI_DELEGATE_H__ - -#include "MyGUI_Diagnostic.h" -#include -#include - -// source -// http://rsdn.ru/article/cpp/delegates.xml - -// Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð´ÐµÐ»ÐµÐ³Ð°Ñ‚Ð¾Ð² Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ колличеÑтва параметров -namespace MyGUI -{ - - namespace delegates - { - // базовый клаÑÑ Ð´Ð»Ñ Ñ‚ÐµÑ… клаÑÑов, что хотÑÑ‚ ÑÐµÐ±Ñ Ð¾Ñ‚Ð²Ñзывать от мульти делегатов - class MYGUI_EXPORT IDelegateUnlink - { - public: - virtual ~IDelegateUnlink() { } - - IDelegateUnlink() { m_baseDelegateUnlink = this; } - bool compare(IDelegateUnlink * _unlink) const { return m_baseDelegateUnlink == _unlink->m_baseDelegateUnlink; } - - private: - IDelegateUnlink * m_baseDelegateUnlink; - }; - - inline IDelegateUnlink * GetDelegateUnlink(void * _base) { return 0; } - inline IDelegateUnlink * GetDelegateUnlink(IDelegateUnlink * _base) { return _base; } - } - - // без параметров - #define MYGUI_SUFFIX 0 - #define MYGUI_TEMPLATE - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS - #define MYGUI_ARGS - #define MYGUI_TYPENAME - - #include "MyGUI_DelegateImplement.h" - - // один параметр - #define MYGUI_SUFFIX 1 - #define MYGUI_TEMPLATE template - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS TP1 p1 - #define MYGUI_ARGS p1 - #define MYGUI_TYPENAME typename - - #include "MyGUI_DelegateImplement.h" - - // два параметра - #define MYGUI_SUFFIX 2 - #define MYGUI_TEMPLATE template - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS TP1 p1, TP2 p2 - #define MYGUI_ARGS p1, p2 - #define MYGUI_TYPENAME typename - - #include "MyGUI_DelegateImplement.h" - - // три параметра - #define MYGUI_SUFFIX 3 - #define MYGUI_TEMPLATE template - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS TP1 p1, TP2 p2, TP3 p3 - #define MYGUI_ARGS p1, p2, p3 - #define MYGUI_TYPENAME typename - - #include "MyGUI_DelegateImplement.h" - - // четыре параметра - #define MYGUI_SUFFIX 4 - #define MYGUI_TEMPLATE template - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS TP1 p1, TP2 p2, TP3 p3, TP4 p4 - #define MYGUI_ARGS p1, p2, p3, p4 - #define MYGUI_TYPENAME typename - - #include "MyGUI_DelegateImplement.h" - - // пÑÑ‚ÑŒ параметров - #define MYGUI_SUFFIX 5 - #define MYGUI_TEMPLATE template - #define MYGUI_TEMPLATE_PARAMS - #define MYGUI_TEMPLATE_ARGS - #define MYGUI_T_TEMPLATE_PARAMS - #define MYGUI_T_TEMPLATE_ARGS - #define MYGUI_PARAMS TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5 - #define MYGUI_ARGS p1, p2, p3, p4, p5 - #define MYGUI_TYPENAME typename - - #include "MyGUI_DelegateImplement.h" - - -} // namespace MyGUI - -#endif // __MYGUI_DELEGATE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DelegateImplement.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DelegateImplement.h deleted file mode 100644 index f07e48675..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DelegateImplement.h +++ /dev/null @@ -1,319 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -namespace delegates -{ - - #define MYGUI_COMBINE(a, b) MYGUI_COMBINE1(a, b) - #define MYGUI_COMBINE1(a, b) a##b - - #define MYGUI_I_DELEGATE MYGUI_COMBINE(IDelegate, MYGUI_SUFFIX) - - #define MYGUI_C_STATIC_DELEGATE MYGUI_COMBINE(CStaticDelegate, MYGUI_SUFFIX) - #define MYGUI_C_METHOD_DELEGATE MYGUI_COMBINE(CMethodDelegate, MYGUI_SUFFIX) - - #define MYGUI_C_DELEGATE MYGUI_COMBINE(CDelegate, MYGUI_SUFFIX) - #define MYGUI_C_MULTI_DELEGATE MYGUI_COMBINE(CMultiDelegate, MYGUI_SUFFIX) - - - // базовый клаÑÑ Ð²Ñех делегатов - MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS - class MYGUI_I_DELEGATE - { - public: - virtual ~MYGUI_I_DELEGATE() { } - virtual bool isType( const std::type_info& _type) = 0; - virtual void invoke( MYGUI_PARAMS ) = 0; - virtual bool compare( MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS * _delegate) const = 0; - virtual bool compare(IDelegateUnlink * _unlink) const { return false; } - }; - - - // делегат Ð´Ð»Ñ ÑтатичеÑкой функции - MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS - class MYGUI_C_STATIC_DELEGATE : public MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS - { - public: - typedef void (*Func)( MYGUI_PARAMS ); - - MYGUI_C_STATIC_DELEGATE (Func _func) : mFunc(_func) { } - - virtual bool isType( const std::type_info& _type) { return typeid( MYGUI_C_STATIC_DELEGATE MYGUI_TEMPLATE_ARGS ) == _type; } - - virtual void invoke( MYGUI_PARAMS ) - { - mFunc( MYGUI_ARGS ); - } - - virtual bool compare( MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS * _delegate) const - { - if (nullptr == _delegate || !_delegate->isType(typeid(MYGUI_C_STATIC_DELEGATE MYGUI_TEMPLATE_ARGS)) ) return false; - MYGUI_C_STATIC_DELEGATE MYGUI_TEMPLATE_ARGS * cast = static_cast(_delegate); - return cast->mFunc == mFunc; - } - virtual bool compare(IDelegateUnlink * _unlink) const { return false; } - - private: - Func mFunc; - }; - - - // делегат Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° клаÑÑа - template MYGUI_T_TEMPLATE_PARAMS - class MYGUI_C_METHOD_DELEGATE : public MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS - { - public: - typedef void (T::*Method)( MYGUI_PARAMS ); - - MYGUI_C_METHOD_DELEGATE(IDelegateUnlink * _unlink, T * _object, Method _method) : mUnlink(_unlink), mObject(_object), mMethod(_method) { } - - virtual bool isType( const std::type_info& _type) { return typeid( MYGUI_C_METHOD_DELEGATE MYGUI_T_TEMPLATE_ARGS ) == _type; } - - virtual void invoke( MYGUI_PARAMS ) - { - (mObject->*mMethod)( MYGUI_ARGS ); - } - - virtual bool compare( MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS * _delegate) const - { - if (nullptr == _delegate || !_delegate->isType(typeid(MYGUI_C_METHOD_DELEGATE MYGUI_T_TEMPLATE_ARGS)) ) return false; - MYGUI_C_METHOD_DELEGATE MYGUI_T_TEMPLATE_ARGS * cast = static_cast< MYGUI_C_METHOD_DELEGATE MYGUI_T_TEMPLATE_ARGS * >(_delegate); - return cast->mObject == mObject && cast->mMethod == mMethod; - } - - virtual bool compare(IDelegateUnlink * _unlink) const - { - return mUnlink == _unlink; - } - - private: - IDelegateUnlink *mUnlink; - T * mObject; - Method mMethod; - }; - -} // namespace delegates - -// шаблон Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÐµÐ»ÐµÐ³Ð°Ñ‚Ð° ÑтатичеÑкой функции -// параметры : указатель на функцию -// пример : newDelegate(funk_name); -// пример : newDelegate(class_name::static_method_name); -MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS -inline delegates::MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS * newDelegate( void (*_func)( MYGUI_PARAMS ) ) -{ - return new delegates::MYGUI_C_STATIC_DELEGATE MYGUI_TEMPLATE_ARGS (_func); -} - - -// шаблон Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÐµÐ»ÐµÐ³Ð°Ñ‚Ð° метода клаÑÑа -// параметры : указатель на объект клаÑÑа и указатель на метод клаÑÑа -// пример : newDelegate(&object_name, &class_name::method_name); -template MYGUI_T_TEMPLATE_PARAMS -inline delegates::MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS * newDelegate( T * _object, void (T::*_method)( MYGUI_PARAMS ) ) -{ - return new delegates::MYGUI_C_METHOD_DELEGATE MYGUI_T_TEMPLATE_ARGS (delegates::GetDelegateUnlink(_object), _object, _method); -} - -namespace delegates -{ - // шаблон клаÑÑа делегата - MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS - class MYGUI_C_DELEGATE - { - public: - typedef MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS IDelegate; - - MYGUI_C_DELEGATE () : mDelegate(nullptr) { } - MYGUI_C_DELEGATE (const MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& _event) - { - // забираем Ñебе владение - mDelegate = _event.mDelegate; - const_cast< MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr; - } - ~MYGUI_C_DELEGATE () { clear(); } - - bool empty() const { return mDelegate == nullptr; } - - void clear() - { - if (mDelegate) - { - delete mDelegate; - mDelegate = nullptr; - } - } - - MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS & operator=(IDelegate* _delegate) - { - delete mDelegate; - mDelegate = _delegate; - return *this; - } - - MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS & operator=(const MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& _event) - { - // забираем Ñебе владение - delete mDelegate; - mDelegate = _event.mDelegate; - const_cast< MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr; - - return *this; - } - - void operator()( MYGUI_PARAMS ) - { - if (mDelegate == nullptr) return; - mDelegate->invoke( MYGUI_ARGS ); - } - - private: - IDelegate * mDelegate; - }; - - - // шаблон клаÑÑа мульти делегата - MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS - class MYGUI_C_MULTI_DELEGATE - { - public: - typedef MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS IDelegate; - typedef MYGUI_TYPENAME std::list*/ > ListDelegate; - typedef MYGUI_TYPENAME ListDelegate::iterator ListDelegateIterator; - typedef MYGUI_TYPENAME ListDelegate::const_iterator ConstListDelegateIterator; - - MYGUI_C_MULTI_DELEGATE () { } - ~MYGUI_C_MULTI_DELEGATE () { clear(); } - - bool empty() const - { - for (ConstListDelegateIterator iter = mListDelegates.begin(); iter!=mListDelegates.end(); ++iter) - { - if (*iter) return false; - } - return true; - } - - void clear() - { - for (ListDelegateIterator iter=mListDelegates.begin(); iter!=mListDelegates.end(); ++iter) - { - if (*iter) - { - delete (*iter); - (*iter) = nullptr; - } - } - } - - void clear(IDelegateUnlink * _unlink) - { - for (ListDelegateIterator iter=mListDelegates.begin(); iter!=mListDelegates.end(); ++iter) - { - if ((*iter) && (*iter)->compare(_unlink)) - { - delete (*iter); - (*iter) = nullptr; - } - } - } - - MYGUI_C_MULTI_DELEGATE MYGUI_TEMPLATE_ARGS & operator+=(IDelegate* _delegate) - { - for (ListDelegateIterator iter=mListDelegates.begin(); iter!=mListDelegates.end(); ++iter) - { - if ((*iter) && (*iter)->compare(_delegate)) - { - MYGUI_ASSERT(false, "dublicate delegate"); - } - } - mListDelegates.push_back(_delegate); - return *this; - } - - MYGUI_C_MULTI_DELEGATE MYGUI_TEMPLATE_ARGS & operator-=(IDelegate* _delegate) - { - for (ListDelegateIterator iter=mListDelegates.begin(); iter!=mListDelegates.end(); ++iter) - { - if ((*iter) && (*iter)->compare(_delegate)) - { - // проверÑем на идентичноÑÑ‚ÑŒ делегатов - if ((*iter) != _delegate) delete (*iter); - (*iter) = nullptr; - break; - } - } - delete _delegate; - return *this; - } - - void operator()( MYGUI_PARAMS ) - { - ListDelegateIterator iter = mListDelegates.begin(); - while (iter != mListDelegates.end()) - { - if (nullptr == (*iter)) - { - iter = mListDelegates.erase(iter); - } - else - { - (*iter)->invoke( MYGUI_ARGS ); - ++iter; - } - } - } - - private: - // constructor and operator =, without implementation, just for private - MYGUI_C_MULTI_DELEGATE (const MYGUI_C_MULTI_DELEGATE MYGUI_TEMPLATE_ARGS & _event); - MYGUI_C_MULTI_DELEGATE MYGUI_TEMPLATE_ARGS & operator=(const MYGUI_C_MULTI_DELEGATE MYGUI_TEMPLATE_ARGS & _event); - - - private: - ListDelegate mListDelegates; - - }; - - - #undef MYGUI_COMBINE - #undef MYGUI_COMBINE1 - - #undef MYGUI_I_DELEGATE - - #undef MYGUI_C_STATIC_DELEGATE - #undef MYGUI_C_METHOD_DELEGATE - - #undef MYGUI_C_DELEGATE - #undef MYGUI_C_MULTI_DELEGATE - - #undef MYGUI_SUFFIX - #undef MYGUI_TEMPLATE - #undef MYGUI_TEMPLATE_PARAMS - #undef MYGUI_TEMPLATE_ARGS - #undef MYGUI_T_TEMPLATE_PARAMS - #undef MYGUI_T_TEMPLATE_ARGS - #undef MYGUI_PARAMS - #undef MYGUI_ARGS - #undef MYGUI_TYPENAME - -} // namespace delegates diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Diagnostic.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Diagnostic.h deleted file mode 100644 index 5eee622cb..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Diagnostic.h +++ /dev/null @@ -1,115 +0,0 @@ -/*! - @file - @author Albert Semenov - @author baho_is - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DIAGNOSTIC_H__ -#define __MYGUI_DIAGNOSTIC_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Exception.h" -#include "MyGUI_LogManager.h" -#include - -// for debugging -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - #include -#endif - -#define MYGUI_LOG_SECTION "Core" -#define MYGUI_LOG_FILENAME "MyGUI.log" -#define MYGUI_LOG(level, text) MYGUI_LOGGING(MYGUI_LOG_SECTION, level, text) - -#define MYGUI_BASE_EXCEPT(desc, src) throw MyGUI::Exception(desc, src, __FILE__, __LINE__); - -// MSVC specific: sets the breakpoint -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - #define MYGUI_DBG_BREAK _CrtDbgBreak(); -#else - #define MYGUI_DBG_BREAK -#endif - -#define MYGUI_EXCEPT(dest) \ -{ \ - MYGUI_LOG(Critical, dest); \ - MYGUI_DBG_BREAK;\ - std::ostringstream stream; \ - stream << dest << "\n"; \ - MYGUI_BASE_EXCEPT(stream.str().c_str(), "MyGUI"); \ -} - -#define MYGUI_ASSERT(exp, dest) \ -{ \ - if ( ! (exp) ) \ - { \ - MYGUI_LOG(Critical, dest); \ - MYGUI_DBG_BREAK;\ - std::ostringstream stream; \ - stream << dest << "\n"; \ - MYGUI_BASE_EXCEPT(stream.str().c_str(), "MyGUI"); \ - } \ -} - -#define MYGUI_ASSERT_RANGE(index, size, owner) MYGUI_ASSERT(index < size, owner << " : index number " << index << " out of range [" << size << "]"); -#define MYGUI_ASSERT_RANGE_AND_NONE(index, size, owner) MYGUI_ASSERT(index < size || index == ITEM_NONE, owner << " : index number " << index << " out of range [" << size << "]"); -#define MYGUI_ASSERT_RANGE_INSERT(index, size, owner) MYGUI_ASSERT((index <= size) || (index == MyGUI::ITEM_NONE), owner << " : insert index number " << index << " out of range [" << size << "] or not ITEM_NONE"); - -#if MYGUI_DEBUG_MODE == 1 - #define MYGUI_REGISTER_VALUE(map, value) \ - { \ - MYGUI_LOG(Info, "Register value : '" << #value << "' = " << (int)value); \ - map[#value] = value; \ - } - #define MYGUI_DEBUG_ASSERT(exp, dest) MYGUI_ASSERT(exp, dest) -#else - #define MYGUI_REGISTER_VALUE(map, value) map[#value] = value; - #define MYGUI_DEBUG_ASSERT(exp, dest) ((void)0) -#endif - - -// for more info see: http://mdf-i.blogspot.com/2008/09/deprecated-gcc-vs-vs-vs-vs.html -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - #if MYGUI_COMP_VER == 1310 // VC++ 7.1 - #define MYGUI_OBSOLETE_START(text) - #define MYGUI_OBSOLETE_END - #else - #define MYGUI_OBSOLETE_START(text) __declspec(deprecated(text)) - #define MYGUI_OBSOLETE_END - #endif - -#elif MYGUI_COMPILER == MYGUI_COMPILER_GNUC - #if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX && MYGUI_COMP_VER == 412 - #define MYGUI_OBSOLETE_START(text) - #define MYGUI_OBSOLETE_END - #else - #define MYGUI_OBSOLETE_START(text) - #define MYGUI_OBSOLETE_END __attribute__((deprecated)) - #endif - -#else - #define MYGUI_OBSOLETE_START(text) - #define MYGUI_OBSOLETE_END - -#endif - -#define MYGUI_OBSOLETE(text) /*! \deprecated text */ MYGUI_OBSOLETE_START(text)MYGUI_OBSOLETE_END - -#endif // __MYGUI_DIAGNOSTIC_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLib.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLib.h deleted file mode 100644 index 1eb23e884..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLib.h +++ /dev/null @@ -1,111 +0,0 @@ -/*! - @file - @author Denis Koronchik - @author Georgiy Evmenov - @date 09/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -#ifndef __MYGUI_DYNLIB_H__ -#define __MYGUI_DYNLIB_H__ - -#include "MyGUI_Prerequest.h" -#include - - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 -# define MYGUI_DYNLIB_HANDLE hInstance -# define MYGUI_DYNLIB_LOAD( a ) LoadLibrary( a ) -# define MYGUI_DYNLIB_GETSYM( a, b ) GetProcAddress( a, b ) -# define MYGUI_DYNLIB_UNLOAD( a ) !FreeLibrary( a ) - -struct HINSTANCE__; -typedef struct HINSTANCE__* hInstance; - -#elif MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX -# define MYGUI_DYNLIB_HANDLE void* -# define MYGUI_DYNLIB_LOAD( a ) dlopen( a, RTLD_LAZY | RTLD_GLOBAL) -# define MYGUI_DYNLIB_GETSYM( a, b ) dlsym( a, b ) -# define MYGUI_DYNLIB_UNLOAD( a ) dlclose( a ) - -#elif MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE -# include -# define MYGUI_DYNLIB_HANDLE CFBundleRef -# define MYGUI_DYNLIB_LOAD( a ) mac_loadExeBundle( a ) -# define MYGUI_DYNLIB_GETSYM( a, b ) mac_getBundleSym( a, b ) -# define MYGUI_DYNLIB_UNLOAD( a ) mac_unloadExeBundle( a ) -#endif - -namespace MyGUI -{ - - /*! @brief Resource holding data about a dynamic library. - - @remarks - This class holds the data required to get symbols from - libraries loaded at run-time (i.e. from DLL's for so's) - */ - class MYGUI_EXPORT DynLib - { - friend class DynLibManager; - - protected: - DynLib(const std::string &name); - - ~DynLib(); - - public: - - /*! Load the library - */ - bool load(); - - /*! Unload the library - */ - void unload(); - - //! Get the name of the library - std::string getName(void) const { return mName; } - - /** - Returns the address of the given symbol from the loaded library. - @param - strName The name of the symbol to search for - @returns - If the function succeeds, the returned value is a handle to the symbol. - If the function fails, the returned value is nullptr. - */ - void* getSymbol( const std::string& strName ) const throw(); - - protected: - //! Gets the last loading error - std::string dynlibError(void); - - - protected: - //! Name of library - std::string mName; - - //! Handle to the loaded library. - MYGUI_DYNLIB_HANDLE mInstance; - }; - -} - -#endif // __MYGUI_DYNLIB_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLibManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLibManager.h deleted file mode 100644 index 4b6b99f62..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_DynLibManager.h +++ /dev/null @@ -1,58 +0,0 @@ -/*! - @file - @author Denis Koronchik - @date 08/2007 - @module libEngine -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_DYN_LIB_MANAGER_H__ -#define __MYGUI_DYN_LIB_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_DynLib.h" -#include - -namespace MyGUI -{ - - /*! \brief Manager of dynamic libraries - */ - class MYGUI_EXPORT DynLibManager - { - MYGUI_INSTANCE_HEADER( DynLibManager ) - - public: - void initialise(); - void shutdown(); - - //! Load library - DynLib* load(const std::string &fileName); - //! Unload library - void unload(DynLib *library); - - private: - //! Dynamic libraries map - typedef std::map StringDynLibMap; - //! Loaded libraries - StringDynLibMap mLibsMap; - }; - -} - -#endif // __MYGUI_DYN_LIB_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Edit.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Edit.h deleted file mode 100644 index 01277cdca..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Edit.h +++ /dev/null @@ -1,443 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_EDIT_H__ -#define __MYGUI_EDIT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_StaticText.h" -#include "MyGUI_TextChangeHistory.h" -#include "MyGUI_TextIterator.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ScrollViewBase.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate1 EventHandle_EditPtr; - - class MYGUI_EXPORT Edit : - public StaticText, - public ScrollViewBase - { - MYGUI_RTTI_DERIVED( Edit ) - - public: - Edit(); - - /** Colour interval */ - void setTextIntervalColour(size_t _start, size_t _count, const Colour& _colour); - - /** Get index of first selected character or ITEM_NONE if nothing selected */ - size_t getTextSelectionStart(); - - /** Get index of last selected character or ITEM_NONE if nothing selected */ - size_t getTextSelectionEnd(); - - /** Get length of selected text */ - size_t getTextSelectionLength(); - - // возвращает текÑÑ‚ Ñ Ñ‚ÐµÐ³Ð°Ð¼Ð¸ - /** Get _count characters with tags from _start position */ - UString getTextInterval(size_t _start, size_t _count); - - /** Set selected text interval - @param _start of interval - @param _end of interval - */ - void setTextSelection(size_t _start, size_t _end); - - /** Delete selected text */ - void deleteTextSelection(); - - /** Get selected text */ - UString getTextSelection(); - - /** Is any text selected */ - bool isTextSelection(); - - /** Colour selected text */ - void setTextSelectionColour(const Colour& _value); - - /** Set text cursor position */ - void setTextCursor(size_t _index); - /** Get text cursor position */ - size_t getTextCursor() { return mCursorPosition; } - - - /** Set edit text applying tags */ - virtual void setCaption(const UString& _value); - /** Get edit text with tags */ - virtual const UString& getCaption(); - - /** Set edit text without tags */ - void setOnlyText(const UString& _value); - /** Get edit text without tags */ - UString getOnlyText(); - - /** Get text length excluding tags - For example "#00FF00Hello" length is 5 - */ - size_t getTextLength() const { return mTextLength; } - - //! Sets if surplus characters should push characters off the left side rather than ignored - void setOverflowToTheLeft(bool _value) { mOverflowToTheLeft = _value; } - //! Returns true if surplus characters will be pushed off the left rather than ignored - bool getOverflowToTheLeft() { return mOverflowToTheLeft; } - - //! Sets the max amount of text allowed in the edit field. - void setMaxTextLength(size_t _value) { mMaxTextLength = _value; } - //! Gets the max amount of text allowed in the edit field. - size_t getMaxTextLength() { return mMaxTextLength; } - - /** Inser text at _index position (text end by default) */ - void insertText(const UString& _text, size_t _index = ITEM_NONE); - /** Add text */ - void addText(const UString& _text); - /** Erase _count characters from _start position */ - void eraseText(size_t _start, size_t _count = 1); - - /** Enable or disable edit read only mode\n - Read only mode: you can't edit text, but can select it.\n - Disabled (false) by default. - */ - void setEditReadOnly(bool _value); - /** Get edit read only mode flag */ - bool getEditReadOnly() { return mModeReadOnly; } - - /** Enable or disable edit password mode\n - Password mode: you see password chars (*** by default) instead text.\n - Disabled (false) by default. - */ - void setEditPassword(bool _value); - /** Get edit password mode flag */ - bool getEditPassword() { return mModePassword; } - - /** Enable or disable edit multiline mode\n - Multile mode: new line character moves text to new line.\n - Otherwise new lines replaced with space and all text is in single line.\n - Disabled (false) by default. - */ - void setEditMultiLine(bool _value); - /** Get edit multiline mode flag */ - bool getEditMultiLine() { return mModeMultiline; } - - /** Enable or disable edit static mode\n - Static mode is same as read only, but you also can't select text.\n - Disabled (false) by default. - */ - void setEditStatic(bool _value); - /** Get edit static mode flag */ - bool getEditStatic() { return mModeStatic; } - - /** Set edit password character ('*' by default) */ - void setPasswordChar(Char _value); - /** Set edit password character ('*' by default). First character of string used. */ - void setPasswordChar(const UString& _char); - /** Get edit password character */ - Char getPasswordChar() { return mCharPassword; } - - /** Enable or disable edit word wrap mode\n - Word Wrap mode: move words to new line if they goes out of width. - Also in this mode you can't edit or select text.\n - Disabled (false) by default. - */ - void setEditWordWrap(bool _value); - /** Get edit word wrap mode flag */ - bool getEditWordWrap() { return mModeWordWrap; } - - /** Enable or disable tab printing mode\n - Tab printing mode: when editing text and pressing Tab key it displayed. - If this mode disabled Tab key ignored.\n - Disabled (false) by default. - */ - void setTabPrinting(bool _value) { mTabPrinting = _value; } - /** Get edit tab printing wrap mode flag */ - bool getTabPrinting() { return mTabPrinting; } - - /** Get invert selected text color property */ - bool getInvertSelected(); - /** Enable or disable inverting color of selected text\n - Enabled (true) by default - */ - void setInvertSelected(bool _value); - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** Show VScroll when text size larger than Edit */ - void setVisibleVScroll(bool _value); - /** Get Show VScroll flag */ - bool isVisibleVScroll() { return mVisibleVScroll; } - /** Get range of vertical scroll (or 0 if no scroll). - Range measured in pixels (full text heiht minus Edit height). - For example if Edit is 200 pixels height and 40 lines of text - 30 pixels height each (i.e. 600 pixels total), then return - value is 400 ( = 600 - 200 ). - */ - size_t getVScrollRange(); - /** Get current position of vertical scroll (or 0 if no scroll) */ - size_t getVScrollPosition(); - /** Set current position of vertical scroll */ - void setVScrollPosition(size_t _index); - - /** Show HScroll when text size larger than Edit */ - void setVisibleHScroll(bool _value); - /** Get Show HScroll flag */ - bool isVisibleHScroll() { return mVisibleHScroll; } - /** Get range of horizontal scroll (or 0 if no scroll). - Range measured in pixels (full text width minus Edit width). - For example if Edit is 200 pixels width and the longest line - is 600 pixels width, then return value is 400 ( = 600 - 200 ). - */ - size_t getHScrollRange(); - /** Get current position of horizontal scroll (or 0 if no scroll) */ - size_t getHScrollPosition(); - /** Set current position of horizontal scroll */ - void setHScrollPosition(size_t _index); - - - //! @copydoc StaticText::setFontName - virtual void setFontName(const std::string& _value); - //! @copydoc StaticText::setFontHeight - virtual void setFontHeight(int _value); - - //! @copydoc StaticText::setTextAlign - virtual void setTextAlign(Align _value); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : Enter pressed (Ctrl+enter in multiline mode).\n - signature : void method(MyGUI::Edit* _sender) - @param _sender widget that called this event - */ - EventPair eventEditSelectAccept; - - /** Event : Text changed.\n - signature : void method(MyGUI::Edit* _sender) - @param _sender widget that called this event - */ - EventPair eventEditTextChange; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Edit::setVisibleVScroll(bool _visible)") - void showVScroll(bool _visible) { setVisibleVScroll(_visible); } - MYGUI_OBSOLETE("use : bool Edit::isVisibleVScroll()") - bool isShowVScroll() { return isVisibleVScroll(); } - MYGUI_OBSOLETE("use : void Edit::setVisibleHScroll(bool _visible)") - void showHScroll(bool _visible) { setVisibleHScroll(_visible); } - MYGUI_OBSOLETE("use : bool Edit::isVisibleHScroll()") - bool isShowHScroll() { return isVisibleHScroll(); } - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - // to avoid hiding base virtual function - virtual void setTextColour(const Colour& _colour) { Base::setTextColour(_colour); } - - MYGUI_OBSOLETE("use : void Edit::setTextIntervalColour(size_t _start, size_t _count, const Colour& _colour)") - void setTextColour(size_t _start, size_t _count, const Colour& _colour) { setTextIntervalColour(_start, _count, _colour); } - - MYGUI_OBSOLETE("use : size_t Edit::getTextSelectionStart() , size_t getTextSelectionEnd()") - void getTextSelect(size_t& _start, size_t& _end); - - MYGUI_OBSOLETE("use : UString Edit::getTextInterval(size_t _start, size_t _count)") - UString getText(size_t _start, size_t _count) { return getTextInterval(_start, _count); } - - MYGUI_OBSOLETE("use : void Edit::setTextSelection(size_t _start, size_t _end)") - void setTextSelect(size_t _start, size_t _end) { setTextSelection(_start, _end); } - - MYGUI_OBSOLETE("use : void Edit::deleteTextSelection()") - void deleteTextSelect() { deleteTextSelection(); } - - MYGUI_OBSOLETE("use : UString Edit::getTextSelection()") - UString getSelectedText() { return getTextSelection(); } - - MYGUI_OBSOLETE("use : bool Edit::isTextSelection()") - bool isTextSelect() { return isTextSelection(); } - - MYGUI_OBSOLETE("use : void Edit::setTextSelectionColour(const Colour& _colour)") - void setTextSelectColour(const Colour& _colour) { setTextSelectionColour(_colour); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - - protected: - virtual ~Edit(); - - virtual void onMouseDrag(int _left, int _top); - virtual void onKeyLostFocus(Widget* _new); - virtual void onKeySetFocus(Widget* _old); - virtual void onKeyButtonPressed(KeyCode _key, Char _char); - - // потом убрать вÑе нотифи в Ñраку - void notifyMouseSetFocus(Widget* _sender, Widget* _old); - void notifyMouseLostFocus(Widget* _sender, Widget* _new); - void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseReleased(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseDrag(Widget* _sender, int _left, int _top); - void notifyMouseButtonDoubleClick(Widget* _sender); - - void notifyScrollChangePosition(VScroll* _sender, size_t _position); - void notifyMouseWheel(Widget* _sender, int _rel); - - // обновление предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ - void updateView(); - void updateViewWithCursor(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - void eraseView(); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - private: - // уÑтанавливает текÑÑ‚ - void setText(const UString& _text, bool _history); - // удалÑет вÑе что выделенно - bool deleteTextSelect(bool _history); - // вÑтавлÑет текÑÑ‚ в указанную позицию - void insertText(const UString& _text, size_t _index, bool _history); - // удалÑет текÑÑ‚ - void eraseText(size_t _start, size_t _count, bool _history); - // выделÑет цветом выделение - void setTextSelectColour(const Colour& _colour, bool _history); - // выделÑет цветом диапазон - void _setTextColour(size_t _start, size_t _count, const Colour& _colour, bool _history); - - void frameEntered(float _frame); - - void updateEditState(); - - // обновлÑет курÑор по координате - void updateSelectText(); - - void resetSelect(); - - // запиÑÑŒ в иÑторию данных о позиции - void commandPosition(size_t _undo, size_t _redo, size_t _length, VectorChangeInfo * _info = nullptr); - - // команнды отмена и повтор - bool commandRedo(); - bool commandUndo(); - // объединÑет поÑледние две комманды - void commandMerge(); - // очиÑтка - void commandResetRedo() { mVectorRedoChangeInfo.clear(); } - void commandResetHistory() { mVectorRedoChangeInfo.clear();mVectorUndoChangeInfo.clear(); } - void saveInHistory(VectorChangeInfo * _info = nullptr); - - // работа Ñ Ð±ÑƒÑ„ÐµÑ€Ð¾Ð¼ обмена - void commandCut(); - void commandCopy(); - void commandPast(); - - const UString& getRealString(); - - void setRealString(const UString& _caption); - - void updateCursorPosition(); - - // размер данных - virtual IntSize getContentSize(); - // Ñмещение данных - virtual IntPoint getContentPosition(); - virtual void setContentPosition(const IntPoint& _point); - // размер окна, через которые видно данные - virtual IntSize getViewSize() const; - // размер на который прокручиваютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ при щелчке по Ñкролу - virtual size_t getVScrollPage(); - virtual size_t getHScrollPage(); - - virtual Align getContentAlign(); - - protected: - // нажата ли кнопка - bool mIsPressed; - // в фокуÑе ли кнопка - bool mIsFocus; - - bool mCursorActive; - float mCursorTimer; - float mActionMouseTimer; - - // Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ÐºÑƒÑ€Ñора - size_t mCursorPosition; - // макÑимальное колличеÑтво - size_t mTextLength; - - // выделение - size_t mStartSelect; - size_t mEndSelect; - - // ÑпиÑоки изменений Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ и повтора - DequeUndoRedoInfo mVectorUndoChangeInfo; - DequeUndoRedoInfo mVectorRedoChangeInfo; - - bool mMouseLeftPressed; - - bool mModeReadOnly; - bool mModePassword; - bool mModeMultiline; - bool mModeStatic; - bool mModeWordWrap; - - bool mTabPrinting; - - // наÑтоÑщий текÑÑ‚, закрытый за звездочками - UString mPasswordText; - - // Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ режима Ñтатик, где курÑор не нужен - std::string mOriginalPointer; - - Char mCharPassword; - - bool mOverflowToTheLeft; - size_t mMaxTextLength; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_EDIT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EditText.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EditText.h deleted file mode 100644 index ad897061f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EditText.h +++ /dev/null @@ -1,164 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_EDIT_TEXT_H__ -#define __MYGUI_EDIT_TEXT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Types.h" -#include "MyGUI_ISubWidgetText.h" -#include "MyGUI_IFont.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_RenderFormat.h" -#include "MyGUI_TextView.h" - -namespace MyGUI -{ - - class RenderItem; - - class MYGUI_EXPORT EditText : public ISubWidgetText - { - MYGUI_RTTI_DERIVED( EditText ) - - public: - EditText(); - virtual ~EditText(); - - virtual void setVisible(bool _value); - - // обновлÑет вÑе данные ÑвÑзанные Ñ Ñ‚ÐµÐºÑ‚Ð¾Ð¼ - virtual void updateRawData(); - - // метод Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки ÑÐµÐ±Ñ - virtual void doRender(); - - void setCaption(const UString& _value); - const UString& getCaption(); - - void setTextColour(const Colour& _value); - const Colour& getTextColour(); - - void setAlpha(float _value); - float getAlpha(); - - virtual void setFontName(const std::string& _value); - virtual const std::string& getFontName(); - - virtual void setFontHeight(int _value); - virtual int getFontHeight(); - - virtual void createDrawItem(ITexture* _texture, ILayerNode * _node); - virtual void destroyDrawItem(); - - virtual void setTextAlign(Align _value); - virtual Align getTextAlign(); - - virtual size_t getTextSelectionStart(); - virtual size_t getTextSelectionEnd(); - virtual void setTextSelection(size_t _start, size_t _end); - - virtual bool getSelectBackground(); - virtual void setSelectBackground(bool _normal); - - virtual bool isVisibleCursor(); - virtual void setVisibleCursor(bool _value); - - /** Get invert selected text color property */ - virtual bool getInvertSelected() { return mInvertSelect; } - /** Enable or disable inverting color of selected text\n - Enabled (true) by default - */ - virtual void setInvertSelected(bool _value); - - virtual size_t getCursorPosition(); - virtual void setCursorPosition(size_t _index); - - virtual IntSize getTextSize(); - - // уÑтанавливает Ñмещение текÑта в пикÑелÑÑ… - virtual void setViewOffset(const IntPoint& _point); - virtual IntPoint getViewOffset(); - - // возвращает положение курÑора по произвольному положению - virtual size_t getCursorPosition(const IntPoint& _point); - - // возвращает положение курÑора в обÑолютных координатах - virtual IntCoord getCursorCoord(size_t _position); - - void setShiftText(bool _shift); - - void setWordWrap(bool _value); - - virtual void setStateData(IStateInfo * _data); - - void _updateView(); - void _correctView(); - - /*internal:*/ - void _setAlign(const IntSize& _oldsize, bool _update); - void _setAlign(const IntCoord& _oldcoord, bool _update); - - protected: - bool mEmptyView; - uint32 mCurrentColour; - uint32 mInverseColour; - uint32 mCurrentAlpha; - IntCoord mCurrentCoord; - - UString mCaption; - bool mTextOutDate; - Align mTextAlign; - - Colour mColour; - float mAlpha; - VertexColourType mVertexFormat; - - IFont* mFont; - ITexture* mTexture; - int mFontHeight; - - bool mBackgroundNormal; - size_t mStartSelect; - size_t mEndSelect; - size_t mCursorPosition; - bool mVisibleCursor; - bool mInvertSelect; - - IntPoint mViewOffset; // Ñмещение текÑта - - ILayerNode* mNode; - RenderItem* mRenderItem; - size_t mCountVertex; - bool mIsAddCursorWidth; - - bool mShiftText; - bool mWordWrap; - int mOldWidth; - - TextView mTextView; - }; - -} // namespace MyGUI - -#endif // __MYGUI_EDIT_TEXT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Enumerator.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Enumerator.h deleted file mode 100644 index c7c8811dd..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Enumerator.h +++ /dev/null @@ -1,108 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 08/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ENUMERATOR_H__ -#define __MYGUI_ENUMERATOR_H__ - -#include - -namespace MyGUI -{ - - /** Class for comfortable using of vectors with small while loop - instead iterators. Performance is same as with iterators. - Enumerator usage - @example Enumerator - @code - typedef std::vector VectorString; - typedef Enumerator EnumeratorVectorString; - - VectorString vec; - vec.push_back("value"); - //EnumeratorVectorString enum_vec(vec.begin(), vec.end()); - EnumeratorVectorString enum_vec(vec); - while (enum_vec.next()) - { - std::string value = enum_vec.current(); - } - - typedef std::pair PairString; - typedef std::map MapString; - - MapString map; - map["key"] = "value"; - //EnumeratorMapString enum_map(map.begin(), map.end()); - EnumeratorMapString enum_map(map); - while (enum_map.next()) - { - std::string key = enum_map.current().first; - std::string value = enum_map.current().second; - } - @endcode - */ - - template - class Enumerator - { - private: - Enumerator() { } - - public: - explicit Enumerator(const T& _container) : - m_first(true), - m_current(_container.begin()), - m_end(_container.end()) - { - } - - Enumerator(typename T::const_iterator _first, typename T::const_iterator _end) : - m_first(true), - m_current(_first), - m_end(_end) - { - } - - bool next() - { - if (m_current == m_end) return false; - else if (m_first) - { - m_first = false; - return true; - } - ++ m_current; - if (m_current == m_end) return false; - return true; - } - - typename T::const_reference operator->() const { assert(m_current != m_end); return (*m_current); } - typename T::const_reference current() { assert(m_current != m_end); return (*m_current); } - - private: - bool m_first; - typename T::const_iterator m_current; - typename T::const_iterator m_end; - }; - -} // namespace MyGUI - -#endif // __MYGUI_ENUMERATOR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EventPair.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EventPair.h deleted file mode 100644 index 8039d83e1..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_EventPair.h +++ /dev/null @@ -1,118 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_EVENT_PAIR_H__ -#define __MYGUI_EVENT_PAIR_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - template - class EventPair - { - public: - - template - MYGUI_OBSOLETE("use : signature : Event::IDelegate * _delegate") - void operator = (T * _delegate) - { - m_eventObsolete = _delegate; - m_event = nullptr; - } - - void operator = (typename Event::IDelegate * _delegate) - { - m_eventObsolete = nullptr; - m_event = _delegate; - } - - template - void operator()( TP1 p1 ) - { - m_eventObsolete(p1); - m_event(p1); - } - - template - void operator()( TP1 p1, TP2 p2 ) - { - m_eventObsolete(p1, p2); - m_event(p1, p2); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3 ) - { - m_eventObsolete(p1, p2, p3); - m_event(p1, p2, p3); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3, TP4 p4 ) - { - m_eventObsolete(p1, p2, p3, p4); - m_event(p1, p2, p3, p4); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5 ) - { - m_eventObsolete(p1, p2, p3, p4, p5); - m_event(p1, p2, p3, p4, p5); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5, TP6 p6 ) - { - m_eventObsolete(p1, p2, p3, p4, p5, p6); - m_event(p1, p2, p3, p4, p5, p6); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5, TP6 p6, TP7 p7 ) - { - m_eventObsolete(p1, p2, p3, p4, p5, p6, p7); - m_event(p1, p2, p3, p4, p5, p6, p7); - } - - template - void operator()( TP1 p1, TP2 p2, TP3 p3, TP4 p4, TP5 p5, TP6 p6, TP7 p7, TP8 p8 ) - { - m_eventObsolete(p1, p2, p3, p4, p5, p6, p7, p8); - m_event(p1, p2, p3, p4, p5, p6, p7, p8); - } - - bool empty() const - { - return m_eventObsolete.empty() && m_event.empty(); - } - - public: - EventObsolete m_eventObsolete; - Event m_event; - }; - -} // namespace MyGUI - -#endif // __MYGUI_EVENT_PAIR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Exception.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Exception.h deleted file mode 100644 index 07f720175..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Exception.h +++ /dev/null @@ -1,69 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_EXCEPTION_H__ -#define __MYGUI_EXCEPTION_H__ - -#include "MyGUI_Prerequest.h" -#include -#include - -namespace MyGUI -{ - - class MYGUI_EXPORT Exception : public std::exception - { - protected: - std::string mDescription; - std::string mSource; - std::string mFile; - long mLine; - mutable std::string mFullDesc; - - public: - Exception(const std::string& _description, const std::string& _source, const char* _file, long _line ); - - Exception(const Exception& _rhs); - - // Needed for compatibility with std::exception - ~Exception() throw() { } - - Exception& operator = (const Exception& _rhs); - - virtual const std::string& getFullDescription() const; - - virtual const std::string &getSource() const { return mSource; } - - virtual const std::string &getFile() const { return mFile; } - - virtual long getLine() const { return mLine; } - - virtual const std::string& getDescription() const { return mDescription; } - - // Override std::exception::what - const char* what() const throw() { return getFullDescription().c_str(); } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_EXCEPTION_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FactoryManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FactoryManager.h deleted file mode 100644 index 172eb4733..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FactoryManager.h +++ /dev/null @@ -1,79 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_FACTORY_MANAGER_H__ -#define __MYGUI_FACTORY_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_IObject.h" -#include "MyGUI_GenericFactory.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT FactoryManager - { - MYGUI_INSTANCE_HEADER( FactoryManager ) - - public: - typedef delegates::CDelegate1 Delegate; - - void initialise(); - void shutdown(); - - void registerFactory(const std::string& _category, const std::string& _type, Delegate::IDelegate* _delegate); - void unregisterFactory(const std::string& _category, const std::string& _type); - void unregisterFactory(const std::string& _category); - - bool isFactoryExist(const std::string& _category, const std::string& _type); - - template - void registerFactory(const std::string& _category) - { - registerFactory(_category, Type::getClassTypeName(), GenericFactory::getFactory()); - } - - template - void registerFactory(const std::string& _category, const std::string& _type) - { - registerFactory(_category, _type, GenericFactory::getFactory()); - } - - template - void unregisterFactory(const std::string& _category) - { - unregisterFactory(_category, Type::getClassTypeName()); - } - - IObject* createObject(const std::string& _category, const std::string& _type); - void destroyObject(IObject* _object); - - private: - typedef std::map MapFactoryItem; - typedef std::map MapRegisterFactoryItem; - MapRegisterFactoryItem mRegisterFactoryItems; - }; - -} // namespace MyGUI - -#endif // __MYGUI_FACTORY_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontData.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontData.h deleted file mode 100644 index 95b5b7558..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontData.h +++ /dev/null @@ -1,129 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_FONT_DATA_H__ -#define __MYGUI_FONT_DATA_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT FontCodeType - { - enum Enum - { - Selected = 6, - SelectedBack = 7, - Cursor = 8, - Tab = 9, - LF = 0x000A, - CR = 0x000D, - Space = 0x0020, - LatinStart = 0x0021, - NEL = 0x0085, - LatinEnd = 0x00A6, - MAX - }; - - FontCodeType(Enum _value = MAX) : value(_value) { } - - friend bool operator == (FontCodeType const& a, FontCodeType const& b) { return a.value == b.value; } - friend bool operator != (FontCodeType const& a, FontCodeType const& b) { return a.value != b.value; } - - private: - Enum value; - }; - - // èíôîðìàöèÿ îá îäíîì ñèìâîëå - struct GlyphInfo - { - FloatRect uvRect; - Char codePoint; - int width; - - GlyphInfo() : codePoint(0), width(0) { } - }; - - typedef std::vector VectorGlyphInfo; - - // èíôîðìàöèÿ îá äèàïàçîíå - //FIXME move to std::pair - class PairCodePoint - { - public: - PairCodePoint() : first(0), last(0) { } - PairCodePoint(Char _first, Char _last) : first(_first), last(_last) { } - - // ïðîâåðÿåò âõîäèò ëè ñèìâîë â äèàïàçîí - bool isExist(Char _code) const { return _code >= first && _code <= last; } - - public: - Char first; - Char last; - }; - - // èíôîìàöèÿ î äèàïàçîíå ñèìâîëîâ - class RangeInfo - { - public: - RangeInfo() : first(0), last(0) { } - RangeInfo(Char _first, Char _last) : - first(_first), - last(_last) - { - range.resize(last - first + 1); - } - - // ïðîâåðÿåò âõîäèò ëè ñèìâîë â äèàïàçîí - bool isExist(Char _code) const { return _code >= first && _code <= last; } - - // âîçâðàùàåò óêàçàòåëü íà ãëèô, èëè 0, åñëè êîä íå âõîäèò â äèàïàçîí - GlyphInfo* getInfo(Char _code) { return isExist(_code) ? &range[_code - first] : nullptr; } - void setInfo(Char _code, GlyphInfo* _value) { if (isExist(_code)) range[_code - first] = *_value; } - - public: - Char first; - Char last; - VectorGlyphInfo range; - }; - - // FIXME move to resource font - class PairCodeCoord - { - public: - PairCodeCoord() : code(0) { } - PairCodeCoord(Char _code, const IntCoord& _coord) : - code(_code), - coord(_coord) - { - } - - bool operator < (const PairCodeCoord& _value) const { return code < _value.code; } - - Char code; - IntCoord coord; - }; - -} // namespace MyGUI - -#endif // __MYGUI_FONT_DATA_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontManager.h deleted file mode 100644 index baaad1292..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_FontManager.h +++ /dev/null @@ -1,60 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_FONT_MANAGER_H__ -#define __MYGUI_FONT_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_IFont.h" -#include "MyGUI_Instance.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_ResourceManager.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT FontManager - { - MYGUI_INSTANCE_HEADER( FontManager ) - - public: - void initialise(); - void shutdown(); - - /** Load additional MyGUI *_font.xml file */ - bool load(const std::string& _file); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - const std::string& getDefaultFont() const { return mDefaultName; } - void setDefaultFont(const std::string& _value); - - /** Get font resource */ - IFont* getByName(const std::string& _name) const; - - private: - std::string mDefaultName; - }; - -} // namespace MyGUI - -#endif // __MYGUI_FONT_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_GenericFactory.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_GenericFactory.h deleted file mode 100644 index 503c61a25..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_GenericFactory.h +++ /dev/null @@ -1,36 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -#ifndef __MYGUI_GENERIC_FACTORY_H__ -#define __MYGUI_GENERIC_FACTORY_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_Delegate.h" - -namespace MyGUI -{ - - template - class GenericFactory - { - public: - typedef delegates::CDelegate1 Delegate; - static typename Delegate::IDelegate* getFactory() - { - return newDelegate(createFromFactory); - } - - private: - static void createFromFactory(IObject*& _instance) - { - _instance = new Type(); - } - }; - -} - -#endif // __MYGUI_GENERIC_FACTORY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Gui.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Gui.h deleted file mode 100644 index 006d28301..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Gui.h +++ /dev/null @@ -1,287 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_GUI_H__ -#define __MYGUI_GUI_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_Instance.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_IWidgetCreator.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_Widget.h" - -namespace MyGUI -{ - - typedef delegates::CMultiDelegate1 FrameEventDelegate; - - class MYGUI_EXPORT Gui : public IWidgetCreator, public IUnlinkWidget - { - friend class WidgetManager; - MYGUI_INSTANCE_HEADER( Gui ) - - public: - /** Initialise GUI and all GUI Managers - @param - _core name of core config file for MyGUI (contain main config files with skins, layers, fonts, etc.) - @param - _logFileName Log file name - */ - void initialise(const std::string& _core = "core.xml", const std::string& _logFileName = MYGUI_LOG_FILENAME); - - /** Shutdown GUI and all GUI Managers*/ - void shutdown(); - - // methods for creating widgets - /** Create widget - @param _type widget type - @param _skin widget skin - @param _coord int coordinates of widget (_left, _top, _width, _height) - @param _align widget align (possible values can be found in enum Align) - @param _layer layer where widget will be created (all layers usually defined in core.layer file). - If your widget will overlap with any other you shoud select _layer with "overlapped" property enabled. - @param _name if needed (you can use it for finding widget by name later) - */ - Widget* createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name = "") - { - return baseCreateWidget(WidgetStyle::Overlapped, _type, _skin, _coord, _align, _layer, _name); - } - /** See Gui::createWidgetT */ - Widget* createWidgetT(const std::string& _type, const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _layer, const std::string& _name = "") - { - return createWidgetT(_type, _skin, IntCoord(_left, _top, _width, _height), _align, _layer, _name); - } - /** Create widget using coordinates relative to parent. see Gui::createWidgetT */ - Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _layer, const std::string& _name = "") - { - return createWidgetT(_type, _skin, IntCoord((int)(_coord.left*mViewSize.width), (int)(_coord.top*mViewSize.height), (int)(_coord.width*mViewSize.width), (int)(_coord.height*mViewSize.height)), _align, _layer, _name); - } - /** Create widget using coordinates relative to parent. see Gui::createWidgetT */ - Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _layer, const std::string& _name = "") - { - return createWidgetT(_type, _skin, IntCoord((int)(_left*mViewSize.width), (int)(_top*mViewSize.height), (int)(_width*mViewSize.width), (int)(_height*mViewSize.height)), _align, _layer, _name); - } - - // templates for creating widgets by type - /** Same as Gui::createWidgetT but return T* instead of Widget* */ - template - T* createWidget(const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name = "") - { - return static_cast(createWidgetT(T::getClassTypeName(), _skin, _coord, _align, _layer, _name)); - } - /** Same as Gui::createWidgetT but return T* instead of Widget* */ - template - T* createWidget(const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _layer, const std::string& _name = "") - { - return static_cast(createWidgetT(T::getClassTypeName(), _skin, IntCoord(_left, _top, _width, _height), _align, _layer, _name)); - } - /** Same as Gui::createWidgetRealT but return T* instead of Widget* */ - template - T* createWidgetReal(const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _layer, const std::string& _name = "") - { - return static_cast(createWidgetRealT(T::getClassTypeName(), _skin, _coord, _align, _layer, _name)); - } - /** Same as Gui::createWidgetRealT but return T* instead of Widget* */ - template - T* createWidgetReal(const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _layer, const std::string& _name = "") - { - return static_cast(createWidgetRealT(T::getClassTypeName(), _skin, _left, _top, _width, _height, _align, _layer, _name)); - } - - /** Get view size of GUI area */ - const IntSize& getViewSize() const { return mViewSize; } - - int getViewWidth() { return mViewSize.width; } - int getViewHeight() { return mViewSize.height; } - - // mirror of InputManager methods - /** Inject MouseMove event - @return true if event has been processed by GUI - */ - bool injectMouseMove(int _absx, int _absy, int _absz); - /** Inject MousePress event - @return true if event has been processed by GUI - */ - bool injectMousePress(int _absx, int _absy, MouseButton _id); - /** Inject MouseRelease event - @return true if event has been processed by GUI - */ - bool injectMouseRelease(int _absx, int _absy, MouseButton _id); - - /** Inject KeyPress event - @return true if event has been processed by GUI - */ - bool injectKeyPress(KeyCode _key, Char _text = 0); - /** Inject KeyReleas event - @return true if event has been processed by GUI - */ - bool injectKeyRelease(KeyCode _key); - - /** Destroy any created widget */ - void destroyWidget(Widget* _widget); - - /** Destroy vector of widgets */ - void destroyWidgets(VectorWidgetPtr& _widgets); - - /** Destroy Enumerator of widgets */ - void destroyWidgets(EnumeratorWidgetPtr& _widgets); - - /** Find widget by name - If widget is not found the exception will be thrown, or if the second parameter is false the nullptr pointer will be returned - */ - Widget* findWidgetT(const std::string& _name, bool _throw = true); - - /** Find widget by name and prefix - If widget is not found the exception will be thrown, or if the second parameter is false the nullptr pointer will be returned - */ - Widget* findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw = true) - { - return findWidgetT(_prefix + _name, _throw); - } - - // mirror WidgetManager - /** Find widget by name and cast it to T type. - If widget not found or T and found widget have different types cause exception, or if the second parameter is false the nullptr pointer will be returned - */ - template - T* findWidget(const std::string& _name, bool _throw = true) - { - Widget* widget = findWidgetT(_name, _throw); - if (nullptr == widget) return nullptr; - return widget->castType(_throw); - } - - /** Find widget by name and prefix and cast it to T type - If widget not found or T and found widget have different types cause exception, or if the second parameter is false the nullptr pointer will be returned - */ - template - T* findWidget(const std::string& _name, const std::string& _prefix, bool _throw = true) - { - return findWidget(_prefix + _name, _throw); - } - - - /** Show or hide mouse pointer */ - void setVisiblePointer(bool _visible); - /** Is mouse pointer visible */ - bool isVisiblePointer(); - - - // mirror ResourceManager - /** Load config with any info (file can have different data such other config files that will be loaded, skins, layers, pointers, etc) */ - bool load(const std::string& _file); - - void resizeWindow(const IntSize& _size); - - /** Destroy child widget or throw exception if this child widget not found */ - void destroyChildWidget(Widget* _widget) { _destroyChildWidget(_widget); } - - /** Destroy all child widgets */ - void destroyAllChildWidget() { _destroyAllChildWidget(); } - - /** Get name of Gui ResourceGroup*/ - //static const std::string& getResourceGroup(); - - /** Get root widgets Enumerator */ - EnumeratorWidgetPtr getEnumerator() { return EnumeratorWidgetPtr(mWidgetChild); } - - /*internal:*/ - - /** Inject frame entered event (called be renderer, do not call it manually). - This function is called every frame by renderer. - */ - void _injectFrameEntered(float _time); - - /*event:*/ - /** Multidelegate for GUI per frame call.\n - signature : void method(float _time)\n - @param _time Time elapsed since last frame - */ - FrameEventDelegate eventFrameStart; - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Gui::destroyWidgets(VectorWidgetPtr &_widgets)") - void destroyWidgetsVector(VectorWidgetPtr& _widgets) { destroyWidgets(_widgets); } - - MYGUI_OBSOLETE("use : void Gui::setVisiblePointer(bool _value)") - void hidePointer() { setVisiblePointer(false); } - MYGUI_OBSOLETE("use : void Gui::setVisiblePointer(bool _value)") - void showPointer() { setVisiblePointer(true); } - MYGUI_OBSOLETE("use : bool Gui::isVisiblePointer()") - bool isShowPointer() { return isVisiblePointer(); } - MYGUI_OBSOLETE("called be renderer, do not call it manually") - void injectFrameEntered(float _time) { } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - // Ñоздает виджет - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - // удÑлÑет неудачника - void _destroyChildWidget(Widget* _widget); - - // удалÑет вÑех детей - void _destroyAllChildWidget(); - - virtual void _unlinkWidget(Widget* _widget); - - // добавлÑет в ÑпиÑок виджет - virtual void _linkChildWidget(Widget* _widget); - - // удалÑет из ÑпиÑка - virtual void _unlinkChildWidget(Widget* _widget); - - - private: - // вектор вÑех детей виджетов - VectorWidgetPtr mWidgetChild; - - // размеры Ñкрана - IntSize mViewSize; - - // Ñинглтоны Ð³ÑƒÑ - InputManager * mInputManager; - SubWidgetManager * mSubWidgetManager; - LayerManager* mLayerManager; - SkinManager* mSkinManager; - WidgetManager* mWidgetManager; - FontManager* mFontManager; - ControllerManager* mControllerManager; - PointerManager* mPointerManager; - ClipboardManager* mClipboardManager; - LayoutManager* mLayoutManager; - DynLibManager* mDynLibManager; - PluginManager* mPluginManager; - LanguageManager* mLanguageManager; - ResourceManager* mResourceManager; - FactoryManager* mFactoryManager; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_GUI_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Guid.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Guid.h deleted file mode 100644 index 72d253434..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Guid.h +++ /dev/null @@ -1,137 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_GUID_H__ -#define __MYGUI_GUID_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include - -namespace MyGUI -{ - - class MYGUI_EXPORT Guid - { - public: - Guid() { fast._data1 = fast._data2 = fast._data3 = fast._data4 = 0; } - Guid( Guid const& _value ) { *this = _value; } - explicit Guid(const std::string& _value) { *this = parse(_value); } - explicit Guid(unsigned char(&_id)[16]) { ::memcpy((void*)&vec._data1[0], (void*)&_id[0], 16); } - - bool operator == (Guid const& _comp) const - { - return _comp.fast._data1 == fast._data1 - && _comp.fast._data2 == fast._data2 - && _comp.fast._data3 == fast._data3 - && _comp.fast._data4 == fast._data4; - } - - bool operator != ( Guid const& _comp ) const - { - return ! (*this == _comp); - } - - bool operator < ( Guid const& _comp ) const - { - if (_comp.fast._data1 < fast._data1) return true; - else if (_comp.fast._data1 > fast._data1) return false; - if (_comp.fast._data2 < fast._data2) return true; - else if (_comp.fast._data2 > fast._data2) return false; - if (_comp.fast._data3 < fast._data3) return true; - else if (_comp.fast._data3 > fast._data3) return false; - if (_comp.fast._data4 < fast._data4) return true; - return false; - } - - Guid& operator = (Guid const& _rvalue) - { - fast._data1 = _rvalue.fast._data1; - fast._data2 = _rvalue.fast._data2; - fast._data3 = _rvalue.fast._data3; - fast._data4 = _rvalue.fast._data4; - return *this; - } - - bool empty() const - { - return fast._data1 == 0 - && fast._data2 == 0 - && fast._data3 == 0 - && fast._data4 == 0; - } - - void clear() - { - fast._data1 = fast._data2 = fast._data3 = fast._data4 = 0; - } - - std::string print() const; - static Guid parse(const std::string& _value); - static Guid generate(); - - friend std::ostream& operator << ( std::ostream& _stream, const Guid& _value ) - { - _stream << _value.print(); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, Guid& _value ) - { - std::string value; - _stream >> value; - if (_stream.fail()) _value.clear(); - else _value = Guid::parse(value); - return _stream; - } - - private: - // маÑÑив Ð´Ð»Ñ Ð±Ñ‹Ñтрой конвертации - static const char convert_hex[64]; - - struct _original - { - uint32 data1; - uint16 data2, data3; - uint8 data4[8]; - }; - struct _fast - { - uint32 _data1, _data2, _data3, _data4; - }; - struct _vec - { - unsigned char _data1[16]; - }; - - union - { - _original original; - _fast fast; - _vec vec; - }; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_GUID_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_HScroll.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_HScroll.h deleted file mode 100644 index 1f7e47e4e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_HScroll.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_HSCROLL_H__ -#define __MYGUI_HSCROLL_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_VScroll.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT HScroll : - public VScroll - { - MYGUI_RTTI_DERIVED( HScroll ) - - public: - HScroll(); - - //! @copydoc VScroll::getLineSize() - virtual int getLineSize(); - - //! @copydoc VScroll::setTrackSize(int _value) - virtual void setTrackSize(int _value); - //! @copydoc VScroll::getTrackSize() - virtual int getTrackSize(); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~HScroll(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void TrackMove(int _left, int _top); - void updateTrack(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_HSCROLL_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IBItemInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IBItemInfo.h deleted file mode 100644 index 1bbda09f4..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IBItemInfo.h +++ /dev/null @@ -1,111 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ITEM_INFO_H__ -#define __MYGUI_ITEM_INFO_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - // Ñтруктура информации об отображении Ñлемента - /** Info about ItemBox item*/ - struct MYGUI_EXPORT IBDrawItemInfo - { - - IBDrawItemInfo() : - index(ITEM_NONE), - update(false), - select(false), - active(false), - drag(false), - drop_accept(false), - drop_refuse(false) - { - } - - IBDrawItemInfo(size_t _index, size_t _select, size_t _active, size_t _accept, size_t _refuse, bool _update, bool _drag) : - index(_index), - update(_update), - select(_index == _select), - active(_index == _active), - drag(_drag), - drop_accept(_index == _accept), - drop_refuse(_index == _refuse) - { - } - - /** Index of element */ - size_t index; - /** State and interdan data changed */ - bool update; - /** Is widget selected */ - bool select; - /** Is widget active */ - bool active; - /** Is widget able to be dragged */ - bool drag; - /** Is widget accepting drop */ - bool drop_accept; - /** Is widget refuseing drop */ - bool drop_refuse; - }; - - struct MYGUI_EXPORT IBNotifyItemData - { - enum NotifyItem - { - MousePressed, - MouseReleased, - KeyPressed, - KeyReleased - }; - - IBNotifyItemData(size_t _index, NotifyItem _notify, int _x, int _y, MouseButton _id) : - index(_index), notify(_notify), x(_x), y(_y), id(_id), code(KeyCode::None), key(0) { } - - IBNotifyItemData(size_t _index, NotifyItem _notify, KeyCode _code, Char _key) : - index(_index), notify(_notify), x(0), y(0), id(MouseButton::None), code(_code), key(_key) { } - - IBNotifyItemData(size_t _index, NotifyItem _notify, KeyCode _code) : - index(_index), notify(_notify), x(0), y(0), id(MouseButton::None), code(_code), key(KeyCode::None) { } - - /** Item index */ - size_t index; - /** Notify type */ - NotifyItem notify; - /** If Mouse* notify type - mouse x position, else 0 */ - int x; - /** If Mouse* notify type - mouse y position, else 0 */ - int y; - /** If Mouse* notify type - mouse button id position, else 0 */ - MouseButton id; - /** If Key* notify type - key code, else 0 */ - KeyCode code; - /** If Key* notify type - mouse button id position, else 0 */ - Char key; - }; - -} // namespace MyGUI - -#endif // __MYGUI_ITEM_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ICroppedRectangle.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ICroppedRectangle.h deleted file mode 100644 index 06229d056..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ICroppedRectangle.h +++ /dev/null @@ -1,213 +0,0 @@ -/*! - @file - @author Georgiy Evmenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_CROPPED_RECTANGLE_H__ -#define __MYGUI_I_CROPPED_RECTANGLE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ICroppedRectangle - { - public: - ICroppedRectangle() : - mIsMargin(false), - mCroppedParent(nullptr), - mVisible(true), - mAlign(Align::Default) - { } - - virtual ~ICroppedRectangle() { } - - /** Get parent ICroppedRectangle */ - ICroppedRectangle * getCroppedParent() { return mCroppedParent; } - - /** Set coordinates (position and size) */ - virtual void setCoord(const IntCoord& _value) { mCoord = _value; } - /** Get coordinates (position and size) */ - const IntCoord& getCoord() const { return mCoord; } - - /** Set position */ - virtual void setPosition(const IntPoint& _value) { mCoord.left = _value.left; mCoord.top = _value.top; } - /** Get position */ - IntPoint getPosition() const { return mCoord.point(); } - - /** Set size */ - virtual void setSize(const IntSize& _value) { mCoord.width = _value.width; mCoord.height = _value.height; } - /** Get size */ - IntSize getSize() const { return mCoord.size(); } - - /** Hide or show */ - virtual void setVisible(bool _value) { mVisible = _value; } - /** Return true if visible */ - bool isVisible() const { return mVisible; } - - /** Get position in screen coordinates */ - const IntPoint& getAbsolutePosition() const { return mAbsolutePosition; } - /** Get rectangle in screen coordinates */ - IntRect getAbsoluteRect() const { return IntRect(mAbsolutePosition.left, mAbsolutePosition.top, mAbsolutePosition.left+mCoord.width, mAbsolutePosition.top+mCoord.height); } - /** Get coordinate in screen coordinates */ - IntCoord getAbsoluteCoord() const { return IntCoord(mAbsolutePosition.left, mAbsolutePosition.top, mCoord.width, mCoord.height); } - - /** Get X in screen coordinates */ - int getAbsoluteLeft() const { return mAbsolutePosition.left; } - /** Get Y in screen coordinates */ - int getAbsoluteTop() const { return mAbsolutePosition.top; } - - /** Set align */ - virtual void setAlign(Align _value) { mAlign = _value; } - /** Get align */ - Align getAlign() const { return mAlign; } - - /** Get left x-coordinate */ - int getLeft() const { return mCoord.left; } - /** Get right x-coordinate */ - int getRight() const { return mCoord.right(); } - /** Get top y-coordinate */ - int getTop() const { return mCoord.top; } - /** Get bottom y-coordinate */ - int getBottom() const { return mCoord.bottom(); } - /** Get width */ - int getWidth() const { return mCoord.width; } - /** Get height */ - int getHeight() const { return mCoord.height; } - - - /*internal:*/ - /** True if rectangle is cropped by parent rectangle */ - bool _isMargin() const { return mIsMargin; } - - // Get cropped by parent rectangle coordinates - int _getViewLeft() const { return mCoord.left + mMargin.left; } - int _getViewRight() const { return mCoord.right() - mMargin.right; } - int _getViewTop() const { return mCoord.top + mMargin.top; } - int _getViewBottom() const { return mCoord.bottom() - mMargin.bottom; } - int _getViewWidth() const { return mCoord.width - mMargin.left - mMargin.right; } - int _getViewHeight() const { return mCoord.height - mMargin.top - mMargin.bottom; } - - virtual void _updateView() { } - virtual void _correctView() { } - virtual void _setAlign(const IntSize& _oldsize, bool _update) { } - virtual void _setAlign(const IntCoord& _oldcoord, bool _update) { } - - void _setCroppedParent(ICroppedRectangle* _parent) { mCroppedParent = _parent; } - - const IntRect& _getMargin() const { return mMargin; } - int _getMarginLeft() const { return mMargin.left; } - int _getMarginRight() const { return mMargin.right; } - int _getMarginTop() const { return mMargin.top; } - int _getMarginBottom() const { return mMargin.bottom; } - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void ICroppedRectangle::setVisible(bool _visible)") - void show() { setVisible(true); } - MYGUI_OBSOLETE("use : void ICroppedRectangle::setVisible(bool _visible)") - void hide() { setVisible(false); } - MYGUI_OBSOLETE("use : bool ICroppedRectangle::isVisible()") - bool isShow() { return isVisible(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - bool _checkPoint(int _left, int _top) - { - return ! ((_getViewLeft() > _left) || (_getViewTop() > _top) || (_getViewRight() < _left) || (_getViewBottom() < _top)); - } - - bool _checkMargin() - { - bool margin = false; - //вылезли ли налево - if (getLeft() < mCroppedParent->mMargin.left) - { - mMargin.left = mCroppedParent->mMargin.left - getLeft(); - margin = true; - } - else - { - mMargin.left = 0; - } - - //вылезли ли направо - if (getRight() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right) - { - mMargin.right = getRight() - (mCroppedParent->getWidth() - mCroppedParent->mMargin.right); - margin = true; - } - else - { - mMargin.right = 0; - } - - //вылезли ли вверх - if (getTop() < mCroppedParent->mMargin.top) - { - mMargin.top = mCroppedParent->mMargin.top - getTop(); - margin = true; - } - else - { - mMargin.top = 0; - } - - //вылезли ли вниз - if (getBottom() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom) - { - mMargin.bottom = getBottom() - (mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom); - margin = true; - } - else - { - mMargin.bottom = 0; - } - - return margin; - } - - bool _checkOutside() // проверка на полный выход за границу - { - return ( (getRight() < mCroppedParent->mMargin.left ) || // ÑовÑем уехали налево - (getLeft() > mCroppedParent->getWidth() - mCroppedParent->mMargin.right ) || // ÑовÑем уехали направо - (getBottom() < mCroppedParent->mMargin.top ) || // ÑовÑем уехали вверх - (getTop() > mCroppedParent->getHeight() - mCroppedParent->mMargin.bottom ) ); // ÑовÑем уехали вниз - } - - protected: - bool mIsMargin; - IntRect mMargin; // перекрытие - IntCoord mCoord; // координаты - IntPoint mAbsolutePosition; // обÑолютные координаты - - ICroppedRectangle * mCroppedParent; - bool mVisible; - Align mAlign; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_CROPPED_RECTANGLE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IDataStream.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IDataStream.h deleted file mode 100644 index b40480850..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IDataStream.h +++ /dev/null @@ -1,46 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 08/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_DATA_STREAM_H__ -#define __MYGUI_I_DATA_STREAM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IDataStream - { - public: - virtual ~IDataStream() { } - - virtual bool eof() = 0; - virtual size_t size() = 0; - virtual void readline(std::string& _source, Char _delim = '\n') = 0; - virtual size_t read(void* _buf, size_t _count) = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_DATA_STREAM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IFont.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IFont.h deleted file mode 100644 index 14357714e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IFont.h +++ /dev/null @@ -1,54 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_FONT_H__ -#define __MYGUI_I_FONT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISerializable.h" -#include "MyGUI_IResource.h" -#include "MyGUI_FontData.h" - -namespace MyGUI -{ - - class ITexture; - - class MYGUI_EXPORT IFont : public IResource - { - MYGUI_RTTI_DERIVED( IFont ) - - public: - IFont() { } - virtual ~IFont() { } - - virtual GlyphInfo* getGlyphInfo(Char _id) = 0; - - virtual ITexture* getTextureFont() = 0; - - virtual int getDefaultHeight() = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_FONT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayer.h deleted file mode 100644 index 2f45bccac..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayer.h +++ /dev/null @@ -1,79 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_LAYER_H__ -#define __MYGUI_I_LAYER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_IRenderTarget.h" -#include "MyGUI_ILayerNode.h" -#include "MyGUI_ISerializable.h" - -namespace MyGUI -{ - - class ILayerItem; - - class MYGUI_EXPORT ILayer : public ISerializable - { - MYGUI_RTTI_DERIVED( ILayer ) - - public: - ILayer() { } - virtual ~ILayer() { } - - // èìÿ ëååðà - const std::string& getName() const { return mName; } - - // ñîçäàåì äî÷åðíèé íîä - virtual ILayerNode* createChildItemNode() = 0; - // óäàëÿåì äî÷åðíèé íîä - virtual void destroyChildItemNode(ILayerNode* _node) = 0; - - // ïîäíèìàåì äî÷åðíèé íîä - virtual void upChildItemNode(ILayerNode* _node) = 0; - - // ñïèñîê äåòåé - virtual EnumeratorILayerNode getEnumerator() = 0; - - // âîçâðàùàåò âèäæåò ïî ïîçèöèè - virtual ILayerItem* getLayerItemByPoint(int _left, int _top) = 0; - - // âîçâðàùàåò ïîçèöèþ â êîîðäèíàòàõ ëååðà - virtual IntPoint getPosition(int _left, int _top) const = 0; - - // âîçâðàùàåò ðàçìåð ëååðà - virtual const IntSize& getSize() const = 0; - - // ðèñóåò ëååð - virtual void renderToTarget(IRenderTarget* _target, bool _update) = 0; - - virtual void dumpStatisticToLog() { } - - protected: - std::string mName; - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_LAYER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerItem.h deleted file mode 100644 index b7705b163..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerItem.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_LAYER_ITEM_H__ -#define __MYGUI_I_LAYER_ITEM_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - class ILayer; - class ILayerNode; - - class MYGUI_EXPORT ILayerItem - { - public: - virtual ~ILayerItem() { } - - virtual ILayerItem * getLayerItemByPoint(int _left, int _top) = 0; - virtual const IntCoord& getLayerItemCoord() = 0; - - virtual void attachItemToNode(ILayer* _layer, ILayerNode* _node) = 0; - virtual void detachFromLayer() = 0; - virtual void upLayerItem() = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_LAYER_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerNode.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerNode.h deleted file mode 100644 index 7a4e67748..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ILayerNode.h +++ /dev/null @@ -1,91 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_LAYER_NODE_H__ -#define __MYGUI_I_LAYER_NODE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_IObject.h" -#include "MyGUI_IRenderTarget.h" - -namespace MyGUI -{ - - class ILayer; - class ILayerItem; - class ILayerNode; - - class RenderItem; - class ISubWidget; - - typedef std::vector VectorILayerNode; - typedef Enumerator EnumeratorILayerNode; - - class MYGUI_EXPORT ILayerNode : public IObject - { - MYGUI_RTTI_DERIVED( ILayerNode ) - - public: - virtual ~ILayerNode() { } - - // ëååð, êîòîðîìó ìû ïðèíàäëåæèì - virtual ILayer* getLayer() = 0; - - // âîçâðàùàåò îòöà èëè nullptr - virtual ILayerNode* getParent() = 0; - - // ñîçäàåì äî÷åðíèé íîä - virtual ILayerNode* createChildItemNode() = 0; - // óäàëÿåì äî÷åðíèé íîä - virtual void destroyChildItemNode(ILayerNode* _node) = 0; - - // ïîäíèìàåì äî÷åðíèé íîä - virtual void upChildItemNode(ILayerNode* _node) = 0; - - // ñïèñîê äåòåé - virtual EnumeratorILayerNode getEnumerator() = 0; - - - // äîáàâëÿåì àéòåì ê íîäó - virtual void attachLayerItem(ILayerItem* _item) = 0; - // óäàëÿåì àéòåì èç íîäà - virtual void detachLayerItem(ILayerItem* _root) = 0; - - // äîáàâëÿåò ñàá àéòåì è âîçâðàùàåò ðåíäåð àéòåì - virtual RenderItem* addToRenderItem(ITexture* _texture, ISubWidget* _item) = 0; - // íåîáõîäèìî îáíîâëåíèå íîäà - virtual void outOfDate(RenderItem* _item) = 0; - - // âîçâðàùàåò âèäæåò ïî ïîçèöèè - virtual ILayerItem* getLayerItemByPoint(int _left, int _top) = 0; - - // ðèñóåò ëååð - virtual void renderToTarget(IRenderTarget* _target, bool _update) = 0; - - virtual void dumpStatisticToLog(size_t _level) { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_LAYER_NODE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IObject.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IObject.h deleted file mode 100644 index 6364afae7..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IObject.h +++ /dev/null @@ -1,43 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_OBJECT_H__ -#define __MYGUI_I_OBJECT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_RTTI.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IObject - { - MYGUI_RTTI_BASE( IObject ) - - public: - virtual ~IObject() { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_OBJECT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IPointer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IPointer.h deleted file mode 100644 index 709247818..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IPointer.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_POINTER_H__ -#define __MYGUI_I_POINTER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IResource.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IPointer : public IResource - { - MYGUI_RTTI_DERIVED( IPointer ) - - public: - IPointer() { } - virtual ~IPointer() { } - - virtual void setImage(StaticImage* _image) = 0; - virtual void setPosition(StaticImage* _image, const IntPoint& _point) = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_POINTER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IRenderTarget.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IRenderTarget.h deleted file mode 100644 index 38094fac5..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IRenderTarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_RENDER_TARGET_H__ -#define __MYGUI_I_RENDER_TARGET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_RenderTargetInfo.h" - -namespace MyGUI -{ - - class ITexture; - class IVertexBuffer; - - class MYGUI_EXPORT IRenderTarget - { - public: - IRenderTarget() { } - virtual ~IRenderTarget() { } - - virtual void begin() = 0; - virtual void end() = 0; - - virtual void doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count) = 0; - - virtual const RenderTargetInfo& getInfo() = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_RENDER_TARGET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IResource.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IResource.h deleted file mode 100644 index b296b684c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IResource.h +++ /dev/null @@ -1,77 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_RESOURCE_H__ -#define __MYGUI_I_RESOURCE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Guid.h" -#include "MyGUI_Version.h" -#include "MyGUI_ISerializable.h" -#include "MyGUI_ResourceHolder.h" - -namespace MyGUI -{ - - class IResource; - typedef IResource * IResourcePtr; - - class ResourceManager; - - class MYGUI_EXPORT IResource : public ISerializable - { - // Ð´Ð»Ñ Ñерелизации - friend class ResourceManager; - // Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ - friend class ResourceHolder; - - MYGUI_RTTI_DERIVED( IResource ) - - public: - const std::string& getResourceName() { return mResourceName; } - const Guid& getResourceID() { return mResourceID; } - - protected: - IResource() { } - private: - // constructors and operator =, without implementation, just for private - IResource(IResource const &); - IResource& operator = (IResource const &); - - protected: - virtual void deserialization(xml::ElementPtr _node, Version _version) - { - mResourceID = Guid::parse(_node->findAttribute("id")); - mResourceName = _node->findAttribute("name"); - } - - virtual ~IResource() { } - - private: - std::string mResourceName; - Guid mResourceID; - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_RESOURCE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISerializable.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISerializable.h deleted file mode 100644 index 69b5cfa02..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISerializable.h +++ /dev/null @@ -1,49 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_SERIALIZABLE_H__ -#define __MYGUI_I_SERIALIZABLE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IObject.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Version.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ISerializable : public IObject - { - MYGUI_RTTI_DERIVED( ISerializable ) - - public: - ISerializable() { } - virtual ~ISerializable() { } - - virtual void serialization(xml::ElementPtr _node, Version _version) { } - virtual void deserialization(xml::ElementPtr _node, Version _version) { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_SERIALIZABLE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IStateInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IStateInfo.h deleted file mode 100644 index 478522144..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IStateInfo.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_STATE_INFO_H__ -#define __MYGUI_I_STATE_INFO_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISerializable.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IStateInfo : public ISerializable - { - MYGUI_RTTI_DERIVED( IStateInfo ) - - public: - virtual ~IStateInfo() { } - - }; - - typedef std::vector VectorStateInfo; - typedef std::map MapStateInfo; - typedef std::map MapWidgetStateInfo; - -} // namespace MyGUI - -#endif // __MYGUI_I_STATE_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidget.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidget.h deleted file mode 100644 index c213eb700..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidget.h +++ /dev/null @@ -1,62 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_SUB_WIDGET_H__ -#define __MYGUI_I_SUB_WIDGET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ICroppedRectangle.h" -#include "MyGUI_ILayerNode.h" -#include "MyGUI_Types.h" -#include "MyGUI_IRenderTarget.h" -#include "MyGUI_IStateInfo.h" -#include "MyGUI_IObject.h" - -namespace MyGUI -{ - - class ISubWidget; - typedef std::vector VectorSubWidget; - - class MYGUI_EXPORT ISubWidget : - public ICroppedRectangle, - public IObject - { - MYGUI_RTTI_DERIVED( ISubWidget ) - - public: - virtual ~ISubWidget() { } - - virtual void createDrawItem(ITexture* _texture, ILayerNode* _node) = 0; - virtual void destroyDrawItem() = 0; - - virtual void setAlpha(float _alpha) { } - - virtual void setStateData(IStateInfo* _data) { } - - virtual void doRender() = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_SUB_WIDGET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetRect.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetRect.h deleted file mode 100644 index 57fe40ac0..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetRect.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_SUB_WIDGET_RECT_H__ -#define __MYGUI_I_SUB_WIDGET_RECT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISubWidget.h" -#include "MyGUI_Colour.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ISubWidgetRect : public ISubWidget - { - MYGUI_RTTI_DERIVED( ISubWidgetRect ) - - public: - virtual ~ISubWidgetRect() { } - - virtual void _setUVSet(const FloatRect& _rect) { } - virtual void _setColour(const Colour& _value) { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_SUB_WIDGET_RECT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetText.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetText.h deleted file mode 100644 index a90783401..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ISubWidgetText.h +++ /dev/null @@ -1,114 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_SUB_WIDGET_TEXT_H__ -#define __MYGUI_I_SUB_WIDGET_TEXT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISubWidget.h" -#include "MyGUI_Colour.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ISubWidgetText : public ISubWidget - { - MYGUI_RTTI_DERIVED( ISubWidgetText ) - - public: - virtual ~ISubWidgetText() { } - - /** Get index of start of selection */ - virtual size_t getTextSelectionStart() { return 0; } - /** Get index of end of selection */ - virtual size_t getTextSelectionEnd() { return 0; } - /** Set text selection */ - virtual void setTextSelection(size_t _start, size_t _end) { } - - // интенÑивноÑÑ‚ÑŒ выделенного текÑта - virtual bool getSelectBackground() { return true; } - virtual void setSelectBackground(bool _normal) { } - - // нужно ли инвертировать выделение - virtual bool getInvertSelected() { return true; } - virtual void setInvertSelected(bool _value) { } - - // управление видимоÑтью курÑора - virtual bool isVisibleCursor() { return false; } - virtual void setVisibleCursor(bool _value) { } - - // управление положением курÑора - virtual size_t getCursorPosition() { return 0; } - virtual void setCursorPosition(size_t _index) { } - - virtual void setWordWrap(bool _value) { } - - // возвращает положение курÑора по произвольному положению - // Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð°Ð±ÑолютнаÑ, без учета Ñмещений - virtual size_t getCursorPosition(const IntPoint& _point) { return 0; } - - // возвращает положение курÑора в обÑолютных координатах - virtual IntCoord getCursorCoord(size_t _position) { return IntCoord(); } - - // возвращает положение курÑора в обÑолютных координатах - IntPoint getCursorPoint(size_t _position) - { - const IntCoord& coord = getCursorCoord(_position); - return IntPoint(coord.left + coord.width / 2, coord.top + coord.height / 2); - } - - // возвращает положение курÑора в обÑолютных координатах - IntRect getCursorRect(size_t _position) - { - const IntCoord& coord = getCursorCoord(_position); - return IntRect(coord.left, coord.top, coord.left + coord.width, coord.top + coord.height); - } - - // возвращает размер текÑта в пикÑелÑÑ… - virtual IntSize getTextSize() { return IntSize(); } - - // уÑтанавливает Ñмещение текÑта в пикÑелÑÑ… - virtual void setViewOffset(const IntPoint& _point) { } - virtual IntPoint getViewOffset() { return IntPoint(); } - - virtual void setCaption(const UString& _value) { } - virtual const UString& getCaption() { static UString caption; return caption; } - - virtual void setTextColour(const Colour& _value) { } - virtual const Colour& getTextColour() { return Colour::Zero; } - - virtual void setFontName(const std::string& _value) { } - virtual const std::string& getFontName() { static std::string name; return name; } - - virtual void setFontHeight(int _value) { } - virtual int getFontHeight() { return 0; } - - virtual void setTextAlign(Align _value) { } - virtual Align getTextAlign() { return Align::Default; } - - virtual void setShiftText(bool _value) { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_SUB_WIDGET_TEXT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ITexture.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ITexture.h deleted file mode 100644 index fdf093f2f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ITexture.h +++ /dev/null @@ -1,73 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_TEXTURE_H__ -#define __MYGUI_I_TEXTURE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IRenderTarget.h" -#include "MyGUI_RenderFormat.h" -#include - -namespace MyGUI -{ - class ITexture; - - class MYGUI_EXPORT ITextureInvalidateListener - { - public: - virtual void textureInvalidate(ITexture* _texture) = 0; - }; - - class MYGUI_EXPORT ITexture - { - public: - virtual ~ITexture() { } - - virtual const std::string& getName() const = 0; - - virtual void createManual(int _width, int _height, TextureUsage _usage, PixelFormat _format) = 0; - virtual void loadFromFile(const std::string& _filename) = 0; - virtual void saveToFile(const std::string& _filename) = 0; - - virtual void setInvalidateListener(ITextureInvalidateListener* _listener) { } - - virtual void destroy() = 0; - - virtual void* lock(TextureUsage _access) = 0; - virtual void unlock() = 0; - virtual bool isLocked() = 0; - - virtual int getWidth() = 0; - virtual int getHeight() = 0; - - virtual PixelFormat getFormat() = 0; - virtual TextureUsage getUsage() = 0; - virtual size_t getNumElemBytes() = 0; - - virtual IRenderTarget* getRenderTarget() { return nullptr; } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_TEXTURE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IUnlinkWidget.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IUnlinkWidget.h deleted file mode 100644 index f890e435a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IUnlinkWidget.h +++ /dev/null @@ -1,43 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_UNLINK_WIDGET_H__ -#define __MYGUI_UNLINK_WIDGET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetDefines.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IUnlinkWidget - { - public: - virtual ~IUnlinkWidget() { } - virtual void _unlinkWidget(Widget* _widget) = 0; - }; - - typedef std::vector VectorIUnlinkWidget; - -} // namespace MyGUI - -#endif // __MYGUI_UNLINK_WIDGET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IVertexBuffer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IVertexBuffer.h deleted file mode 100644 index 7533e9fcd..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IVertexBuffer.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_VERTEX_BUFFER_H__ -#define __MYGUI_I_VERTEX_BUFFER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_VertexData.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IVertexBuffer - { - public: - virtual ~IVertexBuffer() { } - - virtual void setVertextCount(size_t _value) = 0; - virtual size_t getVertextCount() = 0; - - virtual Vertex* lock() = 0; - virtual void unlock() = 0; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_I_VERTEX_BUFFER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetCreator.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetCreator.h deleted file mode 100644 index d82e4ac36..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetCreator.h +++ /dev/null @@ -1,64 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 03/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_CREATOR_H__ -#define __MYGUI_WIDGET_CREATOR_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_WidgetStyle.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT IWidgetCreator - { - friend class WidgetManager; - - public: - virtual ~IWidgetCreator() { } - - protected: - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name) = 0; - - // удÑлÑет неудачника - virtual void _destroyChildWidget(Widget* _widget) = 0; - - // удалÑет вÑех детей - virtual void _destroyAllChildWidget() = 0; - - // удалÑет виджет Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ конÑтруктором - void _deleteWidget(Widget* _widget); - - public: - // добавлÑет в ÑпиÑок виджет - // имплементировать только Ð´Ð»Ñ Ñ€ÑƒÑ‚Ð¾Ð²Ñ‹Ñ… креаторов - virtual void _linkChildWidget(Widget* _widget) { } - // удалÑет из ÑпиÑка - // имплементировать только Ð´Ð»Ñ Ñ€ÑƒÑ‚Ð¾Ð²Ñ‹Ñ… креаторов - virtual void _unlinkChildWidget(Widget* _widget) { } - - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_CREATOR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetFactory.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetFactory.h deleted file mode 100644 index d3929375f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_IWidgetFactory.h +++ /dev/null @@ -1,95 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_I_WIDGET_FACTORY_H__ -#define __MYGUI_I_WIDGET_FACTORY_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_WidgetStyle.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_ICroppedRectangle.h" - -#include "MyGUI_WidgetManager.h" -#include "MyGUI_SkinManager.h" - -namespace MyGUI -{ - - //OBSOLETE - class MYGUI_EXPORT IWidgetFactory - { - public: - virtual ~IWidgetFactory() { } - - virtual const std::string& getTypeName() = 0; - virtual Widget* createWidget(WidgetStyle _style, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) = 0; - }; - - namespace factory - { - - //OBSOLETE - template - class MYGUI_EXPORT BaseWidgetFactory : public IWidgetFactory - { - public: - BaseWidgetFactory() - { - // регеÑтрируем ÑÐµÐ±Ñ - MyGUI::WidgetManager& manager = MyGUI::WidgetManager::getInstance(); - manager.registerFactory(this); - } - - ~BaseWidgetFactory() - { - // удалÑем ÑÐµÐ±Ñ - MyGUI::WidgetManager& manager = MyGUI::WidgetManager::getInstance(); - manager.unregisterFactory(this); - } - - const std::string& getTypeName() - { - return T::getClassTypeName(); - } - - Widget* createWidget(WidgetStyle _style, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) - { - T* instance = new T(_style, _coord, _align, SkinManager::getInstance().getByName(_skin), _parent, _croppedParent, _creator, _name); - return instance; - } - - bool isFalseType(Widget* _ptr, const std::string &_key) - { - if (!_ptr->isType()) - { - MYGUI_LOG(Error, "Property '" << _key << "' is not supported by '" << _ptr->getTypeName() << "' widget"); - return true; - } - return false; - } - }; - - } // namespace factory -} // namespace MyGUI - -#endif // __MYGUI_I_WIDGET_FACTORY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ImageInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ImageInfo.h deleted file mode 100644 index 9f6e5a090..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ImageInfo.h +++ /dev/null @@ -1,64 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_IMAGE_INFO_H__ -#define __MYGUI_IMAGE_INFO_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct ImageItem - { - ImageItem() : frame_rate(0) { } - - float frame_rate; - std::vector images; - }; - - typedef std::vector VectorImages; - - struct ImageIndexInfo - { - ImageIndexInfo( - const std::string& _texture, - const IntSize& _size, - const float _rate, - const std::vector& _frames - ) : - texture(_texture), - size(_size), - rate(_rate), - frames(_frames) - { - } - - const std::string& texture; - const IntSize& size; - const float rate; - const std::vector& frames; - }; - -} // namespace MyGUI - -#endif // __MYGUI_IMAGE_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputDefine.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputDefine.h deleted file mode 100644 index 7ecd43d88..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputDefine.h +++ /dev/null @@ -1,227 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 03/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_INPUT_DEFINE_H__ -#define __MYGUI_INPUT_DEFINE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT MouseButton - { - enum Enum - { - Left = 0, - Right, - Middle, - - Button0 = 0, - Button1, - Button2, - Button3, - Button4, - Button5, - Button6, - Button7, - - None = -1 - }; - - MouseButton(Enum _value = None) : value(_value) { } - - friend bool operator == (MouseButton const& a, MouseButton const& b) { return a.value == b.value; } - friend bool operator != (MouseButton const& a, MouseButton const& b) { return a.value != b.value; } - - int toValue() const { return (int)value; } - - private: - Enum value; - }; - - struct MYGUI_EXPORT KeyCode - { - enum Enum - { - None = 0x00, - Escape = 0x01, - One = 0x02, - Two = 0x03, - Three = 0x04, - Four = 0x05, - Five = 0x06, - Six = 0x07, - Seven = 0x08, - Eight = 0x09, - Nine = 0x0A, - Zero = 0x0B, - Minus = 0x0C, /* - on main keyboard */ - Equals = 0x0D, - Backspace = 0x0E, /* Backspace */ - Tab = 0x0F, - Q = 0x10, - W = 0x11, - E = 0x12, - R = 0x13, - T = 0x14, - Y = 0x15, - U = 0x16, - I = 0x17, - O = 0x18, - P = 0x19, - LeftBracket = 0x1A, - RightBracket = 0x1B, - Return = 0x1C, /* Enter on main keyboard */ - LeftControl = 0x1D, - A = 0x1E, - S = 0x1F, - D = 0x20, - F = 0x21, - G = 0x22, - H = 0x23, - J = 0x24, - K = 0x25, - L = 0x26, - Semicolon = 0x27, - Apostrophe = 0x28, - Grave = 0x29, /* Accent grave ( ~ ) */ - LeftShift = 0x2A, - Backslash = 0x2B, - Z = 0x2C, - X = 0x2D, - C = 0x2E, - V = 0x2F, - B = 0x30, - N = 0x31, - M = 0x32, - Comma = 0x33, - Period = 0x34, /* . on main keyboard */ - Slash = 0x35, /* '/' on main keyboard */ - RightShift = 0x36, - Multiply = 0x37, /* * on numeric keypad */ - LeftAlt = 0x38, /* Left Alt */ - Space = 0x39, - Capital = 0x3A, - F1 = 0x3B, - F2 = 0x3C, - F3 = 0x3D, - F4 = 0x3E, - F5 = 0x3F, - F6 = 0x40, - F7 = 0x41, - F8 = 0x42, - F9 = 0x43, - F10 = 0x44, - NumLock = 0x45, - ScrollLock = 0x46, /* Scroll Lock */ - Numpad7 = 0x47, - Numpad8 = 0x48, - Numpad9 = 0x49, - Subtract = 0x4A, /* - on numeric keypad */ - Numpad4 = 0x4B, - Numpad5 = 0x4C, - Numpad6 = 0x4D, - Add = 0x4E, /* + on numeric keypad */ - Numpad1 = 0x4F, - Numpad2 = 0x50, - Numpad3 = 0x51, - Numpad0 = 0x52, - Decimal = 0x53, /* . on numeric keypad */ - OEM_102 = 0x56, /* < > | on UK/Germany keyboards */ - F11 = 0x57, - F12 = 0x58, - F13 = 0x64, /* (NEC PC98) */ - F14 = 0x65, /* (NEC PC98) */ - F15 = 0x66, /* (NEC PC98) */ - Kana = 0x70, /* (Japanese keyboard) */ - ABNT_C1 = 0x73, /* / ? on Portugese (Brazilian) keyboards */ - Convert = 0x79, /* (Japanese keyboard) */ - NoConvert = 0x7B, /* (Japanese keyboard) */ - Yen = 0x7D, /* (Japanese keyboard) */ - ABNT_C2 = 0x7E, /* Numpad . on Portugese (Brazilian) keyboards */ - NumpadEquals = 0x8D, /* = on numeric keypad (NEC PC98) */ - PrevTrack = 0x90, /* Previous Track (KC_CIRCUMFLEX on Japanese keyboard) */ - At = 0x91, /* (NEC PC98) */ - Colon = 0x92, /* (NEC PC98) */ - Underline = 0x93, /* (NEC PC98) */ - Kanji = 0x94, /* (Japanese keyboard) */ - Stop = 0x95, /* (NEC PC98) */ - AX = 0x96, /* (Japan AX) */ - Unlabeled = 0x97, /* (J3100) */ - NextTrack = 0x99, /* Next Track */ - NumpadEnter = 0x9C, /* Enter on numeric keypad */ - RightControl = 0x9D, - Mute = 0xA0, - Calculator = 0xA1, - PlayPause = 0xA2, /* Play / Pause */ - MediaStop = 0xA4, /* Media Stop */ - VolumeDown = 0xAE, /* Volume - */ - VolumeUp = 0xB0, /* Volume + */ - WebHome = 0xB2, /* Web home */ - NumpadComma = 0xB3, /* , on numeric keypad (NEC PC98) */ - Divide = 0xB5, /* / on numeric keypad */ - SysRq = 0xB7, - RightAlt = 0xB8, /* Right Alt */ - Pause = 0xC5, - Home = 0xC7, /* Home on arrow keypad */ - ArrowUp = 0xC8, /* UpArrow on arrow keypad */ - PageUp = 0xC9, /* PgUp on arrow keypad */ - ArrowLeft = 0xCB, /* LeftArrow on arrow keypad */ - ArrowRight = 0xCD, /* RightArrow on arrow keypad */ - End = 0xCF, /* End on arrow keypad */ - ArrowDown = 0xD0, /* DownArrow on arrow keypad */ - PageDown = 0xD1, /* PgDn on arrow keypad */ - Insert = 0xD2, /* Insert on arrow keypad */ - Delete = 0xD3, /* Delete on arrow keypad */ - LeftWindows = 0xDB, /* Left Windows key */ - RightWindow = 0xDC, /* Right Windows key */ - RightWindows = 0xDC, /* Right Windows key - Correct spelling :) */ - AppMenu = 0xDD, /* AppMenu key */ - Power = 0xDE, /* System Power */ - Sleep = 0xDF, /* System Sleep */ - Wake = 0xE3, /* System Wake */ - WebSearch = 0xE5, - WebFavorites = 0xE6, - WebRefresh = 0xE7, - WebStop = 0xE8, - WebForward = 0xE9, - WebBack = 0xEA, - MyComputer = 0xEB, - Mail = 0xEC, - MediaSelect = 0xED - }; - - KeyCode(Enum _value = None) : value(_value) { } - - friend bool operator == (KeyCode const& a, KeyCode const& b) { return a.value == b.value; } - friend bool operator != (KeyCode const& a, KeyCode const& b) { return a.value != b.value; } - - int toValue() const { return (int)value; } - - private: - Enum value; - }; - -} // namespace MyGUI - -#endif // __MYGUI_INPUT_DEFINE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputManager.h deleted file mode 100644 index bb7a6bc78..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_InputManager.h +++ /dev/null @@ -1,180 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_INPUT_MANAGER_H__ -#define __MYGUI_INPUT_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Macros.h" -#include "MyGUI_Instance.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_InputDefine.h" -#include "MyGUI_Timer.h" -#include "MyGUI_ILayer.h" -#include "MyGUI_Delegate.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT InputManager : public IUnlinkWidget - { - MYGUI_INSTANCE_HEADER( InputManager ) - - public: - void initialise(); - void shutdown(); - - /** Inject MouseMove event - @return true if event has been processed by GUI - */ - bool injectMouseMove(int _absx, int _absy, int _absz); - /** Inject MousePress event - @return true if event has been processed by GUI - */ - bool injectMousePress(int _absx, int _absy, MouseButton _id); - /** Inject MouseRelease event - @return true if event has been processed by GUI - */ - bool injectMouseRelease(int _absx, int _absy, MouseButton _id); - - /** Inject KeyPress event - @return true if event has been processed by GUI - */ - bool injectKeyPress(KeyCode _key, Char _text = 0); - /** Inject KeyRelease event - @return true if event has been processed by GUI - */ - bool injectKeyRelease(KeyCode _key); - - /** Is any widget have mouse focus */ - bool isFocusMouse() { return mWidgetMouseFocus != nullptr; } - /** Is any widget have key focus */ - bool isFocusKey() { return mWidgetKeyFocus != nullptr; } - /** Is any widget captured mouse */ - bool isCaptureMouse() { return mIsWidgetMouseCapture; } - - /** Set key focus for _widget */ - void setKeyFocusWidget(Widget* _widget); - /** Drop key focus for _widget */ - void resetKeyFocusWidget(Widget* _widget); - /** Drop any key focus */ - void resetKeyFocusWidget() { setKeyFocusWidget(nullptr); } - - /** Get mouse focused widget */ - Widget* getMouseFocusWidget() { return mWidgetMouseFocus; } - /** Get key focused widget */ - Widget* getKeyFocusWidget() { return mWidgetKeyFocus; } - /** Get position of last left mouse button press */ - const IntPoint& getLastLeftPressed() { return mLastLeftPressed; } - /** Get current mouse position */ - const IntPoint& getMousePosition() { return mMousePosition; } - - IntPoint getMousePositionByLayer(); - - // теÑтовый вариант, очиÑтка фокуÑа мыши - /** Drop any mouse focus */ - void resetMouseFocusWidget(); - - // работа Ñ Ð¼Ð¾Ð´Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ окнами - /** Add modal widget - all other widgets inaccessible while modal widget exist */ - void addWidgetModal(Widget* _widget); - /** Remove modal widget */ - void removeWidgetModal(Widget* _widget); - - /** Return true if any modal widget exist */ - bool isModalAny() { return !mVectorModalRootWidget.empty(); } - - /** Is control button pressed */ - bool isControlPressed() { return mIsControlPressed; } - /** Is shift button pressed */ - bool isShiftPressed() { return mIsShiftPressed; } - - /** Reset mouse capture (for example when we dragging and application - lost focus you should call this) - */ - void resetMouseCaptureWidget() { mIsWidgetMouseCapture = false; } - - void unlinkWidget(Widget* _widget) { _unlinkWidget(_widget); } - - /** Event :\n - signature : void method(MyGUI::Widget* _widget)\n - @param _widget - */ - delegates::CMultiDelegate1 - eventChangeMouseFocus; - - /** Event :\n - signature : void method(MyGUI::Widget* _widget)\n - @param _widget - */ - delegates::CMultiDelegate1 - eventChangeKeyFocus; - - private: - // удалÑем данный виджет из вÑех возможных меÑÑ‚ - void _unlinkWidget(Widget* _widget); - - void frameEntered(float _frame); - - void firstEncoding(KeyCode _key, bool bIsKeyPressed); - - // запоминает клавишу Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ - void storeKey(KeyCode _key, Char _text); - - // ÑбраÑывает клавишу Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ - void resetKey(); - - private: - // виджеты которым принадлежит Ñ„Ð¾ÐºÑƒÑ - Widget* mWidgetMouseFocus; - Widget* mWidgetKeyFocus; - ILayer* mLayerMouseFocus; - // захватил ли мышь активный виджет - bool mIsWidgetMouseCapture; - // таймер Ð´Ð»Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð³Ð¾ клика - Timer mTimer; //used for double click timing - - // нажат ли шифт - bool mIsShiftPressed; - // нажат ли контрол - bool mIsControlPressed; - // там где была поÑледний раз нажата Ð»ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° - IntPoint mLastLeftPressed; - IntPoint mMousePosition; - // клавиша Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð° - KeyCode mHoldKey; - Char mHoldChar; - bool mFirstPressKey; - float mTimerKey; - int mOldAbsZ; - - // ÑпиÑок виджетов Ñ Ð¼Ð¾Ð´Ð°Ð»ÑŒÐ½Ñ‹Ð¼ режимом - VectorWidgetPtr mVectorModalRootWidget; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_INPUT_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Instance.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Instance.h deleted file mode 100644 index 8f6d79cde..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Instance.h +++ /dev/null @@ -1,45 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_INSTANCE_H__ -#define __MYGUI_INSTANCE_H__ - -#define MYGUI_INSTANCE_HEADER(type) \ - private: \ - static type* msInstance; \ - bool mIsInitialise; \ - public: \ - type();\ - ~type();\ - static type& getInstance(); \ - static type* getInstancePtr(); - - -#define MYGUI_INSTANCE_IMPLEMENT(type) \ - const std::string INSTANCE_TYPE_NAME(#type); \ - type* type::msInstance = nullptr; \ - type* type::getInstancePtr() { return msInstance; } \ - type& type::getInstance() { MYGUI_ASSERT(0 != msInstance, "instance " << INSTANCE_TYPE_NAME << " was not created"); return (*msInstance); } \ - type::type() : mIsInitialise(false) { MYGUI_ASSERT(0 == msInstance, "instance " << INSTANCE_TYPE_NAME << " is exsist"); msInstance = this; } \ - type::~type() { msInstance = nullptr; } - -#endif // __MYGUI_INSTANCE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ItemBox.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ItemBox.h deleted file mode 100644 index f3ad3f8c7..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ItemBox.h +++ /dev/null @@ -1,368 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ITEM_BOX_H__ -#define __MYGUI_ITEM_BOX_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_DDContainer.h" -#include "MyGUI_IBItemInfo.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ScrollViewBase.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_ItemBoxPtrWidgetPtr; - typedef delegates::CDelegate3 EventHandle_ItemBoxPtrIntCoordRefBool; - typedef delegates::CDelegate3 EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef; - typedef delegates::CDelegate2 EventHandle_ItemBoxPtrSizeT; - typedef delegates::CDelegate2 EventHandle_ItemBoxPtrCIBNotifyCellDataRef; - - class MYGUI_EXPORT ItemBox : - public DDContainer, - protected ScrollViewBase - { - MYGUI_RTTI_DERIVED( ItemBox ) - - public: - ItemBox(); - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - void insertItemAt(size_t _index, Any _data = Any::Null); - - //! Add an item to the end of a array - void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - //! Remove all items - void removeAllItems(); - - //! Redraw at a specified position - void redrawItemAt(size_t _index); - - //! Redraw all items - void redrawAllItems(); - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - //! Get index of selected item (ITEM_NONE if none selected) - size_t getIndexSelected() { return mIndexSelect; } - - //! Select specified _index - void setIndexSelected(size_t _index); - - //! Clear item selection - void clearIndexSelected() { setIndexSelected(ITEM_NONE); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt"); - return mItemsInfo[_index].data.castType(_throw); - } - - - /** Set vertical alignment grid mode */ - void setItemBoxAlignVert(bool _value); - /** Get vertical alignment grid mode flag */ - bool getItemBoxAlignVert() { return mAlignVert; } - - /** Get item index by item Widget pointer */ - size_t getIndexByWidget(Widget* _widget); - - /** Get widget created for drop */ - Widget* getWidgetDrag() { return mItemDrag; } - - /** Get item Widget pointer by item index if it is visible - @note returned widget can be deleted, so this pointer - is valid only at time when you got it and can be invalid - next frame - */ - Widget* getWidgetByIndex(size_t _index); - - /** Interrupt drag as if widget was dropped into empty space */ - void resetDrag(); - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /*event:*/ - /** Event : request for creating new item - signature : void method(MyGUI::ItemBox* _sender, MyGUI::Widget* _item) - @param _sender widget that called this event - @param _item widget item pointer - */ - EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem; - - /** Event : request for item coordinate - signature : void method(MyGUI::ItemBox* _sender, MyGUI::IntCoord& _coord, bool _drag) - @param _sender widget that called this event - @param _coord write heer item coordinate - @param _drag is this item dragging - */ - EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem; - - /** Event : request for item redraw - signature : void method(MyGUI::ItemBox* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info) - @param _sender widget that called this event - @param _item widget item pointer - @param _info item info - */ - EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem; - - /** Event : doubleclick or enter pressed on item - signature : void method(MyGUI::ItemBox* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ItemBoxPtrSizeT eventSelectItemAccept; - - /** Event : position of selected item was changed - signature : void method(MyGUI::ItemBox* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ItemBoxPtrSizeT eventChangeItemPosition; - - /** Event : click on item - signature : void method(MyGUI::ItemBox* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ItemBoxPtrSizeT eventMouseItemActivate; - - /** Event : notify about event in item widget - signature : void method(MyGUI::ItemBox* _sender, const MyGUI::IBNotifyItemData& _info) - @param _sender widget that called this event - @param _info info about item notify - */ - EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem; - - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - MYGUI_OBSOLETE("use : size_t ItemBox::getItemIndexSelected()") - size_t getItemIndexSelected() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)") - void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()") - void clearItemSelected() { clearIndexSelected(); } - - MYGUI_OBSOLETE("use : void ItemBox::insertItemAt(size_t _index, Any _data)") - void insertItem(size_t _index, Any _data = Any::Null) { insertItemAt(_index, _data); } - MYGUI_OBSOLETE("use : void ItemBox::setItemDataAt(size_t _index, Any _data)") - void setItemData(size_t _index, Any _data) { setItemDataAt(_index, _data); } - MYGUI_OBSOLETE("use : void ItemBox::removeItemAt(size_t _index)") - void deleteItem(size_t _index) { removeItemAt(_index); } - MYGUI_OBSOLETE("use : void ItemBox::removeAllItems()") - void deleteAllItems() { removeAllItems(); } - MYGUI_OBSOLETE("use : size_t ItemBox::getIndexSelected()") - size_t getItemSelect() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()") - void resetItemSelect() { clearIndexSelected(); } - MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)") - void setItemSelect(size_t _index) { setIndexSelected(_index); } - - MYGUI_OBSOLETE("use : Widget* ItemBox::getWidgetDrag()") - Widget* getWidgetDrop() { return getWidgetDrag(); } - MYGUI_OBSOLETE("use : void ItemBox::resetDrag()") - void resetDrop() { resetDrag(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - - protected: - virtual ~ItemBox(); - - struct ItemDataInfo - { - ItemDataInfo(Any _data) : - data(_data) { } - Any data; - }; - typedef std::vector VectorItemInfo; - - void baseChangeWidgetSkin(ResourceSkin* _info); - - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); - virtual void onMouseDrag(int _left, int _top); - - virtual void onMouseWheel(int _rel); - virtual void onKeyLostFocus(Widget* _new); - virtual void onKeySetFocus(Widget* _old); - - void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char); - void notifyKeyButtonReleased(Widget* _sender, KeyCode _key); - void notifyScrollChangePosition(VScroll* _sender, size_t _index); - void notifyMouseWheel(Widget* _sender, int _rel); - void notifyRootMouseChangeFocus(Widget* _sender, bool _focus); - void notifyMouseButtonDoubleClick(Widget* _sender); - void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index); - void notifyMouseDrag(Widget* _sender, int _left, int _top); - void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id); - - - virtual void removeDropItems(); - virtual void updateDropItems(); - virtual void updateDropItemsState(const DDWidgetState& _state); - - // ОбновлÑет данные о айтемах, при изменении размеров - void updateMetrics(); - - // проÑто обновлÑет вÑе виджеты что видны - void _updateAllVisible(bool _redraw); - - void updateFromResize(); - - // возвращает Ñледующий айтем, еÑли нет его, то ÑоздаетÑÑ - // запроÑÑ‹ только поÑледовательно - Widget* getItemWidget(size_t _index); - - void _setContainerItemInfo(size_t _index, bool _set, bool _accept); - - // ÑбраÑываем Ñтарую подÑветку - void resetCurrentActiveItem(); - // ищет и уÑтанавливает подÑвеченный айтем - void findCurrentActiveItem(); - - // запрашиваем у конейтера айтем по позиции мыши - virtual size_t _getContainerIndex(const IntPoint& _point); - - // ÑбраÑывает завиÑимоÑти, при любом колличеÑтвенном изменении - virtual void _resetContainer(bool _update); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - size_t calcIndexByWidget(Widget* _widget); - - void requestItemSize(); - - virtual IntSize getContentSize(); - virtual IntPoint getContentPosition(); - virtual IntSize getViewSize() const; - virtual void eraseContent(); - virtual size_t getHScrollPage(); - virtual size_t getVScrollPage(); - virtual Align getContentAlign(); - virtual void setContentPosition(const IntPoint& _point); - - IntRect _getClientAbsoluteRect(); - Widget* _getClientWidget(); - const Widget* _getClientWidget() const; - - private: - // наши дети в Ñтроках - VectorWidgetPtr mVectorItems; - - // размер одного айтема - IntSize mSizeItem; - - // размерноÑÑ‚ÑŒ Ñкролла в пикÑелÑÑ… - IntSize mContentSize; - // Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñкролла п пикÑелÑÑ… - IntPoint mContentPosition; - - // колличеÑтво айтемов в одной Ñтроке - int mCountItemInLine; - // колличеÑтво линий - int mCountLines; - - // ÑÐ°Ð¼Ð°Ñ Ð²ÐµÑ€Ñ…Ð½ÑÑ Ñтрока - int mFirstVisibleIndex; - // текущее Ñмещение верхнего Ñлемента в пикÑелÑÑ… - // Ñколько его пикÑелей не видно Ñверху - int mFirstOffsetIndex; - - // текущий выделенный Ñлемент или ITEM_NONE - size_t mIndexSelect; - // подÑвеченный Ñлемент или ITEM_NONE - size_t mIndexActive; - // Ð¸Ð½Ð´ÐµÐºÑ Ñо ÑвойÑтвом приема или ITEM_NONE - size_t mIndexAccept; - // Ð¸Ð½Ð´ÐµÐºÑ Ñо ÑвойÑтвом отказа или ITEM_NONE - size_t mIndexRefuse; - - // имеем ли мы Ñ„Ð¾ÐºÑƒÑ Ð²Ð²Ð¾Ð´Ð° - bool mIsFocus; - - // Ñтруктура данных об айтеме - VectorItemInfo mItemsInfo; - - Widget* mItemDrag; - IntPoint mPointDragOffset; - - bool mAlignVert; - - std::string mDragLayer; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_ITEM_BOX_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LanguageManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LanguageManager.h deleted file mode 100644 index 3ad168022..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LanguageManager.h +++ /dev/null @@ -1,96 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LANGUAGE_MANAGER_H__ -#define __MYGUI_LANGUAGE_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Delegate.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT LanguageManager - { - MYGUI_INSTANCE_HEADER( LanguageManager ) - - public: - void initialise(); - void shutdown(); - - /** Load additional MyGUI *_language.xml file */ - bool load(const std::string& _file); - - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - /** Set current language for replacing #{} tags */ - void setCurrentLanguage(const std::string& _name); - /** Get current language */ - const std::string& getCurrentLanguage(); - - /** Replace all tags #{tagname} in _line with appropriate string dependent - on current language or keep #{tagname} if 'tagname' not found found */ - UString replaceTags(const UString& _line); - - /** Get tag value */ - UString getTag(const UString& _tag); - - /** Add user tag */ - void addUserTag(const UString& _tag, const UString& _replace); - - /** Delete all user tags */ - void clearUserTags(); - - bool loadUserTags(const std::string& _file); - - /** Event : Change current language.\n - signature : void method(const std::string& _language); - @param _language Current language. - */ - delegates::CMultiDelegate1 eventChangeLanguage; - - private: - //bool loadResourceLanguage(const std::string& _name); - bool loadLanguage(const std::string& _file, bool _user = false); - void _loadLanguage(IDataStream* _stream, bool _user); - void _loadLanguageXML(IDataStream* _stream, bool _user); - //void _loadSource(xml::ElementPtr _node, const std::string& _file, Version _version); - - private: - typedef std::map MapLanguageString; - - MapLanguageString mMapLanguage; - MapLanguageString mUserMapLanguage; - - std::string mCurrentLanguageName; - - typedef std::vector VectorString; - typedef std::map MapListString; - MapListString mMapFile; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_LANGUAGE_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerItem.h deleted file mode 100644 index 59098f7d3..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerItem.h +++ /dev/null @@ -1,88 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LAYER_ITEM_H__ -#define __MYGUI_LAYER_ITEM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_LayerManager.h" -#include "MyGUI_ILayer.h" -#include "MyGUI_ILayerNode.h" -#include "MyGUI_ILayerItem.h" -#include "MyGUI_ISubWidget.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT LayerItem : public ILayerItem - { - public: - LayerItem(); - virtual ~LayerItem() { } - - public: - ILayer* getLayer() { return mLayer; } - - virtual void attachItemToNode(ILayer* _layer, ILayerNode* _node); - virtual void detachFromLayer(); - virtual void upLayerItem(); - - void setRenderItemTexture(ITexture* _texture); - - void addChildItem(LayerItem* _item); - void removeChildItem(LayerItem* _item); - - void addChildNode(LayerItem* _item); - void removeChildNode(LayerItem* _item); - - void addRenderItem(ISubWidget* _item); - void removeAllRenderItems(); - - void saveLayerItem(); - void restoreLayerItem(); - - protected: - void attachToLayerItemNode(ILayerNode* _node, bool _deep); - void detachFromLayerItemNode(bool _deep); - - private: - // актуально Ð´Ð»Ñ Ñ€ÑƒÑ‚Ð¾Ð²Ð¾Ð³Ð¾ виджета - ILayer* mLayer; - // конкретный айтем находÑщийÑÑ Ð² Ñлое - ILayerNode * mLayerNode; - ILayerNode * mSaveLayerNode; - - typedef std::vector VectorLayerItem; - // ÑпиÑок наших детей айтемов - VectorLayerItem mLayerItems; - // ÑпиÑок наших узлов - VectorLayerItem mLayerNodes; - - // вектор вÑех детей ÑабÑкинов - VectorSubWidget mDrawItems; - - ITexture* mTexture; - }; - -} // namespace MyGUI - -#endif // __MYGUI_LAYER_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerManager.h deleted file mode 100644 index b5413c3ff..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerManager.h +++ /dev/null @@ -1,99 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LAYER_MANAGER_H__ -#define __MYGUI_LAYER_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_ResourceManager.h" -#include "MyGUI_ILayer.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT LayerManager : - public IUnlinkWidget - { - MYGUI_INSTANCE_HEADER( LayerManager ) - - public: - typedef std::vector VectorLayer; - typedef Enumerator EnumeratorLayer; - - public: - void initialise(); - void shutdown(); - - /** Attach widget to specific layer - @param _name Layer name - @param _item Widget pointer - */ - void attachToLayerNode(const std::string& _name, Widget* _item); - /** Detach widget from layer - @param _item Widget pointer - */ - void detachFromLayer(Widget* _item); - - /** Up widget to be on top of its layer - @param _item Widget pointer - */ - void upLayerItem(Widget* _item); - - /** Load additional MyGUI *_layer.xml file */ - bool load(const std::string& _file); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - /** Check is layer exist */ - bool isExist(const std::string& _name) const; - /** Get layer nodes Enumerator */ - EnumeratorLayer getEnumerator() { return EnumeratorLayer(mLayerNodes); } - - ILayer* getByName(const std::string& _name, bool _throw = true) const; - - /** Get top visible and enabled widget at specified position */ - Widget* getWidgetFromPoint(int _left, int _top); - - void renderToTarget(IRenderTarget* _target, bool _update); - - virtual void dumpStatisticToLog(); - - private: - // удалÑем данный виджет из вÑех возможных меÑÑ‚ - void _unlinkWidget(Widget* _widget); - - void clear(); - - void merge(VectorLayer& _layers); - void destroy(ILayer* _layer); - - private: - VectorLayer mLayerNodes; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_LAYER_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerNode.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerNode.h deleted file mode 100644 index 36ad2b8d1..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayerNode.h +++ /dev/null @@ -1,105 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LAYER_NODE_H__ -#define __MYGUI_LAYER_NODE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ILayer.h" -#include "MyGUI_ILayerNode.h" -#include "MyGUI_RenderItem.h" - -namespace MyGUI -{ - - class LayerItem; - typedef std::vector VectorRenderItem; - typedef std::vector VectorLayerItem; - - class MYGUI_EXPORT LayerNode : public ILayerNode - { - MYGUI_RTTI_DERIVED( LayerNode ) - - public: - explicit LayerNode(ILayer* _layer, ILayerNode * _parent = nullptr); - virtual ~LayerNode(); - - // леер, которому мы принадлежим - virtual ILayer* getLayer() { return mLayer; } - - // возвращает отца или nullptr - virtual ILayerNode* getParent() { return mParent; } - - // Ñоздаем дочерний нод - virtual ILayerNode* createChildItemNode(); - // удалÑем дочерний нод - virtual void destroyChildItemNode(ILayerNode* _node); - - // поднимаем дочерний нод - virtual void upChildItemNode(ILayerNode* _node); - - // ÑпиÑок детей - virtual EnumeratorILayerNode getEnumerator(); - - // добавлÑем айтем к ноду - virtual void attachLayerItem(ILayerItem* _item); - // удалÑем айтем из нода - virtual void detachLayerItem(ILayerItem* _item); - - // добавлÑет Ñаб айтем и возвращает рендер айтем - virtual RenderItem* addToRenderItem(ITexture* _texture, ISubWidget* _item); - // необходимо обновление нода - virtual void outOfDate(RenderItem* _item); - - // возвращает виджет по позиции - virtual ILayerItem* getLayerItemByPoint(int _left, int _top); - - // риÑует леер - virtual void renderToTarget(IRenderTarget* _target, bool _update); - - virtual void dumpStatisticToLog(size_t _level); - - bool isOutOfDate() { return mOutOfDate; } - - protected: - void updateCompression(); - - protected: - // ÑпиÑок двух очередей отриÑовки, Ð´Ð»Ñ ÑабÑкинов и текÑта - VectorRenderItem mFirstRenderItems; - VectorRenderItem mSecondRenderItems; - - // ÑпиÑок вÑех рутовых виджетов - // у перекрывающегоÑÑ ÑÐ»Ð¾Ñ Ð·Ð´ÐµÑÑŒ только один - VectorLayerItem mLayerItems; - - // ÑпиÑок такиж как мы, Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´ÐµÑ€ÐµÐ²Ð° - VectorILayerNode mChildItems; - - ILayerNode * mParent; - ILayer* mLayer; - bool mOutOfDate; - }; - -} // namespace MyGUI - -#endif // __MYGUI_LAYER_NODE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayoutManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayoutManager.h deleted file mode 100644 index ff57a917b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LayoutManager.h +++ /dev/null @@ -1,78 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LAYOUT_MANAGER_H__ -#define __MYGUI_LAYOUT_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_Gui.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT LayoutManager - { - MYGUI_INSTANCE_HEADER( LayoutManager ) - - public: - void initialise(); - void shutdown(); - - /** Load layout file - @param _file name of layout - @return Return vector of pointers of loaded root widgets (root == without parents) - */ - VectorWidgetPtr& load(const std::string& _file); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - /** Load layout file - @param _file name of layout - @param _prefix will be added to all loaded widgets names - @param _parent widget to load on - @return Return vector of pointers of loaded root widgets (root == without parents) - */ - VectorWidgetPtr& loadLayout(const std::string& _file, const std::string& _prefix = "", Widget* _parent = nullptr); - - /** Unload layout file */ - void unloadLayout(VectorWidgetPtr& _widgets); - - private: - void parseLayout(VectorWidgetPtr& _widgets, xml::ElementPtr _root); - void parseWidget(VectorWidgetPtr& _widgets, xml::ElementEnumerator& _widget, Widget* _parent); - - private: - // Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° поÑледней загрузки - VectorWidgetPtr mVectorWidgetPtr; - - // Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¸ загрузке лейаута - std::string layoutPrefix; - // Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¸ загрузке лейаута - Widget* layoutParent; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_LAYOUT_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_List.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_List.h deleted file mode 100644 index 6a6cbeb1a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_List.h +++ /dev/null @@ -1,333 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LIST_H__ -#define __MYGUI_LIST_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_ListPtrSizeT; - - class MYGUI_EXPORT List : - public Widget - { - MYGUI_RTTI_DERIVED( List ) - - public: - List(); - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); - - //! Add an item to the end of a array - void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - //! Remove all items - void removeAllItems(); - - //! Swap items at a specified positions - void swapItemsAt(size_t _index1, size_t _index2); - - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndexWith(const UString& _name); - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - /** Get index of selected item (ITEM_NONE if none selected) */ - size_t getIndexSelected() { return mIndexSelect; } - - /** Select specified _index */ - void setIndexSelected(size_t _index); - - /** Clear item selection */ - void clearIndexSelected() { setIndexSelected(ITEM_NONE); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "List::getItemDataAt"); - return mItemsInfo[_index].second.castType(_throw); - } - - - //------------------------------------------------------------------------------// - // манипулÑции отображением - - //! Replace an item name at a specified position - void setItemNameAt(size_t _index, const UString& _name); - - //! Get item name from specified position - const UString& getItemNameAt(size_t _index); - - - //------------------------------------------------------------------------------// - // манипулÑции выдимоÑтью - - //! Move all elements so specified becomes visible - void beginToItemAt(size_t _index); - - //! Move all elements so first becomes visible - void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } - - //! Move all elements so last becomes visible - void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } - - //! Move all elements so selected becomes visible - void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } - - //------------------------------------------------------------------------------// - - // видим ли мы Ñлемент, полноÑтью или нет - /** Return true if item visible - @param - _index of item - @param - _fill false: function return true when whole item is visible - true: function return true when at least part of item is visible - */ - bool isItemVisibleAt(size_t _index, bool _fill = true); - //! Same as List::isItemVisible for selected item - bool isItemSelectedVisible(bool _fill = true) { return isItemVisibleAt(mIndexSelect, _fill); } - - - //! Set scroll visible when it needed - void setScrollVisible(bool _visible); - //! Set scroll position - void setScrollPosition(size_t _position); - - //------------------------------------------------------------------------------------// - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - // возвращает макÑимальную выÑоту вмещающую вÑе Ñтроки и родительÑкий бордюр - //! Return optimal height to fit all items in List - int getOptimalHeight(); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : Enter pressed or double click.\n - signature : void method(MyGUI::List* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of selected item - */ - EventPair eventListSelectAccept; - - /** Event : Selected item position changed.\n - signature : void method(MyGUI::List* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of new item - */ - EventPair eventListChangePosition; - - /** Event : Item was selected by mouse.\n - signature : void method(MyGUI::List* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of selected item - */ - EventPair eventListMouseItemActivate; - - /** Event : Mouse is over item.\n - signature : void method(MyGUI::List* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of focused item - */ - EventPair eventListMouseItemFocus; - - /** Event : Position of scroll changed.\n - signature : void method(MyGUI::List* _sender, size_t _position)\n - @param _sender widget that called this event - @param _position of scroll - */ - EventPair eventListChangeScroll; - - /*internal:*/ - // Ð´ÐµÐ±Ð°Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° на правильноÑÑ‚ÑŒ Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ ÑпиÑка - void _checkAlign(); - - // вÑпомогательные методы Ð´Ð»Ñ ÑоÑтавных ÑпиÑков - void _setItemFocus(size_t _position, bool _focus); - void _sendEventChangeScroll(size_t _position); - - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - MYGUI_OBSOLETE("use : size_t List::getIndexSelected()") - size_t getItemIndexSelected() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)") - void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void List::clearIndexSelected()") - void clearItemSelected() { clearIndexSelected(); } - - MYGUI_OBSOLETE("use : void List::insertItemAt(size_t _index, const UString& _name)") - void insertItem(size_t _index, const UString& _item) { insertItemAt(_index, _item); } - MYGUI_OBSOLETE("use : void List::setItemNameAt(size_t _index, const UString& _name)") - void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); } - MYGUI_OBSOLETE("use : const UString& List::getItemNameAt(size_t _index)") - const UString& getItem(size_t _index) { return getItemNameAt(_index); } - MYGUI_OBSOLETE("use : void List::removeItemAt(size_t _index)") - void deleteItem(size_t _index) { removeItemAt(_index); } - MYGUI_OBSOLETE("use : void List::removeAllItems()") - void deleteAllItems() { removeAllItems(); } - MYGUI_OBSOLETE("use : size_t List::findItemIndexWith(const UString& _name)") - size_t findItem(const UString& _item) { return findItemIndexWith(_item); } - MYGUI_OBSOLETE("use : size_t List::getIndexSelected()") - size_t getItemSelect() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void List::clearIndexSelected()") - void resetItemSelect() { clearIndexSelected(); } - MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)") - void setItemSelect(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void List::beginToItemAt(size_t _index)") - void beginToIndex(size_t _index) { beginToItemAt(_index); } - MYGUI_OBSOLETE("use : void List::beginToItemFirst()") - void beginToStart() { beginToItemFirst(); } - MYGUI_OBSOLETE("use : void List::beginToItemLast()") - void beginToEnd() { beginToItemLast(); } - MYGUI_OBSOLETE("use : void List::beginToItemSelected()") - void beginToSelect() { beginToItemSelected(); } - MYGUI_OBSOLETE("use : bool List::isItemVisibleAt(size_t _index, bool _fill)") - bool isItemVisible(size_t _index, bool _fill = true) { return isItemVisibleAt(_index, _fill); } - MYGUI_OBSOLETE("use : bool List::isItemSelectedVisible(bool _fill)") - bool isItemSelectVisible(bool _fill = true) { return isItemSelectedVisible(_fill); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~List(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - void onMouseWheel(int _rel); - void onKeyLostFocus(Widget* _new); - void onKeySetFocus(Widget* _old); - void onKeyButtonPressed(KeyCode _key, Char _char); - - void notifyScrollChangePosition(VScroll* _sender, size_t _rel); - void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseDoubleClick(Widget* _sender); - void notifyMouseWheel(Widget* _sender, int _rel); - void notifyMouseSetFocus(Widget* _sender, Widget* _old); - void notifyMouseLostFocus(Widget* _sender, Widget* _new); - - void updateScroll(); - void updateLine(bool _reset = false); - void _setScrollView(size_t _position); - - // перериÑовывает от индекÑа до низа - void _redrawItemRange(size_t _start = 0); - - // перериÑовывает Ð¸Ð½Ð´ÐµÐºÑ - void _redrawItem(size_t _index); - - // ищет и выделÑет елемент - void _selectIndex(size_t _index, bool _select); - - void _updateState() { setState(mIsFocus ? "pushed" : "normal"); } - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - void _checkMapping(const std::string& _owner); - - Widget* _getClientWidget(); - const Widget* _getClientWidget() const; - - private: - std::string mSkinLine; - VScroll* mWidgetScroll; - - // наши дети в Ñтроках - VectorWidgetPtr mWidgetLines; - - int mHeightLine; // выÑота одной Ñтроки - int mTopIndex; // Ð¸Ð½Ð´ÐµÐºÑ Ñамого верхнего Ñлемента - int mOffsetTop; // текущее Ñмещение - int mRangeIndex; // размерноÑÑ‚ÑŒ Ñкрола - size_t mLastRedrawLine; // поÑледнÑÑ Ð¿ÐµÑ€ÐµÑ€Ð¸ÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ - - size_t mIndexSelect; // текущий выделенный Ñлемент или ITEM_NONE - size_t mLineActive; // текущий виджет над которым мыша - - typedef std::pair PairItem; - typedef std::vector VectorItemInfo; - VectorItemInfo mItemsInfo; - - // имеем ли мы Ñ„Ð¾ÐºÑƒÑ Ð²Ð²Ð¾Ð´Ð° - bool mIsFocus; - bool mNeedVisibleScroll; - - IntSize mOldSize; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_LIST_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListBox.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListBox.h deleted file mode 100644 index a090eb498..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListBox.h +++ /dev/null @@ -1,147 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LIST_BOX_H__ -#define __MYGUI_LIST_BOX_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ListCtrl.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ListBox : - public ListCtrl - { - MYGUI_RTTI_DERIVED( ListBox ) - - public: - ListBox(); - - //------------------------------------------------------------------------------// - // ìàíèïóëÿöèè àéòåìàìè - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); - - //! Add an item to the end of a array - void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - //! Remove all items - void removeAllItems(); - - //! Swap items at a specified positions - void swapItemsAt(size_t _index1, size_t _index2); - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndexWith(const UString& _name); - - - //------------------------------------------------------------------------------// - // ìàíèïóëÿöèè âûäåëåíèÿìè - - /** Get index of selected item (ITEM_NONE if none selected) */ - size_t getIndexSelected() { return Base::getIndexSelected(); } - - /** Select specified _index */ - void setIndexSelected(size_t _index) { Base::setIndexSelected(_index); } - - /** Clear item selection */ - void clearIndexSelected() { Base::clearIndexSelected(); } - - - //------------------------------------------------------------------------------// - // ìàíèïóëÿöèè äàííûìè - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data) { Base::setItemDataAt(_index, _data); } - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { Base::clearItemDataAt(_index); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - return Base::getItemDataAt(_index, _throw); - } - - - //------------------------------------------------------------------------------// - // ìàíèïóëÿöèè îòîáðàæåíèåì - - //! Replace an item name at a specified position - void setItemNameAt(size_t _index, const UString& _name); - - //! Get item name from specified position - const UString& getItemNameAt(size_t _index); - - - //------------------------------------------------------------------------------// - // ìàíèïóëÿöèè âûäèìîñòüþ - - //! Move all elements so specified becomes visible - void beginToItemAt(size_t _index); - - //! Move all elements so first becomes visible - void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } - - //! Move all elements so last becomes visible - void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } - - //! Move all elements so selected becomes visible - void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } - - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~ListBox(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void notifyCreateWidgetItem(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item); - void notifyDrawItem(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info, MyGUI::IntCoord& _coord); - - private: - std::string mSkinLine; - int mHeightLine; - - typedef std::vector VectorUTFString; - VectorUTFString mItemsInfo; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_LIST_BOX_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListCtrl.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListCtrl.h deleted file mode 100644 index ad235966c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ListCtrl.h +++ /dev/null @@ -1,301 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LIST_CTRL_H__ -#define __MYGUI_LIST_CTRL_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_DDContainer.h" -#include "MyGUI_IBItemInfo.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ScrollViewBase.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_ListCtrlPtrWidgetPtr; - typedef delegates::CDelegate4 EventHandle_ListCtrlPtrWidgetPtrCIBCellDrawInfoRef; - typedef delegates::CDelegate2 EventHandle_ListCtrlPtrSizeT; - typedef delegates::CDelegate2 EventHandle_ListCtrlPtrCIBNotifyCellDataRef; - - class MYGUI_EXPORT ListCtrl : - public DDContainer, - protected ScrollViewBase - { - MYGUI_RTTI_DERIVED( ListCtrl ) - - public: - ListCtrl(); - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - void insertItemAt(size_t _index, Any _data = Any::Null); - - //! Add an item to the end of a array - void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - //! Remove all items - void removeAllItems(); - - //! Redraw at a specified position - void redrawItemAt(size_t _index); - - //! Redraw all items - void redrawAllItems() { _updateAllVisible(ITEM_NONE, true, true); } - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - //! Get index of selected item (ITEM_NONE if none selected) - size_t getIndexSelected() { return mIndexSelect; } - - //! Select specified _index - void setIndexSelected(size_t _index); - - //! Clear item selection - void clearIndexSelected() { setIndexSelected(ITEM_NONE); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListCtrl::getItemDataAt"); - return mItemsInfo[_index].data.castType(_throw); - } - - - /** Get item index by item Widget pointer */ - size_t getIndexByWidget(Widget* _widget); - - /** Get widget created for drop */ - Widget* getWidgetDrag() { return mItemDrag; } - - /** Get item Widget pointer by item index if it is visible - @note returned widget can be deleted, so this pointer - is valid only at time when you got it and can be invalid - next frame - */ - Widget* getWidgetByIndex(size_t _index); - - /** Interrupt drag as if widget was dropped into empty space */ - void resetDrag(); - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - - /*event:*/ - /** Event : request for creating new item - signature : void method(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item) - @param _sender widget that called this event - @param _item widget item pointer - */ - EventHandle_ListCtrlPtrWidgetPtr requestCreateWidgetItem; - - /** Event : request for item redraw - signature : void method(MyGUI::ListCtrl* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info) - @param _sender widget that called this event - @param _item widget item pointer - @param _info item info - */ - EventHandle_ListCtrlPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem; - - /** Event : doubleclick or enter pressed on item - signature : void method(MyGUI::ListCtrl* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ListCtrlPtrSizeT eventSelectItemAccept; - - /** Event : position of selected item was changed - signature : void method(MyGUI::ListCtrl* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ListCtrlPtrSizeT eventChangeItemPosition; - - /** Event : click on item - signature : void method(MyGUI::ListCtrl* _sender, size_t _index) - @param _sender widget that called this event - @param _index item index - */ - EventHandle_ListCtrlPtrSizeT eventMouseItemActivate; - - /** Event : notify about event in item widget - signature : void method(MyGUI::ListCtrl* _sender, const MyGUI::IBNotifyItemData& _info) - @param _sender widget that called this event - @param _info info about item notify - */ - EventHandle_ListCtrlPtrCIBNotifyCellDataRef eventNotifyItem; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~ListCtrl(); - - struct ItemDataInfo - { - ItemDataInfo(Any _data) : - data(_data) { } - Any data; - IntSize size; - }; - typedef std::vector VectorItemInfo; - - void baseChangeWidgetSkin(ResourceSkin* _info); - - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); - virtual void onMouseDrag(int _left, int _top); - - virtual void onMouseWheel(int _rel); - virtual void onKeyLostFocus(Widget* _new); - virtual void onKeySetFocus(Widget* _old); - - void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char); - void notifyKeyButtonReleased(Widget* _sender, KeyCode _key); - void notifyScrollChangePosition(VScroll* _sender, size_t _index); - void notifyMouseWheel(Widget* _sender, int _rel); - void notifyRootMouseChangeFocus(Widget* _sender, bool _focus); - void notifyMouseButtonDoubleClick(Widget* _sender); - void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index); - void notifyMouseDrag(Widget* _sender, int _left, int _top); - void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id); - - - virtual void removeDropItems(); - virtual void updateDropItems(); - virtual void updateDropItemsState(const DDWidgetState& _state); - - // ОбновлÑет данные о айтемах, при изменении размеров - void updateMetrics(); - - // проÑто обновлÑет вÑе виджеты что видны - void _updateAllVisible(size_t _index, bool _needUpdateContetntSize, bool _update); - - void updateFromResize(); - - // возвращает Ñледующий айтем, еÑли нет его, то ÑоздаетÑÑ - // запроÑÑ‹ только поÑледовательно - Widget* getItemWidget(size_t _index); - - void _setContainerItemInfo(size_t _index, bool _set, bool _accept); - - // ÑбраÑываем Ñтарую подÑветку - void resetCurrentActiveItem(); - // ищет и уÑтанавливает подÑвеченный айтем - void findCurrentActiveItem(); - - // запрашиваем у конейтера айтем по позиции мыши - virtual size_t _getContainerIndex(const IntPoint& _point); - - // ÑбраÑывает завиÑимоÑти, при любом колличеÑтвенном изменении - virtual void _resetContainer(bool _update); - - void _setScrollViewPage(size_t _size) { mScrollViewPage = _size; } - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - size_t calcIndexByWidget(Widget* _widget) { return *_widget->_getInternalData(); } - - virtual IntSize getContentSize(); - virtual IntPoint getContentPosition(); - virtual IntSize getViewSize() const; - virtual void eraseContent(); - virtual size_t getHScrollPage(); - virtual size_t getVScrollPage(); - virtual Align getContentAlign(); - virtual void setContentPosition(const IntPoint& _point); - - Widget* _getClientWidget(); - const Widget* _getClientWidget() const; - - private: - // наши дети в Ñтроках - VectorWidgetPtr mVectorItems; - - // размерноÑÑ‚ÑŒ Ñкролла в пикÑелÑÑ… - IntSize mContentSize; - // Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñкролла п пикÑелÑÑ… - IntPoint mContentPosition; - - // текущий выделенный Ñлемент или ITEM_NONE - size_t mIndexSelect; - // подÑвеченный Ñлемент или ITEM_NONE - size_t mIndexActive; - // Ð¸Ð½Ð´ÐµÐºÑ Ñо ÑвойÑтвом приема или ITEM_NONE - size_t mIndexAccept; - // Ð¸Ð½Ð´ÐµÐºÑ Ñо ÑвойÑтвом отказа или ITEM_NONE - size_t mIndexRefuse; - - // имеем ли мы Ñ„Ð¾ÐºÑƒÑ Ð²Ð²Ð¾Ð´Ð° - bool mIsFocus; - - // Ñтруктура данных об айтеме - VectorItemInfo mItemsInfo; - - Widget* mItemDrag; - IntPoint mPointDragOffset; - - std::string mDragLayer; - - size_t mScrollViewPage; - }; - -} // namespace MyGUI - -#endif // __MYGUI_LIST_CTRL_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogManager.h deleted file mode 100644 index 83edeffe0..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogManager.h +++ /dev/null @@ -1,88 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LOG_MANAGER_H__ -#define __MYGUI_LOG_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_LogStream.h" -#include - -namespace MyGUI -{ - - #define MYGUI_LOGGING(section, level, text) \ - MyGUI::LogManager::out(section, MyGUI::LogManager::level) \ - << text \ - << MyGUI::LogManager::info(__FILE__, __LINE__) \ - << MyGUI::LogManager::end() - - class MYGUI_EXPORT LogManager - { - - public: - enum LogLevel - { - Info, - Warning, - Error, - Critical, - EndLogLevel - }; - - public: - static void shutdown(); - static void initialise(); - - static void registerSection(const std::string& _section, const std::string& _file); - static void unregisterSection(const std::string& _section); - - static LogStream& out(const std::string& _section, LogLevel _level); - static const std::string& info(const char * _file /* = __FILE__*/, int _line /* = __LINE__*/); - - static const LogStream::LogStreamEnd& end(); - - // set logging enabled on std output device - static void setSTDOutputEnabled(bool _enable); - static bool getSTDOutputEnabled(); - - private: - LogManager(); - ~LogManager(); - - public: - static const std::string General; - static const std::string separator; - - static LogStream::LogStreamEnd endl; - static const std::string LevelsName[EndLogLevel]; - - private: - static LogManager * msInstance; - typedef std::map MapLogStream; - MapLogStream mMapSectionFileName; - bool mSTDOut; - }; - -} // namespace MyGUI - -#endif // __MYGUI_LOG_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogStream.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogStream.h deleted file mode 100644 index de168caed..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_LogStream.h +++ /dev/null @@ -1,74 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_LOG_STREAM_H__ -#define __MYGUI_LOG_STREAM_H__ - -#include "MyGUI_Prerequest.h" -#include -#include -#include - -namespace MyGUI -{ - - class MYGUI_EXPORT LogStream - { - friend class LogManager; - - public: - struct LogStreamEnd { }; - - public: - LogStream& operator<<(const LogStreamEnd& _endl); - - template - inline LogStream& operator<<(T _value) - { - if (getSTDOutputEnabled()) std::cout << _value; - if (mStream.is_open()) mStream << _value; - return *this; - } - - const std::string& getFileName() const { return mFileName; } - - private: - LogStream(); - ~LogStream(); - - LogStream(const std::string& _file); - - void start(const std::string& _section, const std::string& _level); - - bool getSTDOutputEnabled(); - - void lock() const { } - void release() const { } - - private: - std::ofstream mStream; - std::string mFileName; - }; - -} // namespace MyGUI - -#endif // __MYGUI_LOG_STREAM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Macros.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Macros.h deleted file mode 100644 index 23f3573a2..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Macros.h +++ /dev/null @@ -1,41 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MACROS_H__ -#define __MYGUI_MACROS_H__ - -namespace MyGUI -{ - - const size_t ITEM_NONE = ~(size_t)0; - const int DEFAULT ((int)-1); - const float ALPHA_MAX = 1.0f; - const float ALPHA_MIN = 0.0f; - - //FIXME çàìåíèòü íà øàáëîíû - #define MYGUI_FLAG_NONE 0 - #define MYGUI_FLAG(num) (1<<(num)) - -} // namespace MyGUI - - -#endif // __MYGUI_MACROS_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MainSkin.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MainSkin.h deleted file mode 100644 index 2164c5c9b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MainSkin.h +++ /dev/null @@ -1,47 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MAIN_SKIN_H__ -#define __MYGUI_MAIN_SKIN_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_SubSkin.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT MainSkin : public SubSkin - { - MYGUI_RTTI_DERIVED( MainSkin ) - - public: - MainSkin(); - virtual ~MainSkin(); - - /*internal:*/ - void _setAlign(const IntSize& _oldsize, bool _update); - void _setAlign(const IntCoord& _oldsize, bool _update) { SubSkin::_setAlign(_oldsize, _update); } - }; - -} // namespace MyGUI - -#endif // __MYGUI_SUB_SKIN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MaskPickInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MaskPickInfo.h deleted file mode 100644 index dda95375a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MaskPickInfo.h +++ /dev/null @@ -1,61 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MASK_PICK_INFO_H__ -#define __MYGUI_MASK_PICK_INFO_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT MaskPickInfo - { - public: - MaskPickInfo() : width(0), height(0) { } - - bool load(const std::string& _file); - - bool pick(const IntPoint& _point, const IntCoord& _coord) const - { - if ((0 == _coord.width) || (0 == _coord.height)) return false; - - int x = ((_point.left * width)-1) / _coord.width; - int y = ((_point.top * height)-1) / _coord.height; - - return 0 != data[(size_t)(y * width + x)]; - } - - bool empty() const - { - return data.empty(); - } - - private: - std::vector data; - int width, height; - }; - -} // namespace MyGUI - -#endif // __MYGUI_MASK_PICK_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuBar.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuBar.h deleted file mode 100644 index e56d2ac4b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuBar.h +++ /dev/null @@ -1,56 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MENU_BAR_H__ -#define __MYGUI_MENU_BAR_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_MenuCtrl.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT MenuBar : - public MenuCtrl - { - MYGUI_RTTI_DERIVED( MenuBar ) - - public: - MenuBar(); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~MenuBar(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_MENU_BAR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuCtrl.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuCtrl.h deleted file mode 100644 index 48297606d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuCtrl.h +++ /dev/null @@ -1,371 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MENU_CTRL_H__ -#define __MYGUI_MENU_CTRL_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_MenuItemType.h" -#include "MyGUI_Widget.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_MenuItemType.h" -#include "MyGUI_ControllerFadeAlpha.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_MenuCtrlPtrMenuItemPtr; - typedef delegates::CDelegate1 EventHandle_MenuCtrlPtr; - - class MYGUI_EXPORT MenuCtrl : - public Widget - { - MYGUI_RTTI_DERIVED( MenuCtrl ) - - public: - MenuCtrl(); - - enum ItemImage - { - ItemImageNone, - ItemImagePopup - }; - - struct ItemInfo - { - ItemInfo(MenuItem* _item, const UString& _name, MenuItemType _type, MenuCtrl* _submenu, const std::string& _id, Any _data) : - item(_item), - name(_name), - type(_type), - submenu(_submenu), - id(_id), - data(_data), - width(0) - { - } - - /** Item */ - MenuItem* item; - /** Item name*/ - UString name; - /** Widget have separator after item */ - MenuItemType type; - /** Sub menu (or nullptr if no submenu) */ - MenuCtrl* submenu; - /** Item id*/ - std::string id; - /** User data */ - Any data; - /** Item width */ - int width; - }; - - typedef std::vector VectorMenuItemInfo; - - public: - /** @copydoc Widget::setVisible */ - virtual void setVisible(bool _value); - - /** Hide or show Menu smooth */ - void setVisibleSmooth(bool _value); - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - MenuItem* insertItemAt(size_t _index, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null); - //! Insert an item into a array - MenuItem* insertItem(MenuItem* _to, const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null); - - //! Add an item to the end of a array - MenuItem* addItem(const UString& _name, MenuItemType _type = MenuItemType::Normal, const std::string& _id = "", Any _data = Any::Null); - - //! Remove item at a specified position - void removeItemAt(size_t _index); - //! Remove item - void removeItem(MenuItem* _item); - - //! Remove all items - void removeAllItems(); - - - //! Get item from specified position - MenuItem* getItemAt(size_t _index); - - //! Get item index - size_t getItemIndex(MenuItem* _item); - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndex(MenuItem* _item); - - //! Search item, returns the item of the first occurrence in array or nullptr if item not found - MenuItem* findItemWith(const UString& _name); - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - //! Replace an item data - void setItemData(MenuItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); } - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - //! Clear an item data - void clearItemData(MenuItem* _item) { clearItemDataAt(getItemIndex(_item)); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "MenuCtrl::getItemDataAt"); - return mItemsInfo[_index].data.castType(_throw); - } - //! Get item data - template - ValueType * getItemData(MenuItem* _item, bool _throw = true) - { - return getItemDataAt(getItemIndex(_item), _throw); - } - - //! Replace an item id at a specified position - void setItemIdAt(size_t _index, const std::string& _id); - //! Replace an item id - void setItemId(MenuItem* _item, const std::string& _id) { setItemIdAt(getItemIndex(_item), _id); } - - //! Get item id from specified position - const std::string& getItemIdAt(size_t _index); - //! Get item id - const std::string& getItemId(MenuItem* _item) { return getItemIdAt(getItemIndex(_item)); } - - /** Get item by id */ - MenuItem* getItemById(const std::string& _id); - - /** Get item index by id */ - size_t getItemIndexById(const std::string& _id); - //------------------------------------------------------------------------------// - // манипулÑции отображением - - //! Replace an item name at a specified position - void setItemNameAt(size_t _index, const UString& _name); - //! Replace an item name - void setItemName(MenuItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); } - - //! Get item from specified position - const UString& getItemNameAt(size_t _index); - //! Get item from specified position - const UString& getItemName(MenuItem* _item) { return getItemNameAt(getItemIndex(_item)); } - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndexWith(const UString& _name); - - /** Show or hide item (submenu) at a specified position */ - void setItemChildVisibleAt(size_t _index, bool _visible); - /** Show or hide item (submenu) */ - void setItemChildVisible(MenuItem* _item, bool _visible) { setItemChildVisibleAt(getItemIndex(_item), _visible); } - - //------------------------------------------------------------------------------// - // оÑтальные манипулÑции - - /** Create specific type child item (submenu) for item by index */ - template - Type * createItemChildTAt(size_t _index) - { - return static_cast(createItemChildByType(_index, Type::getClassTypeName())); - } - - /** Create specific type child item (submenu) for item */ - template - Type * createItemChildT(MenuItem* _item) { return createItemChildTAt(getItemIndex(_item)); } - - /** Get child item (submenu) from item by index */ - MenuCtrl* getItemChildAt(size_t _index); - - /** Get child item (submenu) from item */ - MenuCtrl* getItemChild(MenuItem* _item) { return getItemChildAt(getItemIndex(_item)); } - - /** Create child item (submenu) for item by index */ - MenuCtrl* createItemChildAt(size_t _index) { return createItemChildTAt(_index); } - - /** Create child item (submenu) for item */ - MenuCtrl* createItemChild(MenuItem* _item) { return createItemChildAt(getItemIndex(_item)); } - - /** Remove child item (submenu) for item by index */ - void removeItemChildAt(size_t _index); - - /** Remove child item (submenu) for item */ - void removeItemChild(MenuItem* _item) { removeItemChildAt(getItemIndex(_item)); } - - - /** Get item type (see MenuItemType) from item by index */ - MenuItemType getItemTypeAt(size_t _index); - - /** Get item type (see MenuItemType) from item */ - MenuItemType getItemType(MenuItem* _item) { return getItemTypeAt(getItemIndex(_item)); } - - /** Set item type (see MenuItemType) from item by index */ - void setItemTypeAt(size_t _index, MenuItemType _type); - /** Set item type (see MenuItemType) from item */ - void setItemType(MenuItem* _item, MenuItemType _type) { setItemTypeAt(getItemIndex(_item), _type); } - - /** Set mode when clicking on item with submenu generate eventMenuCtrlAccept and closes menu */ - void setPopupAccept(bool _value) { mPopupAccept = _value; } - /** Get mode when clicking on item with submenu generate eventMenuCtrlAccept and closes menu */ - bool getPopupAccept() { return mPopupAccept; } - - /** Get parent menu item or nullptr if no item */ - MenuItem* getMenuItemParent() { return mOwner; } - - - /*event:*/ - /** Event : Enter pressed or mouse clicked.\n - signature : void method(MyGUI::MenuCtrl* _sender, MyGUI::MenuItem* _item)\n - @param _sender widget that called this event - @param _item Selected item - */ - EventHandle_MenuCtrlPtrMenuItemPtr eventMenuCtrlAccept; - - /** Event : Menu was closed by select or focus change.\n - signature : void method(MyGUI::MenuCtrl* _sender)\n - @param _sender widget that called this event - */ - EventHandle_MenuCtrlPtr eventMenuCtrlClose; - - - /*internal:*/ - void _notifyDeleteItem(MenuItem* _item); - void _notifyUpdateName(MenuItem* _item); - void _wrapItemChild(MenuItem* _item, MenuCtrl* _widget); - - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setVisible(bool _value)") - void showMenu() { setVisible(true); } - MYGUI_OBSOLETE("use : void Widget::setVisible(bool _value)") - void hideMenu() { setVisible(false); } - MYGUI_OBSOLETE("use : bool Widget::isVisible()") - bool isShowMenu() { return isVisible(); } - - MYGUI_OBSOLETE("use : void setItemChildVisibleAt(size_t _index, bool _visible)") - void showItemChildAt(size_t _index) { setItemChildVisibleAt(_index, true); } - MYGUI_OBSOLETE("use : void setItemChildVisible(MenuItem* _item, bool _visible)") - void showItemChild(MenuItem* _item) { setItemChildVisible(_item, true); } - MYGUI_OBSOLETE("use : void setItemChildVisibleAt(size_t _index, bool _visible)") - void hideItemChildAt(size_t _index) { setItemChildVisibleAt(_index, false); } - MYGUI_OBSOLETE("use : void setItemChildVisible(MenuItem* _item, bool _visible)") - void hideItemChild(MenuItem* _item) { setItemChildVisible(_item, false); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~MenuCtrl(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - // переопределÑем Ð´Ð»Ñ Ð¾Ñобого обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - virtual void onKeyChangeRootFocus(bool _focus); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void notifyRootKeyChangeFocus(Widget* _sender, bool _focus); - void notifyMouseButtonClick(Widget* _sender); - void notifyMouseSetFocus(Widget* _sender, Widget* _new); - - const std::string& getSkinByType(MenuItemType _type) - { - return _type == MenuItemType::Separator ? mSeparatorSkin : mSkinLine; - } - - size_t getIconIndexByType(MenuItemType _type) - { - return _type == MenuItemType::Popup ? ItemImagePopup : ItemImageNone; - } - - void update(); - - void setButtonImageIndex(Button* _button, size_t _index); - - MenuItemType getItemType(bool _submenu, bool _separator) - { - if (_submenu) return MenuItemType::Popup; - else if (_separator) return MenuItemType::Separator; - return MenuItemType::Normal; - } - - void notifyMenuCtrlAccept(MenuItem* _item); - - Widget* createItemChildByType(size_t _index, const std::string& _type); - - void _wrapItem(MenuItem* _item, size_t _index, const UString& _name, MenuItemType _type, const std::string& _id, Any _data); - - ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); - - Widget* _getClientWidget(); - const Widget* _getClientWidget() const; - - protected: - bool mHideByAccept; - // нужно ли выбраÑывать по нажатию - bool mMenuDropMode; - bool mIsMenuDrop; - bool mHideByLostKey; - - private: - VectorMenuItemInfo mItemsInfo; - - int mHeightLine; - std::string mSkinLine; - - int mSubmenuImageSize; - - std::string mSubMenuSkin; - std::string mSubMenuLayer; - - // флаг, чтобы отÑеч ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ айтемов, при общем шутдауне виджета - bool mShutdown; - - int mSeparatorHeight; - std::string mSeparatorSkin; - - bool mAlignVert; - int mDistanceButton; - bool mPopupAccept; - MenuItem* mOwner; - bool mAnimateSmooth; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_MENU_CTRL_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItem.h deleted file mode 100644 index f91fa496f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItem.h +++ /dev/null @@ -1,131 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MENU_ITEM_H__ -#define __MYGUI_MENU_ITEM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Button.h" -#include "MyGUI_MenuCtrl.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT MenuItem : - public Button - { - MYGUI_RTTI_DERIVED( MenuItem ) - - public: - MenuItem(); - - /** @copydoc Widget::setCaption(const UString& _value) */ - virtual void setCaption(const UString& _value); - - //! Replace an item name - void setItemName(const UString& _value); - //! Get item name - const UString& getItemName(); - - //! Replace an item name - void setItemData(Any _value); - - //! Get item data - template - ValueType* getItemData(bool _throw = true) - { - return mOwner->getItemData(this, _throw); - } - - //! Remove item - void removeItem(); - - //! Replace an item id at a specified position - void setItemId(const std::string& _value); - //! Get item id from specified position - const std::string& getItemId(); - - //! Get item index - size_t getItemIndex(); - - /** Create child item (submenu), MenuItem can have only one child */ - MenuCtrl* createItemChild(); - - /** Create specific type child item (submenu), MenuItem can have only one child */ - template - Type * createItemChildT() - { - return mOwner->createItemChildT(this); - } - - /** Set item type (see MenuItemType) */ - void setItemType(MenuItemType _value); - /** Get item type (see MenuItemType) */ - MenuItemType getItemType(); - - /** Hide or show child item (submenu) */ - void setItemChildVisible(bool _value); - - /** Get parent MenuCtrl */ - MenuCtrl* getMenuCtrlParent() { return mOwner; } - - /** Get child item (submenu) */ - MenuCtrl* getItemChild(); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void setItemChildVisible(bool _visible)") - void showItemChild() { setItemChildVisible(true); } - MYGUI_OBSOLETE("use : void setItemChildVisible(bool _visible)") - void hideItemChild() { setItemChildVisible(false); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~MenuItem(); - - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - virtual void baseChangeWidgetSkin(ResourceSkin* _info); - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - private: - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); - - private: - MenuCtrl* mOwner; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_MENU_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItemType.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItemType.h deleted file mode 100644 index 9a7214a0e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MenuItemType.h +++ /dev/null @@ -1,89 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MENU_ITEM_TYPE_H__ -#define __MYGUI_MENU_ITEM_TYPE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT MenuItemType - { - enum Enum - { - Normal, - Popup, - Separator, - MAX - }; - - static MenuItemType parse(const std::string& _value) - { - MenuItemType type; - int value = 0; - while (true) - { - const char * name = type.getValueName(value); - if (strcmp(name, "") == 0 || name == _value) break; - value++; - } - type.value = MenuItemType::Enum(value); - return type; - } - - MenuItemType(Enum _value = MAX) : value(_value) { } - - friend bool operator == (MenuItemType const& a, MenuItemType const& b) { return a.value == b.value; } - friend bool operator != (MenuItemType const& a, MenuItemType const& b) { return a.value != b.value; } - - friend std::ostream& operator << ( std::ostream& _stream, const MenuItemType& _value ) - { - _stream << _value.getValueName(_value.value); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, MenuItemType& _value ) - { - std::string value; - _stream >> value; - _value = MenuItemType::parse(value); - return _stream; - } - - std::string print() const { return getValueName(value); } - - private: - const char * getValueName(int _index) const - { - static const char * values[MAX + 1] = { "Normal", "Popup", "Separator", "" }; - return values[(_index < MAX && _index >= 0) ? _index : MAX]; - } - - private: - Enum value; - }; - -} // namespace MyGUI - -#endif // __MYGUI_MENU_ITEM_TYPE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Message.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Message.h deleted file mode 100644 index aa1be2ba0..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Message.h +++ /dev/null @@ -1,155 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MESSAGE_H__ -#define __MYGUI_MESSAGE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Window.h" -#include "MyGUI_ResourceImageSet.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_MessageStyle.h" -#include "MyGUI_ControllerFadeAlpha.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_MessagePtrMessageStyle; - - class MYGUI_EXPORT Message : - public Window - { - MYGUI_RTTI_DERIVED( Message ) - - public: - Message(); - - /** Set message text*/ - void setMessageText(const UString& _value); - - /** Create button with specific name*/ - MessageBoxStyle addButtonName(const UString& _name); - - /** Set smooth message showing*/ - void setSmoothShow(bool _value); - - /** Get name of default layer for Message*/ - const std::string& getDefaultLayer() { return mDefaultLayer; } - - /** Set message icon*/ - void setMessageIcon(MessageBoxStyle _value); - /** Set fade under message*/ - void setWindowFade(bool _value); - - void endMessage(MessageBoxStyle _result); - void endMessage(); - - /** Create button using MessageBoxStyle*/ - void setMessageButton(MessageBoxStyle _value); - - /** Set message style (button and icon)*/ - void setMessageStyle(MessageBoxStyle _value); - - void setMessageModal(bool _value); - - /** Static method for creating message with one command - @param - _modal if true all other GUI elements will be blocked untill message is closed - @param - _style any combination of flags from ViewValueInfo - @param - _button1 ... _button4 specific buttons names - */ - static MyGUI::Message* createMessageBox( - const std::string& _skin, - const UString& _caption, - const UString& _message, - MessageBoxStyle _style = MessageBoxStyle::Ok | MessageBoxStyle::IconDefault, - const std::string& _layer = "", - bool _modal = true, - const std::string& _button1 = "", - const std::string& _button2 = "", - const std::string& _button3 = "", - const std::string& _button4 = ""); - - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : button on message window pressed.\n - signature : void method(MyGUI::Message* _sender, MyGUI::MessageBoxStyle _result)\n - @param _sender widget that called this event - @param _result - id of pressed button - */ - EventHandle_MessagePtrMessageStyle eventMessageBoxResult; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~Message(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - void updateSize(); - void notifyButtonClick(MyGUI::Widget* _sender); - void clearButton(); - - void onKeyButtonPressed(KeyCode _key, Char _char); - void _destroyMessage(MessageBoxStyle _result); - - UString getButtonName(MessageBoxStyle _style); - const char * getIconName(size_t _index); - const char * getButtonName(size_t _index); - const char * getButtonTag(size_t _index); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); - - private: - IntSize mOffsetText; - Widget* mWidgetText; - - std::string mButtonSkin, mButtonType; - IntSize mButtonSize, mButtonOffset; - - VectorWidgetPtr mVectorButton; - MessageBoxStyle mInfoOk; - MessageBoxStyle mInfoCancel; - bool mSmoothShow; - - std::string mDefaultLayer, mDefaultCaption; - std::string mFadeSkin, mFadeLayer; - Widget* mWidgetFade; - StaticImage* mIcon; - int mLeftOffset1; - int mLeftOffset2; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_MESSAGE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MessageStyle.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MessageStyle.h deleted file mode 100644 index 85171feee..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MessageStyle.h +++ /dev/null @@ -1,224 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 08/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MESSAGE_BOX_STYLE_H__ -#define __MYGUI_MESSAGE_BOX_STYLE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - - struct MYGUI_EXPORT MessageBoxStyle - { - - enum Enum - { - None = MYGUI_FLAG_NONE, - Ok = MYGUI_FLAG(0), - Yes = MYGUI_FLAG(1), - No = MYGUI_FLAG(2), - Abort = MYGUI_FLAG(3), - Retry = MYGUI_FLAG(4), - Ignore = MYGUI_FLAG(5), - Cancel = MYGUI_FLAG(6), - Try = MYGUI_FLAG(7), - Continue = MYGUI_FLAG(8), - - _IndexUserButton1 = 9, // èíäåêñ ïåðâîé êíîïêè þçåðà - - Button1 = MYGUI_FLAG(_IndexUserButton1), - Button2 = MYGUI_FLAG(_IndexUserButton1 + 1), - Button3 = MYGUI_FLAG(_IndexUserButton1 + 2), - Button4 = MYGUI_FLAG(_IndexUserButton1 + 3), - - _CountUserButtons = 4, // êîëëè÷åñòâî êíîïîê þçåðà - _IndexIcon1 = _IndexUserButton1 + _CountUserButtons, // èíäåêñ ïåðâîé èêîíêè - - IconDefault = MYGUI_FLAG(_IndexIcon1), - - IconInfo = MYGUI_FLAG(_IndexIcon1), - IconQuest = MYGUI_FLAG(_IndexIcon1 + 1), - IconError = MYGUI_FLAG(_IndexIcon1 + 2), - IconWarning = MYGUI_FLAG(_IndexIcon1 + 3), - - Icon1 = MYGUI_FLAG(_IndexIcon1), - Icon2 = MYGUI_FLAG(_IndexIcon1 + 1), - Icon3 = MYGUI_FLAG(_IndexIcon1 + 2), - Icon4 = MYGUI_FLAG(_IndexIcon1 + 3), - Icon5 = MYGUI_FLAG(_IndexIcon1 + 4), - Icon6 = MYGUI_FLAG(_IndexIcon1 + 5), - Icon7 = MYGUI_FLAG(_IndexIcon1 + 6), - Icon8 = MYGUI_FLAG(_IndexIcon1 + 7) - }; - - MessageBoxStyle(Enum _value = None) : value(_value) { } - - MessageBoxStyle& operator |= (MessageBoxStyle const& _other) { value = Enum(int(value) | int(_other.value)); return *this; } - friend MessageBoxStyle operator | (Enum const& a, Enum const& b) { return MessageBoxStyle(Enum(int(a) | int(b))); } - MessageBoxStyle operator | (Enum const& a) { return MessageBoxStyle(Enum(int(value) | int(a))); } - - friend bool operator == (MessageBoxStyle const& a, MessageBoxStyle const& b) { return a.value == b.value; } - friend bool operator != (MessageBoxStyle const& a, MessageBoxStyle const& b) { return a.value != b.value; } - - friend std::ostream& operator << ( std::ostream& _stream, const MessageBoxStyle& _value ) - { - //_stream << _value.print(); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, MessageBoxStyle& _value ) - { - std::string value; - _stream >> value; - _value = MessageBoxStyle::parse(value); - return _stream; - } - - // âîçâðàùàåò èíäåêñ èêîíêè - size_t getIconIndex() - { - size_t index = 0; - int num = value >> _IndexIcon1; - - while (num != 0) - { - if ((num & 1) == 1) return index; - - ++index; - num >>= 1; - } - - return ITEM_NONE; - } - - // âîçâðàùàåò èíäåêñ èêîíêè - size_t getButtonIndex() - { - size_t index = 0; - int num = value; - - while (num != 0) - { - if ((num & 1) == 1) return index; - - ++index; - num >>= 1; - } - - return ITEM_NONE; - } - - // âîçâðàùàåò ñïèñîê êíîïîê - std::vector getButtons() - { - std::vector buttons; - - size_t index = 0; - int num = value; - while (index < _IndexIcon1) - { - if ((num & 1) == 1) - { - buttons.push_back( MessageBoxStyle::Enum( MYGUI_FLAG(index) ) ); - } - - ++index; - num >>= 1; - } - - return buttons; - } - - typedef std::map MapAlign; - - static MessageBoxStyle parse(const std::string& _value) - { - MessageBoxStyle result(MessageBoxStyle::Enum(0)); - const MapAlign& map_names = result.getValueNames(); - const std::vector& vec = utility::split(_value); - for (size_t pos=0; possecond)); - } - else - { - MYGUI_LOG(Warning, "Cannot parse type '" << vec[pos] << "'"); - } - } - return result; - } - - private: - const MapAlign& getValueNames() - { - static MapAlign map_names; - - if (map_names.empty()) - { - MYGUI_REGISTER_VALUE(map_names, None); - MYGUI_REGISTER_VALUE(map_names, Ok); - MYGUI_REGISTER_VALUE(map_names, Yes); - MYGUI_REGISTER_VALUE(map_names, No); - MYGUI_REGISTER_VALUE(map_names, Abort); - MYGUI_REGISTER_VALUE(map_names, Retry); - MYGUI_REGISTER_VALUE(map_names, Ignore); - MYGUI_REGISTER_VALUE(map_names, Cancel); - MYGUI_REGISTER_VALUE(map_names, Try); - MYGUI_REGISTER_VALUE(map_names, Continue); - - MYGUI_REGISTER_VALUE(map_names, Button1); - MYGUI_REGISTER_VALUE(map_names, Button2); - MYGUI_REGISTER_VALUE(map_names, Button3); - MYGUI_REGISTER_VALUE(map_names, Button4); - - MYGUI_REGISTER_VALUE(map_names, IconDefault); - - MYGUI_REGISTER_VALUE(map_names, IconInfo); - MYGUI_REGISTER_VALUE(map_names, IconQuest); - MYGUI_REGISTER_VALUE(map_names, IconError); - MYGUI_REGISTER_VALUE(map_names, IconWarning); - - MYGUI_REGISTER_VALUE(map_names, Icon1); - MYGUI_REGISTER_VALUE(map_names, Icon2); - MYGUI_REGISTER_VALUE(map_names, Icon3); - MYGUI_REGISTER_VALUE(map_names, Icon4); - MYGUI_REGISTER_VALUE(map_names, Icon5); - MYGUI_REGISTER_VALUE(map_names, Icon6); - MYGUI_REGISTER_VALUE(map_names, Icon7); - MYGUI_REGISTER_VALUE(map_names, Icon8); - } - - return map_names; - } - - private: - Enum value; - }; - -} // namespace MyGUI - -#endif // __MYGUI_MESSAGE_BOX_STYLE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MultiList.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MultiList.h deleted file mode 100644 index 9f4cc81b6..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_MultiList.h +++ /dev/null @@ -1,385 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_MULTI_LIST_H__ -#define __MYGUI_MULTI_LIST_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_List.h" -#include "MyGUI_Any.h" -#include "MyGUI_BiIndexBase.h" -#include "MyGUI_EventPair.h" - -namespace MyGUI -{ - - //OBSOLETE - typedef delegates::CDelegate5 EventHandle_WidgetIntUTFStringUTFStringBool; - - typedef delegates::CDelegate5 EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef; - typedef delegates::CDelegate2 EventHandle_MultiListPtrSizeT; - - class MYGUI_EXPORT MultiList : - public Widget, - public BiIndexBase - { - MYGUI_RTTI_DERIVED( MultiList ) - - public: - MultiList(); - - //------------------------------------------------------------------------------// - // Methods for work with columns (RU:методы Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñо Ñтолбцами) - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of columns - size_t getColumnCount() { return mVectorColumnInfo.size(); } - - /** Insert new column - @param _column New column will be inserted before _column - @param _name Name of new column - @param _width Width of new column - */ - void insertColumnAt(size_t _column, const UString& _name, int _width, Any _data = Any::Null); - - /** Add new column at last position - @param _width Width of new column - @param _name Name of new column - */ - void addColumn(const UString& _name, int _width, Any _data = Any::Null) { insertColumnAt(ITEM_NONE, _name, _width, _data); } - - /** Delete column */ - void removeColumnAt(size_t _column); - - /** Delete all columns */ - void removeAllColumns(); - - - //------------------------------------------------------------------------------// - // манипулÑции отображением - - /** Set column name - @param _column Index of column - @param _name New name of column - */ - void setColumnNameAt(size_t _column, const UString& _name); - - /** Set column width - @param _column Index of column - @param _name New width of column - */ - void setColumnWidthAt(size_t _column, int _width); - - /** Get _column name */ - const UString& getColumnNameAt(size_t _column); - - /** Get _column width */ - int getColumnWidthAt(size_t _column); - - /** Sort multilist by column */ - void sortByColumn(size_t _column, bool _backward = false); - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setColumnDataAt(size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearColumnDataAt(size_t _index) { setColumnDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getColumnDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::getItemDataAt"); - return mVectorColumnInfo[_index].data.castType(_throw); - } - - //------------------------------------------------------------------------------// - // Methods for work with lines (RU:методы Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñо Ñтроками) - /** @note - All indexes used here is indexes of unsorted Multilist. Even if you sorted - it - all items indexes will be same as before sort. - */ - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - /** Get number of items (lines) */ - size_t getItemCount() const; - - /** Insert new item before _index line */ - void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); - - /** Add new item at the end */ - void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - - /** Delete all items */ - void removeAllItems(); - - //! Swap items at a specified positions - void swapItemsAt(size_t _index1, size_t _index2); - - - //------------------------------------------------------------------------------// - // манипулÑции отображением - - //! Replace an item name - void setItemNameAt(size_t _index, const UString& _name) { setSubItemNameAt(0, _index, _name); } - - //! Get item name from specified position - const UString& getItemNameAt(size_t _index) { return getSubItemNameAt(0, _index); } - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - /** Get index of selected item (ITEM_NONE if none selected) */ - size_t getIndexSelected() { return mItemSelected; } - - /** Select specified _index */ - void setIndexSelected(size_t _index); - - /** Clear item selection */ - void clearIndexSelected() { setIndexSelected(ITEM_NONE); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data) { setSubItemDataAt(0, _index, _data); } - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - return getSubItemDataAt(0, _index, _throw); - } - - - //------------------------------------------------------------------------------// - // Methods for work with sub lines (RU:методы Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñо Ñаб Ñтроками) - //------------------------------------------------------------------------------// - // манипулÑции данными - - /** Set sub item - @param _column Index of column - @param _index Index of line - @param _name New sub item value - */ - void setSubItemNameAt(size_t _column, size_t _index, const UString& _name); - - /** Get sub item name*/ - const UString& getSubItemNameAt(size_t _column, size_t _index); - - /** Search item in specified _column, returns index of the first occurrence in column or ITEM_NONE if item not found */ - size_t findSubItemWith(size_t _column, const UString& _name); - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setSubItemDataAt(size_t _column, size_t _index, Any _data); - - //! Clear an item data at a specified position - void clearSubItemDataAt(size_t _column, size_t _index) { setSubItemDataAt(_column, _index, Any::Null); } - - //! Get item data from specified position - template - ValueType * getSubItemDataAt(size_t _column, size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemDataAt"); - MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemDataAt"); - - size_t index = BiIndexBase::convertToBack(_index); - return mVectorColumnInfo[_column].list->getItemDataAt(index, _throw); - } - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*event:*/ - /** Event : Enter pressed or double click.\n - signature : void method(MyGUI::MultiList* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of selected item - */ - EventPair eventListSelectAccept; - - /** Event : Selected item position changed.\n - signature : void method(MyGUI::MultiList* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index of new item - */ - EventPair eventListChangePosition; - - /** Event : Less than operator for sort multilist by columns.\n - signature : void method(MyGUI::MultiList* _sender, size_t _column, const UString& _firstItem, const UString& _secondItem, bool& _less)\n - @param _sender widget that called this event - @param _column Index of column - @param _firstItem Strings for compare - @param _secondItem Strings for compare - @param _less Comparsion result (write your value here) - */ - EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef requestOperatorLess; - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()") - size_t getItemIndexSelected() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)") - void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()") - void clearItemSelected() { clearIndexSelected(); } - - MYGUI_OBSOLETE("use : size_t MultiList::findSubItemWith(size_t _column, const UString& _name)") - size_t findItem(size_t _column, const UString& _name) { return findSubItemWith(_column, _name); } - MYGUI_OBSOLETE("use : const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)") - const UString& getSubItem(size_t _column, size_t _index) { return getSubItemNameAt(_column, _index); } - MYGUI_OBSOLETE("use : void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)") - void setSubItem(size_t _column, size_t _index, const UString& _name) { setSubItemNameAt(_column, _index, _name); } - MYGUI_OBSOLETE("use : void MultiList::removeColumnAt(size_t _column)") - void deleteColumn(size_t _column) { removeColumnAt(_column); } - MYGUI_OBSOLETE("use : void MultiList::removeAllColumns()") - void deleteAllColumns() { removeAllColumns(); } - MYGUI_OBSOLETE("use : int MultiList::getColumnWidthAt(size_t _column)") - int getColumnWidth(size_t _column) { return getColumnWidthAt(_column); } - MYGUI_OBSOLETE("use : const UString& MultiList::getColumnNameAt(size_t _column)") - const UString& getColumnName(size_t _column) { return getColumnNameAt(_column); } - MYGUI_OBSOLETE("use : void MultiList::setColumnWidthAt(size_t _column, int _width)") - void setColumnWidth(size_t _column, int _width) { setColumnWidthAt(_column, _width); } - MYGUI_OBSOLETE("use : void MultiList::addColumn(const UString& _name, int _width, Any _data)") - void addColumn(int _width, const UString& _name) { addColumn(_name, _width); } - MYGUI_OBSOLETE("use : void MultiList::setColumnNameAt(size_t _column, const UString& _name)") - void setColumnName(size_t _column, const UString& _name) { setColumnNameAt(_column, _name); } - MYGUI_OBSOLETE("use : void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)") - void insertColumn(size_t _column, int _width, const UString& _name) { insertColumnAt(_column, _name, _width); } - MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()") - size_t getItemSelect() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()") - void resetItemSelect() { clearIndexSelected(); } - MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)") - void setItemSelect(size_t _index) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)") - void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); } - MYGUI_OBSOLETE("use : void MultiList::setItemNameAt(size_t _index, const UString& _name)") - void setItem(size_t _index, const UString& _name) { setItemNameAt(_index, _name); } - MYGUI_OBSOLETE("use : const UString& MultiList::getItemNameAt(size_t _index)") - const UString& getItem(size_t _index) { return getItemNameAt(_index); } - MYGUI_OBSOLETE("use : void MultiList::removeItemAt(size_t _index)") - void deleteItem(size_t _index) { removeItemAt(_index); } - MYGUI_OBSOLETE("use : void MultiList::removeAllItems()") - void deleteAllItems() { removeAllItems(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~MultiList(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - void notifyListChangePosition(List* _sender, size_t _position); - void notifyListChangeFocus(List* _sender, size_t _position); - void notifyListChangeScrollPosition(List* _sender, size_t _position); - void notifyButtonClick(Widget* _sender); - void notifyListSelectAccept(List* _sender, size_t _position); - - void updateColumns(); - void redrawButtons(); - void updateOnlyEmpty(); - - bool compare(List* _list, size_t _left, size_t _right); - void sortList(); - void flipList(); - - Widget* getSeparator(size_t _index); - - void setButtonImageIndex(Button* _button, size_t _index); - - void updateBackSelected(size_t _index); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void frameEntered(float _frame); - - void frameAdvise(bool _advise); - - private: - struct ColumnInfo - { - List* list; - Button* button; - int width; - UString name; - Any data; - }; - - typedef std::vector VectorColumnInfo; - - enum ImageSort - { - SORT_NONE, - SORT_UP, - SORT_DOWN - }; - - private: - int mHeightButton; - int mWidthBar; - std::string mSkinButton, mSkinList; - Button* mButtonMain; - - VectorColumnInfo mVectorColumnInfo; - - VectorWidgetPtr mSeparators; - - size_t mLastMouseFocusIndex; - - bool mSortUp; - size_t mSortColumnIndex; - - int mWidthSeparator; - std::string mSkinSeparator; - int mOffsetButtonSeparator; - - size_t mItemSelected; - - bool mFrameAdvise; - Widget* mClient; - }; - -} // namespace MyGUI - -#endif // __MYGUI_MULTI_LIST_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_OverlappedLayer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_OverlappedLayer.h deleted file mode 100644 index bf5e58030..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_OverlappedLayer.h +++ /dev/null @@ -1,74 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_OVERLAPPED_LAYER_H__ -#define __MYGUI_OVERLAPPED_LAYER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_ILayer.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT OverlappedLayer : - public ILayer - { - MYGUI_RTTI_DERIVED( OverlappedLayer ) - - public: - OverlappedLayer(); - virtual ~OverlappedLayer(); - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - // ñîçäàåì äî÷åðíèé íîä - virtual ILayerNode* createChildItemNode(); - // óäàëÿåì äî÷åðíèé íîä - virtual void destroyChildItemNode(ILayerNode* _node); - - // ïîäíèìàåì äî÷åðíèé íîä - virtual void upChildItemNode(ILayerNode* _node); - - // ñïèñîê äåòåé - virtual EnumeratorILayerNode getEnumerator(); - - // âîçâðàùàåò âèäæåò ïî ïîçèöèè - virtual ILayerItem* getLayerItemByPoint(int _left, int _top); - - virtual IntPoint getPosition(int _left, int _top) const; - - virtual const IntSize& getSize() const; - - // ðèñóåò ëååð - virtual void renderToTarget(IRenderTarget* _target, bool _update); - - virtual void dumpStatisticToLog(); - - protected: - bool mIsPick; - VectorILayerNode mChildItems; - }; - -} // namespace MyGUI - -#endif // __MYGUI_OVERLAPPED_LAYER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Platform.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Platform.h deleted file mode 100644 index 9f8b59b93..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Platform.h +++ /dev/null @@ -1,151 +0,0 @@ -/*! - @file - @author Denis Koronchik - @author Georgiy Evmenov - @author Albert Semenov - @date 09/2007 -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -#ifndef __MYGUI_PLATFORM_H__ -#define __MYGUI_PLATFORM_H__ - -// Definnition of platforms -#define MYGUI_PLATFORM_WIN32 1 -#define MYGUI_PLATFORM_LINUX 2 -#define MYGUI_PLATFORM_APPLE 3 - -// Definition of compilers -#define MYGUI_COMPILER_MSVC 1 -#define MYGUI_COMPILER_GNUC 2 - - -// Find platform -#if defined (__WIN32__) || defined (_WIN32) -# define MYGUI_PLATFORM MYGUI_PLATFORM_WIN32 -#elif defined (__APPLE_CC__) -# define MYGUI_PLATFORM MYGUI_PLATFORM_APPLE -#else -# define MYGUI_PLATFORM MYGUI_PLATFORM_LINUX -#endif - -// Find compiler -#if defined( _MSC_VER ) -# define MYGUI_COMPILER MYGUI_COMPILER_MSVC -# define MYGUI_COMP_VER _MSC_VER - -#elif defined( __GNUC__ ) -# define MYGUI_COMPILER MYGUI_COMPILER_GNUC -# define MYGUI_COMP_VER (((__GNUC__)*100) + \ - (__GNUC_MINOR__*10) + \ - __GNUC_PATCHLEVEL__) -#else -# pragma error "Unknown compiler! Stop building!!!" -#endif - -// See if we can use __forceinline or if we need to use __inline instead -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC -# if MYGUI_COMP_VER >= 1200 -# define MYGUI_FORCEINLINE __forceinline -# endif -#elif defined(__MINGW32__) -# if !defined(MYGUI_FORCEINLINE) -# define MYGUI_FORCEINLINE __inline -# endif -#else -# define MYGUI_FORCEINLINE __inline -#endif - - -// Windows settings -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 -# -# if defined( MYGUI_STATIC ) -# define MYGUI_EXPORT -# elif defined( MYGUI_BUILD ) -# define MYGUI_EXPORT __declspec( dllexport ) -# else -# if defined( __MINGW32__ ) -# define MYGUI_EXPORT -# else -# define MYGUI_EXPORT __declspec( dllimport ) -# endif -# endif -# -# if defined( MYGUI_STATIC ) -# define MYGUI_EXPORT_DLL -# elif defined( MYGUI_BUILD_DLL ) -# define MYGUI_EXPORT_DLL __declspec( dllexport ) -# else -# if defined( __MINGW32__ ) -# define MYGUI_EXPORT_DLL -# else -# define MYGUI_EXPORT_DLL __declspec( dllimport ) -# endif -# endif -# -#// Win32 compilers use _DEBUG for specifying debug builds. -# ifdef _DEBUG -# define MYGUI_DEBUG_MODE 1 -# else -# define MYGUI_DEBUG_MODE 0 -# endif -#endif - - -// Linux/Apple Settings -#if MYGUI_PLATFORM == MYGUI_PLATFORM_LINUX || MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE -# -// Add -fvisibility=hidden to compiler options. With -fvisibility=hidden, you are telling -// GCC that every declaration not explicitly marked with a visibility attribute (MYGUI_EXPORT) -// has a hidden visibility (like in windows). -# if __GNUC__ >= 4 -# define MYGUI_EXPORT __attribute__ ((visibility("default"))) -# else -# define MYGUI_EXPORT -# endif -# -# if __GNUC__ >= 4 -# define MYGUI_EXPORT_DLL __attribute__ ((visibility("default"))) -# else -# define MYGUI_EXPORT_DLL -# endif -# -// A quick define to overcome different names for the same function -# define stricmp strcasecmp -# -// Unlike the Win32 compilers, Linux compilers seem to use DEBUG for when -// specifying a debug build. -// (??? this is wrong, on Linux debug builds aren't marked in any way unless -// you mark it yourself any way you like it -- zap ???) -# ifdef DEBUG -# define MYGUI_DEBUG_MODE 1 -# else -# define MYGUI_DEBUG_MODE 0 -# endif - -# if MYGUI_PLATFORM == MYGUI_PLATFORM_APPLE -# define MYGUI_PLATFORM_LIB "MYGUIPlatform.bundle" -# else // if MYGUI_PLATFORM_LINUX -# define MYGUI_PLATFORM_LIB "libMYGUIPlatform.so" -# endif - -#endif - - -#endif // __MYGUI_PLATFORM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Plugin.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Plugin.h deleted file mode 100644 index b06681c7e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Plugin.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - @file - @author Denis Koronchik - @date 09/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_PLUGIN_H__ -#define __MYGUI_PLUGIN_H__ - -#include "MyGUI_Prerequest.h" -#include - -namespace MyGUI -{ - - /*! \brief Base plugin class - */ - class MYGUI_EXPORT IPlugin - { - public: - IPlugin() { } - - virtual ~IPlugin() { } - - /*! Get the name of the plugin. - @remarks An implementation must be supplied for this method to uniquely - identify the plugin - */ - virtual const std::string& getName() const = 0; - - /*! Perform the plugin initial installation sequence - */ - virtual void install() = 0; - - /*! Perform any tasks the plugin needs to perform on full system - initialisation. - */ - virtual void initialize() = 0; - - /*! Perform any tasks the plugin needs to perform when the system is shut down - */ - virtual void shutdown() = 0; - - /*! Perform the final plugin uninstallation sequence - */ - virtual void uninstall() = 0; - }; - -} - -#endif // __MYGUI_PLUGIN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PluginManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PluginManager.h deleted file mode 100644 index 61df0029d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PluginManager.h +++ /dev/null @@ -1,91 +0,0 @@ -/*! - @file - @author Denis Koronchik - @date 09/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_PLUGIN_MANAGER_H__ -#define __MYGUI_PLUGIN_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Plugin.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Version.h" -#include - -namespace MyGUI -{ - - /*! \brief Plugin manager. Load/unload and register plugins. - */ - class MYGUI_EXPORT PluginManager - { - MYGUI_INSTANCE_HEADER( PluginManager ) - - public: - typedef void (*DLL_START_PLUGIN)(void); - typedef void (*DLL_STOP_PLUGIN)(void); - - public: - void initialise(); - void shutdown(); - - public: - //! Load plugin - bool loadPlugin(const std::string& _file); - - //! Unload plugin - void unloadPlugin(const std::string& _file); - - /** Load additional MyGUI *_plugin.xml file */ - bool load(const std::string& _file); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - /*! Install plugin - @remarks Calls from plugin - */ - void installPlugin(IPlugin* _plugin); - - /*! Uninstall plugin - @remarks Calls from plugin - */ - void uninstallPlugin(IPlugin* _plugin); - - //! Unload all plugins - void unloadAllPlugins(); - - private: - //! List of dynamic libraries - typedef std::map DynLibList; - - //! List of plugins - typedef std::set PluginList; - - //! Loaded libraries - DynLibList mLibs; - - //! Installed plugins - PluginList mPlugins; - - }; - -} - -#endif // __MYGUI_PLUGIN_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PointerManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PointerManager.h deleted file mode 100644 index fa0306259..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PointerManager.h +++ /dev/null @@ -1,131 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_POINTER_MANAGER_H__ -#define __MYGUI_POINTER_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_IWidgetCreator.h" -#include "MyGUI_StaticImage.h" -#include "MyGUI_IPointer.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT PointerManager : - public IUnlinkWidget, - public IWidgetCreator - { - MYGUI_INSTANCE_HEADER( PointerManager ) - - public: - void initialise(); - void shutdown(); - - public: - /** Load additional MyGUI *_pointer.xml file */ - bool load(const std::string& _file); - - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - /** Show or hide mouse pointer */ - void setVisible(bool _visible); - /** Is mouse pointer visible */ - bool isVisible() const { return mVisible; } - - /** Set pointer that will be shown - @param _name of pointer - */ - void setPointer(const std::string& _name); - /** Reset to default pointer */ - void resetToDefaultPointer(); - - /** Get default pointer */ - const std::string& getDefaultPointer() { return mDefaultName; } - /** Set default pointer */ - void setDeafultPointer(const std::string& _value); - - const std::string& getLayerName() { return mLayerName; } - void setLayerName(const std::string& _value); - - /** Get pointer resource */ - IPointer* getByName(const std::string& _name) const; - - /*event:*/ - /** Event : Mouse pointer has been changed.\n - signature : void method(const std::string& _pointerName)\n - @param _pointerName Name of current mouse pointer - */ - delegates::CMultiDelegate1 - eventChangeMousePointer; - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void PointerManager::setVisible(bool _visible)") - void show() { setVisible(true); } - MYGUI_OBSOLETE("use : void PointerManager::setVisible(bool _visible)") - void hide() { setVisible(false); } - MYGUI_OBSOLETE("use : bool PointerManager::isVisible()") - bool isShow() { return isVisible(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - void _unlinkWidget(Widget* _widget); - - // Ñоздает виджет - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - // удÑлÑет неудачника - virtual void _destroyChildWidget(Widget* _widget); - - // удалÑет вÑех детей - virtual void _destroyAllChildWidget(); - - void Update(); - - void notifyFrameStart(float _time); - void notifyChangeMouseFocus(Widget* _widget); - void setPointer(const std::string& _name, Widget* _owner); - - private: - // вектор вÑех детей виджетов - VectorWidgetPtr mWidgetChild; - - std::string mDefaultName; - IntPoint mPoint; - bool mVisible; - std::string mLayerName; - std::string mSkinName; - - Widget* mWidgetOwner; - StaticImage* mMousePointer; - IPointer* mPointer; - std::string mCurrentMousePointer; - }; - -} // namespace MyGUI - -#endif // __MYGUI_POINTER_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PopupMenu.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PopupMenu.h deleted file mode 100644 index 441f13bc1..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_PopupMenu.h +++ /dev/null @@ -1,56 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_POPUP_MENU_H__ -#define __MYGUI_POPUP_MENU_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_MenuCtrl.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT PopupMenu : - public MenuCtrl - { - MYGUI_RTTI_DERIVED( PopupMenu ) - - public: - PopupMenu(); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~PopupMenu(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_POPUP_MENU_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Precompiled.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Precompiled.h deleted file mode 100644 index d9c2b8bf1..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Precompiled.h +++ /dev/null @@ -1,49 +0,0 @@ -/*! - @file - @author Alexander Ptakhin - @date 01/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_PRECOMPILED_H__ -#define __MYGUI_PRECOMPILED_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Common.h" -#include "MyGUI_Macros.h" -#include "MyGUI_Guid.h" -#include "MyGUI_LogManager.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Types.h" -#include "MyGUI_Any.h" -#include "MyGUI_IResource.h" -#include "MyGUI_Utility.h" -#include "MyGUI_InputDefine.h" -#include "MyGUI_Version.h" -#include "MyGUI_RenderOut.h" -#include "MyGUI_WidgetStyle.h" -#include "MyGUI_ActionController.h" -#include "MyGUI_ControllerFadeAlpha.h" -#include "MyGUI_ControllerPosition.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_CastWidget.h" -#include "MyGUI_IObject.h" -#include "MyGUI_ISerializable.h" -#include "MyGUI_GenericFactory.h" - -#endif // __MYGUI_PRECOMPILED_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Prerequest.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Prerequest.h deleted file mode 100644 index d0db4e814..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Prerequest.h +++ /dev/null @@ -1,192 +0,0 @@ -/*! - @file - @author Denis Koronchik - @author Georgiy Evmenov - @author Ðу и Ñ Ñ‡ÑƒÑ‚ÑŒ чуть =) - @date 09/2007 -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -#ifndef __MYGUI_PREREQUEST_H__ -#define __MYGUI_PREREQUEST_H__ - -#include "MyGUI_Platform.h" - -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC -# ifndef _CRT_SECURE_NO_WARNINGS -# define _CRT_SECURE_NO_WARNINGS -# endif -#endif - -#define MYGUI_DEFINE_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | patch) - -#ifndef MYGUI_DONT_REPLACE_NULLPTR - #if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - #ifndef _MANAGED - #define nullptr 0 - #endif - #else - #define nullptr 0 - #endif -#endif - -namespace MyGUI -{ - - class Gui; - class IWidgetCreator; - - // managers - class LogManager; - class InputManager; - class SubWidgetManager; - class LayerManager; - class SkinManager; - class WidgetManager; - class FontManager; - class ControllerManager; - class PointerManager; - class ClipboardManager; - class LayoutManager; - class PluginManager; - class DynLibManager; - class LanguageManager; - class ResourceManager; - class RenderManager; - class FactoryManager; - class TextureManager; - - class IWidgetFactory; - - class DynLib; - - namespace factory - { - template - class BaseWidgetFactory; - } - - class Widget; - class Button; - class Window; - class List; - class HScroll; - class VScroll; - class Edit; - class ComboBox; - class StaticText; - class Tab; - class TabItem; - class Progress; - class ItemBox; - class MultiList; - class StaticImage; - class Message; - class MenuCtrl; - class MenuItem; - class PopupMenu; - class MenuBar; - class ScrollView; - class DDContainer; - class Canvas; - class ListCtrl; - class ListBox; - - typedef Widget* WidgetPtr; - typedef Button* ButtonPtr; - typedef Window* WindowPtr; - typedef List* ListPtr; - typedef HScroll* HScrollPtr; - typedef VScroll* VScrollPtr; - typedef Edit* EditPtr; - typedef ComboBox* ComboBoxPtr; - typedef StaticText* StaticTextPtr; - typedef Tab* TabPtr; - typedef TabItem* TabItemPtr; - typedef Progress* ProgressPtr; - typedef ItemBox* ItemBoxPtr; - typedef MultiList* MultiListPtr; - typedef StaticImage* StaticImagePtr; - typedef Message* MessagePtr; - typedef MenuCtrl* MenuCtrlPtr; - typedef MenuItem* MenuItemPtr; - typedef PopupMenu* PopupMenuPtr; - typedef MenuBar* MenuBarPtr; - typedef ScrollView* ScrollViewPtr; - typedef DDContainer* DDContainerPtr; - typedef Canvas* CanvasPtr; - typedef ListCtrl* ListCtrlPtr; - typedef ListBox* ListBoxPtr; - -#ifndef MYGUI_DONT_USE_OBSOLETE - - typedef TabItem Sheet; - typedef TabItem* SheetPtr; - typedef Canvas RenderBox; - typedef Canvas* RenderBoxPtr; - -#endif // MYGUI_DONT_USE_OBSOLETE - - // Define version - #define MYGUI_VERSION_MAJOR 3 - #define MYGUI_VERSION_MINOR 0 - #define MYGUI_VERSION_PATCH 1 - - #define MYGUI_VERSION MYGUI_DEFINE_VERSION(MYGUI_VERSION_MAJOR, MYGUI_VERSION_MINOR, MYGUI_VERSION_PATCH) - - // Disable warnings for MSVC compiler -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - -// Turn off warnings generated by long std templates -// This warns about truncation to 255 characters in debug/browse info -# pragma warning (disable : 4786) - -// Turn off warnings generated by long std templates -// This warns about truncation to 255 characters in debug/browse info -# pragma warning (disable : 4503) - -// disable: "conversion from 'double' to 'float', possible loss of data -# pragma warning (disable : 4244) - -// disable: "truncation from 'double' to 'float' -# pragma warning (disable : 4305) - -// disable: " needs to have dll-interface to be used by clients' -// Happens on STL member variables which are not public therefore is ok -# pragma warning (disable : 4251) - -// disable: "non dll-interface class used as base for dll-interface class" -// Happens when deriving from Singleton because bug in compiler ignores -// template export -# pragma warning (disable : 4275) - -// disable: "C++ Exception Specification ignored" -// This is because MSVC 6 did not implement all the C++ exception -// specifications in the ANSI C++ draft. -# pragma warning( disable : 4290 ) - -// disable: "no suitable definition provided for explicit template -// instantiation request" Occurs in VC7 for no justifiable reason on all -// #includes of Singleton -# pragma warning( disable: 4661) - -#endif - -} // namespace MyGUI - -#endif // __MYGUI_PREREQUEST_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Progress.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Progress.h deleted file mode 100644 index 0f16807ca..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Progress.h +++ /dev/null @@ -1,131 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_PROGRESS_H__ -#define __MYGUI_PROGRESS_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Align.h" -#include "MyGUI_Widget.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT Progress : - public Widget - { - MYGUI_RTTI_DERIVED( Progress ) - - public: - Progress(); - - /** Set progress range */ - void setProgressRange(size_t _value); - /** Get progress range */ - size_t getProgressRange() { return mRange; } - - /** Set progress position */ - void setProgressPosition(size_t _value); - /** Get progress position */ - size_t getProgressPosition() { return mEndPosition; } - - /** Enable or disable progress auto tracking */ - void setProgressAutoTrack(bool _value); - /** Get progress auto tracking flag */ - bool getProgressAutoTrack() { return mAutoTrack; } - - /** Set progress start point - For example with Align::Top if will be filled from top to bottom. - */ - void setProgressStartPoint(Align _value); - /** Get progress start point */ - Align getProgressStartPoint() { return mStartPoint; } - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~Progress(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void frameEntered(float _time); - void updateTrack(); - - int getClientWidth() { return ((mStartPoint.isLeft()) || (mStartPoint.isRight())) ? mClient->getWidth() : mClient->getHeight(); } - int getClientHeight() { return ((mStartPoint.isLeft()) || (mStartPoint.isRight())) ? mClient->getHeight() : mClient->getWidth(); } - - void setTrackPosition(Widget* _widget, int _left, int _top, int _width, int _height); - - private: - std::string mTrackSkin; - int mTrackWidth; - int mTrackStep; - int mTrackMin; - - VectorWidgetPtr mVectorTrack; - size_t mRange; - size_t mStartPosition, mEndPosition; - float mAutoPosition; - bool mAutoTrack; - bool mFillTrack; - - Align mStartPoint; - - Widget* mClient; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_PROGRESS_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RTTI.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RTTI.h deleted file mode 100644 index a980d0a4e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RTTI.h +++ /dev/null @@ -1,104 +0,0 @@ -/*! - @file - @author Alexander Buryak - Rageous - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RTTI_H__ -#define __MYGUI_RTTI_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Diagnostic.h" -#include -#include - -namespace MyGUI -{ - - //VC++ 7.1 - #if MYGUI_COMPILER == MYGUI_COMPILER_MSVC && MYGUI_COMP_VER == 1310 - #define MYGUI_DECLARE_TYPE_NAME( Type ) \ - private: \ - struct TypeNameHolder { const std::string& getClassTypeName() { static std::string type = #Type; return type; } }; \ - public: \ - static const std::string& getClassTypeName() { TypeNameHolder type; return type.getClassTypeName(); } \ - /** Get type name as string */ \ - virtual const std::string& getTypeName() const { return Type::getClassTypeName(); } - #else - #define MYGUI_DECLARE_TYPE_NAME( Type ) \ - public: \ - static const std::string& getClassTypeName() { static std::string type = #Type; return type; } \ - /** Get type name as string */ \ - virtual const std::string& getTypeName() const { return Type::getClassTypeName(); } - #endif - - #define MYGUI_RTTI_BASE( BaseType ) \ - public: \ - typedef BaseType RTTIBase; \ - MYGUI_DECLARE_TYPE_NAME( BaseType ) \ - /** Compare with selected type */ \ - virtual bool isType( const std::type_info& _type) const { return typeid( BaseType ) == _type; } \ - /** Compare with selected type */ \ - template bool isType() const { return isType( typeid( Type )); } \ - /** Try to cast pointer to selected type. \ - @param _throw If true throw exception when casting in wrong type, else return nullptr \ - */ \ - template Type* castType(bool _throw = true) \ - { \ - if (this->isType()) return static_cast( this ); \ - MYGUI_ASSERT(!_throw, "Error cast type '" << this->getTypeName() << "' to type '" << Type::getClassTypeName() << "' .") \ - return nullptr; \ - } \ - /** Try to cast pointer to selected type. \ - @param _throw If true throw exception when casting in wrong type, else return nullptr \ - */ \ - template const Type* castType(bool _throw = true) const \ - { \ - if (this->isType()) return static_cast( this ); \ - MYGUI_ASSERT(!_throw, "Error cast type '" << this->getTypeName() << "' to type '" << Type::getClassTypeName() << "' .") \ - return nullptr; \ - } - - #define MYGUI_RTTI_DERIVED( DerivedType ) \ - public: \ - MYGUI_DECLARE_TYPE_NAME( DerivedType ) \ - typedef RTTIBase Base; \ - typedef DerivedType RTTIBase; \ - /** Compare with selected type */ \ - virtual bool isType( const std::type_info& _type ) const { return typeid( DerivedType ) == _type || Base::isType( _type ); } \ - /** Compare with selected type */ \ - template bool isType() const { return isType( typeid( DerivedType )); } - - //OBSOLETE - #define MYGUI_RTTI_CHILD_HEADER( DerivedType, BaseType ) \ - public: \ - MYGUI_DECLARE_TYPE_NAME( DerivedType ) \ - typedef BaseType Base; \ - typedef DerivedType RTTIBase; \ - /** Compare with selected type */ \ - virtual bool isType( const std::type_info& _type ) const { return typeid( DerivedType ) == _type || BaseType::isType( _type ); } - - - //OBSOLETE - #define MYGUI_RTTI_BASE_HEADER( BaseType ) MYGUI_RTTI_BASE( BaseType ) - -} // namespace MyGUI - -#endif // __MYGUI_RTTI_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RawRect.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RawRect.h deleted file mode 100644 index 4e2c2e7ba..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RawRect.h +++ /dev/null @@ -1,77 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RAW_RECT_H__ -#define __MYGUI_RAW_RECT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Colour.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Types.h" -#include "MyGUI_ICroppedRectangle.h" -#include "MyGUI_SubSkin.h" -#include "MyGUI_RenderFormat.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT RawRect : public SubSkin - { - MYGUI_RTTI_DERIVED( RawRect ) - - public: - RawRect(); - virtual ~RawRect(); - - virtual void setAlpha(float _alpha); - - void setRectColour(const Colour& _colourLT, const Colour& _colourRT, const Colour& _colourLB, const Colour& _colourRB); - - void setRectTexture(const FloatPoint& _pointLT, const FloatPoint& _pointRT, const FloatPoint& _pointLB, const FloatPoint& _pointRB); - - virtual void setStateData(IStateInfo * _data); - - // метод Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки ÑÐµÐ±Ñ - virtual void doRender(); - - private: - FloatPoint mRectTextureLT; - FloatPoint mRectTextureRT; - FloatPoint mRectTextureLB; - FloatPoint mRectTextureRB; - - Colour mColourLT; - Colour mColourRT; - Colour mColourLB; - Colour mColourRB; - - uint32 mRenderColourLT; - uint32 mRenderColourRT; - uint32 mRenderColourLB; - uint32 mRenderColourRB; - - VertexColourType mVertexFormat; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RAW_RECT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderFormat.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderFormat.h deleted file mode 100644 index 734b9921e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderFormat.h +++ /dev/null @@ -1,100 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RENDER_FORMAT_H__ -#define __MYGUI_RENDER_FORMAT_H__ - -#include "MyGUI_Macros.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT VertexColourType - { - enum Enum - { - ColourARGB, // D3D style compact colour - ColourABGR, // GL style compact colour - MAX - }; - - VertexColourType(Enum _value = MAX) : value(_value) { } - - friend bool operator == (VertexColourType const& a, VertexColourType const& b) { return a.value == b.value; } - friend bool operator != (VertexColourType const& a, VertexColourType const& b) { return a.value != b.value; } - - private: - Enum value; - }; - - struct MYGUI_EXPORT PixelFormat - { - enum Enum - { - Unknow, - L8, // 1 byte pixel format, 1 byte luminance - L8A8, // 2 byte pixel format, 1 byte luminance, 1 byte alpha - R8G8B8, // 24-bit pixel format, 8 bits for red, green and blue. - R8G8B8A8 // 32-bit pixel format, 8 bits for red, green, blue and alpha. - }; - - PixelFormat(Enum _value = Unknow) : value(_value) { } - - friend bool operator == (PixelFormat const& a, PixelFormat const& b) { return a.value == b.value; } - friend bool operator != (PixelFormat const& a, PixelFormat const& b) { return a.value != b.value; } - - private: - Enum value; - }; - - struct MYGUI_EXPORT TextureUsage - { - enum Enum - { - Default = MYGUI_FLAG_NONE, - Static = MYGUI_FLAG(0), - Dynamic = MYGUI_FLAG(1), - Stream = MYGUI_FLAG(2), - Read = MYGUI_FLAG(3), - Write = MYGUI_FLAG(4), - RenderTarget = MYGUI_FLAG(5) - }; - - TextureUsage(Enum _value = Default) : value(_value) { } - - friend bool operator == (TextureUsage const& a, TextureUsage const& b) { return a.value == b.value; } - friend bool operator != (TextureUsage const& a, TextureUsage const& b) { return a.value != b.value; } - - TextureUsage& operator |= (TextureUsage const& _other) { value = Enum(int(value) | int(_other.value)); return *this; } - friend TextureUsage operator | (Enum const& a, Enum const& b) { return TextureUsage(Enum(int(a) | int(b))); } - friend TextureUsage operator | (TextureUsage const& a, TextureUsage const& b) { return TextureUsage(Enum(int(a.value) | int(b.value))); } - - bool isValue(Enum _value) { return 0 != (value & _value); } - - private: - Enum value; - }; - -} // namespace MyGUI - - -#endif // __MYGUI_RENDER_FORMAT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderItem.h deleted file mode 100644 index d122a3268..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderItem.h +++ /dev/null @@ -1,94 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RENDER_ITEM_H__ -#define __MYGUI_RENDER_ITEM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISubWidget.h" -#include "MyGUI_IVertexBuffer.h" -#include "MyGUI_VertexData.h" -#include "MyGUI_IRenderTarget.h" - -namespace MyGUI -{ - - typedef std::pair DrawItemInfo; - typedef std::vector VectorDrawItem; - - class MYGUI_EXPORT RenderItem - { - public: - RenderItem(); - virtual ~RenderItem(); - - void renderToTarget(IRenderTarget* _target, bool _update); - - void setTexture(ITexture* _value); - ITexture* getTexture(); - - void addDrawItem(ISubWidget* _item, size_t _count); - void removeDrawItem(ISubWidget* _item); - void reallockDrawItem(ISubWidget* _item, size_t _count); - - void outOfDate() { mOutDate = true; } - - size_t getNeedVertexCount() const { return mNeedVertexCount; } - size_t getVertexCount() const { return mCountVertex; } - - bool getCurrentUpdate() const { return mCurrentUpdate; } - Vertex* getCurrentVertextBuffer() const { return mCurrentVertext; } - - void setLastVertexCount(size_t _count) { mLastVertextCount = _count; } - - IRenderTarget* getRenderTarget() { return mRenderTarget; } - - bool getCompression(); - - private: -#if MYGUI_DEBUG_MODE == 1 - std::string mTextureName; -#endif - - ITexture* mTexture; - - size_t mNeedVertexCount; - - bool mOutDate; - VectorDrawItem mDrawItems; - - // êîëëè÷åñòâî îòðåíäðåííûõ ðåàëüíî âåðøèí - size_t mCountVertex; - - bool mCurrentUpdate; - Vertex* mCurrentVertext; - size_t mLastVertextCount; - - IVertexBuffer* mVertexBuffer; - IRenderTarget* mRenderTarget; - - bool mCompression; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RENDER_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderManager.h deleted file mode 100644 index fb151c5d5..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderManager.h +++ /dev/null @@ -1,69 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RENDER_MANAGER_H__ -#define __MYGUI_RENDER_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_RenderFormat.h" -#include "MyGUI_ITexture.h" -#include "MyGUI_IVertexBuffer.h" -#include "MyGUI_IRenderTarget.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT RenderManager - { - public: - RenderManager(); - virtual ~RenderManager() = 0; - - static RenderManager& getInstance(); - static RenderManager* getInstancePtr(); - - virtual IVertexBuffer* createVertexBuffer() = 0; - virtual void destroyVertexBuffer(IVertexBuffer* _buffer) = 0; - - virtual ITexture* createTexture(const std::string& _name) = 0; - virtual void destroyTexture(ITexture* _texture) = 0; - virtual ITexture* getTexture(const std::string& _name) = 0; - - //FIXME âîçìîæíî ïåðåíåñòè â ñòðóêòóðó î ðåíäåð òàðãåòå - virtual const IntSize& getViewSize() const = 0; - - virtual VertexColourType getVertexFormat() = 0; - - virtual bool isFormatSupported(PixelFormat _format, TextureUsage _usage) { return true; } - -#if MYGUI_DEBUG_MODE == 1 - virtual bool checkTexture(ITexture* _texture) { return true; } -#endif - - private: - static RenderManager* msInstance; - bool mIsInitialise; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RENDER_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderOut.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderOut.h deleted file mode 100644 index 8ad9fd284..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderOut.h +++ /dev/null @@ -1,71 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RENDER_OUT_H__ -#define __MYGUI_RENDER_OUT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Utility.h" - -namespace MyGUI -{ - namespace implement - { - void MYGUI_EXPORT render_out(const std::string& _value); - } - - template inline - void MYGUI_OUT (T p) { implement::render_out(utility::toString(p)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2) { implement::render_out(utility::toString(p1, p2)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3) { implement::render_out(utility::toString(p1, p2, p3)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3, T4 p4) { implement::render_out(utility::toString(p1, p2, p3, p4)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) { implement::render_out(utility::toString(p1, p2, p3, p4, p5)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) { implement::render_out(utility::toString(p1, p2, p3, p4, p5, p6)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) { implement::render_out(utility::toString(p1, p2, p3, p4, p5, p6, p7)); } - - template inline - void MYGUI_OUT (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) { implement::render_out(utility::toString(p1, p2, p3, p4, p5, p6, p7, p8)); } - - template inline - void MYGUI_OUT_SPACES (T1 p1, T2 p2) { implement::render_out(utility::toString(p1, " ", p2)); } - - template inline - void MYGUI_OUT_SPACES (T1 p1, T2 p2, T3 p3) { implement::render_out(utility::toString(p1, " ", p2, " ", p3)); } - - template inline - void MYGUI_OUT_SPACES (T1 p1, T2 p2, T3 p3, T4 p4) { implement::render_out(utility::toString(p1, " ", p2, " ", p3, " ", p4 )); } - -} // namespace MyGUI - -#endif // __MYGUI_RENDER_OUT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderTargetInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderTargetInfo.h deleted file mode 100644 index bbded7394..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RenderTargetInfo.h +++ /dev/null @@ -1,65 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RENDER_TARGET_INFO_H__ -#define __MYGUI_RENDER_TARGET_INFO_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - struct MYGUI_EXPORT RenderTargetInfo - { - RenderTargetInfo() : - maximumDepth(0), - pixScaleX(1), - pixScaleY(1), - hOffset(0), - vOffset(0), - aspectCoef(1), - leftOffset(0), - topOffset(0) - { - } - - void setOffset(int _left, int _top) const - { - leftOffset = _left; - topOffset = _top; - } - - float maximumDepth; - float pixScaleX; - float pixScaleY; - float hOffset; - float vOffset; - float aspectCoef; - - mutable int leftOffset; - mutable int topOffset; - }; - - -} // namespace MyGUI - -#endif // __MYGUI_RENDER_TARGET_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceHolder.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceHolder.h deleted file mode 100644 index 505e5e8a9..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceHolder.h +++ /dev/null @@ -1,96 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_HOLDER_H__ -#define __MYGUI_RESOURCE_HOLDER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Enumerator.h" - -namespace MyGUI -{ - - template - class /*MYGUI_EXPORT */ResourceHolder - { - public: - typedef std::map MapResource; - typedef Enumerator EnumeratorPtr; - - virtual ~ResourceHolder() { } - public: - /** Check is resource exist */ - bool isExist(const std::string& _name) const - { - return mResources.find(_name) != mResources.end(); - } - - /** Find resource by name*/ - Type* findByName(const std::string& _name) const - { - typename MapResource::const_iterator item = mResources.find(_name); - return (item == mResources.end()) ? nullptr : item->second; - } - - /** Get resource by name*/ - Type* getByName(const std::string& _name, bool _throw = true) const - { - Type* result = findByName(_name); - MYGUI_ASSERT(result || !_throw, "Resource '" << _name << "' not found"); - return result; - } - - bool remove(const std::string& _name) - { - typename MapResource::const_iterator item = mResources.find(_name); - if (item != mResources.end()) - { - delete item->second; - mResources.erase(item->first); - return true; - } - return false; - } - - void clear() - { - for (typename MapResource::iterator item=mResources.begin(); item!=mResources.end(); ++item) - { - delete item->second; - } - mResources.clear(); - } - - EnumeratorPtr getEnumerator() - { - return EnumeratorPtr(mResources); - } - - size_t getCount() const { return mResources.size(); } - - protected: - MapResource mResources; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_HOLDER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSet.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSet.h deleted file mode 100644 index 5699d06dc..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSet.h +++ /dev/null @@ -1,139 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_IMAGE_SET_H__ -#define __MYGUI_RESOURCE_IMAGE_SET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Macros.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_IResource.h" -#include "MyGUI_ImageInfo.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_ResourceManager.h" -#include "MyGUI_GenericFactory.h" - -namespace MyGUI -{ - - class ResourceImageSet; - typedef ResourceImageSet * ResourceImageSetPtr; - - struct IndexImage - { - std::string name; - float rate; - std::vector frames; - }; - typedef std::vector VectorIndexImage; - - struct GroupImage - { - std::string name; - std::string texture; - IntSize size; - VectorIndexImage indexes; - }; - typedef std::vector VectorGroupImage; - typedef Enumerator EnumeratorGroupImage; - - class MYGUI_EXPORT ResourceImageSet : - public IResource - { - friend class GenericFactory; - - MYGUI_RTTI_DERIVED( ResourceImageSet ) - - private: - ResourceImageSet() { } - virtual ~ResourceImageSet() { } - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - //-------------------------------------------------------------// - private: - size_t getGroupIndex(const std::string& _name) - { - for (size_t index=0; index= mGroups.size()) return mSizeEmpty; - return mGroups[_index].size; - } - - const IntSize& getGroupSize(const std::string& _group) - { - for (size_t index=0; index mFramesEmpty; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_IMAGE_SET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSetPointer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSetPointer.h deleted file mode 100644 index d41ddc50c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceImageSetPointer.h +++ /dev/null @@ -1,54 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_IMAGE_SET_POINTER_H__ -#define __MYGUI_RESOURCE_IMAGE_SET_POINTER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IPointer.h" -#include "MyGUI_ResourceImageSet.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ResourceImageSetPointer : public IPointer - { - MYGUI_RTTI_DERIVED( ResourceImageSetPointer ) - - public: - ResourceImageSetPointer(); - virtual ~ResourceImageSetPointer() { } - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - virtual void setImage(StaticImage* _image); - virtual void setPosition(StaticImage* _image, const IntPoint& _point); - - private: - IntPoint mPoint; - IntSize mSize; - ResourceImageSetPtr mImageSet; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_IMAGE_SET_POINTER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManager.h deleted file mode 100644 index 0aeddff6b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManager.h +++ /dev/null @@ -1,102 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_MANAGER_H__ -#define __MYGUI_RESOURCE_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_Guid.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_IResource.h" -#include "MyGUI_ResourceHolder.h" -#include "MyGUI_Delegate.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ResourceManager : - public ResourceHolder - { - MYGUI_INSTANCE_HEADER( ResourceManager ) - - public: - void initialise(); - void shutdown(); - - public: - - /** Load additional MyGUI *_resource.xml file */ - bool load(const std::string& _file); - - bool _loadImplement(const std::string& _file, bool _match, const std::string& _type, const std::string& _instance); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - void _loadList(xml::ElementPtr _node, const std::string& _file, Version _version); - - /** Get resource by GUID */ - IResourcePtr getByID(const Guid& _id, bool _throw = true); - - std::string getFileNameByID(const Guid& _id); - - void addResource(IResourcePtr _item); - - void removeResource(IResourcePtr _item); - - typedef delegates::CDelegate3 LoadXmlDelegate; - - LoadXmlDelegate& registerLoadXmlDelegate(const std::string& _key); - - void unregisterLoadXmlDelegate(const std::string& _key); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : size_t ResourceManager::getCount()") - size_t getResourceCount() { return getCount(); } - - MYGUI_OBSOLETE("use : IResourcePtr ResourceManager::getByName(const std::string& _name, bool _throw)") - IResourcePtr getResource(const std::string& _name, bool _throw = true) { return getByName(_name, _throw); } - - MYGUI_OBSOLETE("use : IResourcePtr ResourceManager::getByID(const Guid& _id, bool _throw)") - IResourcePtr getResource(const Guid& _id, bool _throw = true) { return getByID(_id, _throw); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - typedef std::map MapResourceID; - MapResourceID mResourcesID; - - // карта Ñ Ð´ÐµÐ»ÐµÐ³Ð°Ñ‚Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга хмл блоков - typedef std::map MapLoadXmlDelegate; - MapLoadXmlDelegate mMapLoadXmlDelegate; - - std::string mResourceGroup; - typedef std::vector VectorGuid; - typedef std::map MapVectorString; - - MapVectorString mListFileGuid; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualFont.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualFont.h deleted file mode 100644 index b531cd3f4..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualFont.h +++ /dev/null @@ -1,83 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_MANUAL_FONT_H__ -#define __MYGUI_RESOURCE_MANUAL_FONT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ITexture.h" -#include "MyGUI_IFont.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ResourceManualFont : - public IFont - { - MYGUI_RTTI_DERIVED( ResourceManualFont ) - - private: - typedef std::vector VectorRangeInfo; - typedef std::vector VectorPairCodeCoord; - - public: - ResourceManualFont(); - virtual ~ResourceManualFont(); - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - virtual GlyphInfo* getGlyphInfo(Char _id); - - virtual ITexture* getTextureFont() { return mTexture; } - - // äåôîëòíàÿ âûñîòà, óêàçàííàÿ â íàñòðîéêàõ øðèôòà - virtual int getDefaultHeight() { return mDefaultHeight; } - - private: - void addGlyph(Char _index, const IntCoord& _coord); - - void initialise(); - - void addGlyph(GlyphInfo * _info, Char _index, int _left, int _top, int _right, int _bottom, int _finalw, int _finalh, float _aspect, int _addHeight = 0); - - void addRange(VectorPairCodeCoord& _info, size_t _first, size_t _last, int _width, int _height, float _aspect); - void checkTexture(); - - private: - std::string mSource; - int mDefaultHeight; - - // îòäåëüíàÿ èíôîðìàöèÿ î ñèìâîëàõ - GlyphInfo mSpaceGlyphInfo; - - // ñèìâîëû ñîçäàííûå ðóêàìè - VectorPairCodeCoord mVectorPairCodeCoord; - - // âñÿ èíôîðìàöèÿ î ñèìâîëàõ - VectorRangeInfo mVectorRangeInfo; - - MyGUI::ITexture* mTexture; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_MANUAL_FONT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualPointer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualPointer.h deleted file mode 100644 index 277d1ee7f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceManualPointer.h +++ /dev/null @@ -1,55 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_MANUAL_POINTER_H__ -#define __MYGUI_RESOURCE_MANUAL_POINTER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_IPointer.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ResourceManualPointer : - public IPointer - { - MYGUI_RTTI_DERIVED( ResourceManualPointer ) - - public: - ResourceManualPointer() { } - virtual ~ResourceManualPointer() { } - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - virtual void setImage(StaticImage* _image); - virtual void setPosition(StaticImage* _image, const IntPoint& _point); - - private: - IntPoint mPoint; - IntSize mSize; - FloatRect mOffset; - std::string mTexture; - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_MANUAL_POINTER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceSkin.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceSkin.h deleted file mode 100644 index 01b6adcbd..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceSkin.h +++ /dev/null @@ -1,86 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_SKIN_H__ -#define __MYGUI_RESOURCE_SKIN_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_SubWidgetBinding.h" -#include "MyGUI_ChildSkinInfo.h" -#include "MyGUI_MaskPickInfo.h" -#include "MyGUI_IResource.h" -#include "MyGUI_SubWidgetInfo.h" - -namespace MyGUI -{ - - // вÑпомогательный клаÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ одного Ñкина - class MYGUI_EXPORT ResourceSkin : - public IResource - { - MYGUI_RTTI_DERIVED( ResourceSkin ) - - public: - ResourceSkin(); - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - const IntSize& getSize() const { return mSize; } - const std::string& getTextureName() const { return mTexture; } - const VectorSubWidgetInfo& getBasisInfo() const { return mBasis; } - const MapWidgetStateInfo& getStateInfo() const { return mStates; } - const MapString& getProperties() const { return mProperties; } - const VectorChildSkinInfo& getChild() const { return mChilds; } - MaskPickInfo const * getMask() const { return &mMaskPeek; } - const std::string& getSkinName() { return mSkinName; } - - private: - void setInfo(const IntSize& _size, const std::string &_texture); - void addInfo(const SubWidgetBinding& _bind); - void addProperty(const std::string &_key, const std::string &_value); - void addChild(const ChildSkinInfo& _child); - bool loadMask(const std::string& _file); - void clear(); - - void checkState(const MapStateInfo& _states); - void checkState(const std::string& _name); - void checkBasis(); - void fillState(const MapStateInfo& _states, size_t _index); - - private: - IntSize mSize; - std::string mTexture; - VectorSubWidgetInfo mBasis; - MapWidgetStateInfo mStates; - // дополнительные параметры Ñкина - MapString mProperties; - // дети Ñкина - VectorChildSkinInfo mChilds; - // маÑка Ð´Ð»Ñ Ñтого Ñкина Ð´Ð»Ñ Ð¿Ð¸ÐºÐ¸Ð½Ð³Ð° - MaskPickInfo mMaskPeek; - std::string mSkinName; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_SKIN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceTrueTypeFont.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceTrueTypeFont.h deleted file mode 100644 index 6754d9c9a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ResourceTrueTypeFont.h +++ /dev/null @@ -1,105 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 06/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__ -#define __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ITexture.h" -#include "MyGUI_IFont.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ResourceTrueTypeFont : - public IFont - { - MYGUI_RTTI_DERIVED( ResourceTrueTypeFont ) - - public: - typedef std::vector VectorPairCodePoint; - typedef std::vector VectorRangeInfo; - typedef std::vector VectorPairCodeCoord; - - public: - ResourceTrueTypeFont(); - virtual ~ResourceTrueTypeFont(); - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - virtual GlyphInfo* getGlyphInfo(Char _id); - - virtual ITexture* getTextureFont() { return mTexture; } - - // получившаÑÑÑ Ð²Ñ‹Ñота при генерации в пикÑелÑÑ… - virtual int getDefaultHeight() { return mHeightPix; } - - private: - void addCodePointRange(Char _first, Char _second); - void addHideCodePointRange(Char _first, Char _second); - - // проверÑет, входит ли Ñимвол в зоны ненужных Ñимволов - bool checkHidePointCode(Char _id); - - /** Clear the list of code point ranges. */ - void clearCodePointRanges(); - - void initialise(); - - void addGlyph(GlyphInfo * _info, Char _index, int _left, int _top, int _right, int _bottom, int _finalw, int _finalh, float _aspect, int _addHeight = 0); - // write 2 or 4 bytes into buffer: LA or LLLA if _rgba is true - uint8* writeData(uint8* _pDest, unsigned char _luminance, unsigned char _alpha, bool _rgba); - - private: - // Source of the font - std::string mSource; - // Size of the truetype font, in points - float mTtfSize; - // Resolution (dpi) of truetype font - uint mTtfResolution; - - bool mAntialiasColour; - - int mDistance; - int mSpaceWidth; - int mTabWidth; - int mCursorWidth; - int mSelectionWidth; - int mOffsetHeight; - int mHeightPix; - - // Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñимволах - GlyphInfo mSpaceGlyphInfo, mTabGlyphInfo, mSelectGlyphInfo, mSelectDeactiveGlyphInfo, mCursorGlyphInfo; - - // Ñимволы которые не нужно риÑовать - VectorPairCodePoint mVectorHideCodePoint; - - // вÑÑ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñимволах - VectorRangeInfo mVectorRangeInfo; - - MyGUI::ITexture* mTexture; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RotatingSkin.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RotatingSkin.h deleted file mode 100644 index 80847841f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_RotatingSkin.h +++ /dev/null @@ -1,77 +0,0 @@ -/*! - @file - @author George Evmenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_ROTATING_SKIN_H__ -#define __MYGUI_ROTATING_SKIN_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Types.h" -#include "MyGUI_ICroppedRectangle.h" -#include "MyGUI_SubSkin.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT RotatingSkin : public SubSkin - { - MYGUI_RTTI_DERIVED( RotatingSkin ) - - public: - RotatingSkin(); - virtual ~RotatingSkin(); - - /** Set angle of rotation */ - void setAngle(float _angle); - /** Get angle of rotation */ - float getAngle() const { return mAngle; } - - /** Set center of rotation - @param _center Center point. - @param _local If true - _center point calculated as point on SubWidget, else calculated as point on screen. - */ - void setCenter(const IntPoint &_center, bool _local = true); - /** Get center of rotation */ - IntPoint getCenter(bool _local = true) const; - - // ìåòîä äëÿ îòðèñîâêè ñåáÿ - virtual void doRender(); - - protected: - void recalculateAngles(); - - private: - float mAngle; - IntPoint mCenterPos; - bool mLocalCenter; - - /* - 0 3 - 1 2 - */ - float mBaseAngles[4]; - float mBaseDistances[4]; - }; - -} // namespace MyGUI - -#endif // __MYGUI_ROTATING_SKIN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollView.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollView.h deleted file mode 100644 index e59bbe04a..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollView.h +++ /dev/null @@ -1,156 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 08/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SCROLL_VIEW_H__ -#define __MYGUI_SCROLL_VIEW_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_ScrollViewBase.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT ScrollView : - public Widget, - protected ScrollViewBase - { - MYGUI_RTTI_DERIVED( ScrollView ) - - public: - ScrollView(); - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** Show VScroll when text size larger than Edit */ - void setVisibleVScroll(bool _value); - /** Get Show VScroll flag */ - bool isVisibleVScroll() { return mVisibleVScroll; } - - /** Show HScroll when text size larger than Edit */ - void setVisibleHScroll(bool _value); - /** Get Show HScroll flag */ - bool isVisibleHScroll() { return mVisibleHScroll; } - - /** Set canvas align */ - void setCanvasAlign(Align _value); - /** Get canvas align */ - Align getCanvasAlign() { return mContentAlign; } - - /** Set canvas size */ - void setCanvasSize(const IntSize& _value); - /** Set canvas size */ - void setCanvasSize(int _width, int _height) { setCanvasSize(IntSize(_width, _height)); } - /** Get canvas size */ - IntSize getCanvasSize(); - - /** Get rect where child widgets placed */ - const IntCoord& getClientCoord(); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - MYGUI_OBSOLETE("use : void ScrollView::setVisibleVScroll(bool _visible)") - void showVScroll(bool _visible) { setVisibleVScroll(_visible); } - MYGUI_OBSOLETE("use : bool ScrollView::isVisibleVScroll()") - bool isShowVScroll() { return isVisibleVScroll(); } - MYGUI_OBSOLETE("use : void ScrollView::setVisibleHScroll(bool _visible)") - void showHScroll(bool _visible) { setVisibleHScroll(_visible); } - MYGUI_OBSOLETE("use : bool ScrollView::isVisibleHScroll()") - bool isShowHScroll() { return isVisibleHScroll(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~ScrollView(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - // переопределÑем Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñвоению холÑта - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - void notifyMouseSetFocus(Widget* _sender, Widget* _old); - void notifyMouseLostFocus(Widget* _sender, Widget* _new); - void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseReleased(Widget* _sender, int _left, int _top, MouseButton _id); - - void notifyScrollChangePosition(VScroll* _sender, size_t _position); - void notifyMouseWheel(Widget* _sender, int _rel); - - virtual void onKeyLostFocus(Widget* _new); - virtual void onKeySetFocus(Widget* _old); - - void updateScrollViewState(); - void updateView(); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - // размер данных - virtual IntSize getContentSize(); - // Ñмещение данных - virtual IntPoint getContentPosition(); - virtual void setContentPosition(const IntPoint& _point); - // размер окна, через которые видно данные - virtual IntSize getViewSize() const; - // размер на который прокручиваютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ при щелчке по Ñкролу - virtual size_t getVScrollPage(); - virtual size_t getHScrollPage(); - - virtual Align getContentAlign() { return mContentAlign; } - - protected: - bool mIsFocus; - bool mIsPressed; - - Widget* mScrollClient; - Align mContentAlign; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_SCROLL_VIEW_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollViewBase.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollViewBase.h deleted file mode 100644 index 4ec39e274..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_ScrollViewBase.h +++ /dev/null @@ -1,75 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SCROLL_VIEW_BASE_H__ -#define __MYGUI_SCROLL_VIEW_BASE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - class ScrollViewBase - { - - protected: - ScrollViewBase(); - virtual ~ScrollViewBase() { } - - void updateScrollSize(); - void updateScrollPosition(); - - // ðàçìåð äàííûõ - virtual IntSize getContentSize() { return IntSize(); } - // ñìåùåíèå äàííûõ - virtual IntPoint getContentPosition() { return IntPoint(); } - virtual void setContentPosition(const IntPoint& _value) { } - // ðàçìåð îêíà, ÷åðåç êîòîðûå âèäíî äàííûå - virtual IntSize getViewSize() const { return IntSize(); } - // ðàçìåð íà êîòîðûé ïðîêðó÷èâàþòñÿ äàííûå ïðè ùåë÷êå ïî ñêðîëó - virtual size_t getHScrollPage() { return 1; } - virtual size_t getVScrollPage() { return 1; } - - virtual Align getContentAlign() { return Align::Center; } - - virtual void eraseContent() { } - - protected: - VScroll* mVScroll; - HScroll* mHScroll; - Widget* mClient; - - bool mVisibleHScroll; - bool mVisibleVScroll; - - size_t mVRange; - size_t mHRange; - - // èçìåíÿåòñÿ ëè ñîäåðæèìîå ïðè ðåñàéçå - bool mChangeContentByResize; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_SCROLL_VIEW_BASE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayer.h deleted file mode 100644 index efa6611a1..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayer.h +++ /dev/null @@ -1,75 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SHARED_LAYER_H__ -#define __MYGUI_SHARED_LAYER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_ILayer.h" -#include "MyGUI_SharedLayerNode.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SharedLayer : - public ILayer - { - MYGUI_RTTI_DERIVED( SharedLayer ) - - public: - SharedLayer(); - virtual ~SharedLayer(); - - virtual void deserialization(xml::ElementPtr _node, Version _version); - - // ñîçäàåì äî÷åðíèé íîä - virtual ILayerNode* createChildItemNode(); - // óäàëÿåì äî÷åðíèé íîä - virtual void destroyChildItemNode(ILayerNode* _node); - - // ïîäíèìàåì äî÷åðíèé íîä - virtual void upChildItemNode(ILayerNode* _node); - - // ñïèñîê äåòåé - virtual EnumeratorILayerNode getEnumerator(); - - // âîçâðàùàåò âèäæåò ïî ïîçèöèè - virtual ILayerItem* getLayerItemByPoint(int _left, int _top); - - virtual IntPoint getPosition(int _left, int _top) const; - - virtual const IntSize& getSize() const; - - // ðèñóåò ëååð - virtual void renderToTarget(IRenderTarget* _target, bool _update); - - virtual void dumpStatisticToLog(); - - protected: - bool mIsPick; - SharedLayerNode* mChildItem; - }; - -} // namespace MyGUI - -#endif // __MYGUI_SHARED_LAYER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayerNode.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayerNode.h deleted file mode 100644 index 8b8149e55..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SharedLayerNode.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SHARED_LAYER_NODE_H__ -#define __MYGUI_SHARED_LAYER_NODE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_LayerNode.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SharedLayerNode : public LayerNode - { - MYGUI_RTTI_DERIVED( SharedLayerNode ) - - public: - explicit SharedLayerNode(ILayer* _layer, ILayerNode* _parent = nullptr); - virtual ~SharedLayerNode(); - - void addUsing() { mCountUsing++; } - void removeUsing() { mCountUsing--; } - size_t countUsing() { return mCountUsing; } - - private: - size_t mCountUsing; - }; - -} // namespace MyGUI - -#endif // __MYGUI_SHARED_LAYER_NODE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SimpleText.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SimpleText.h deleted file mode 100644 index 4998cfd94..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SimpleText.h +++ /dev/null @@ -1,51 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SIMPLE_TEXT_H__ -#define __MYGUI_SIMPLE_TEXT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Types.h" -#include "MyGUI_ISubWidgetText.h" -#include "MyGUI_EditText.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SimpleText : public EditText - { - MYGUI_RTTI_DERIVED( SimpleText ) - - public: - SimpleText(); - virtual ~SimpleText(); - - virtual void setViewOffset(const IntPoint& _point); - - virtual void doRender(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_SIMPLE_TEXT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SkinManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SkinManager.h deleted file mode 100644 index e7a88efff..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SkinManager.h +++ /dev/null @@ -1,73 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SKIN_MANAGER_H__ -#define __MYGUI_SKIN_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_Enumerator.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_ResourceManager.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SkinManager - { - MYGUI_INSTANCE_HEADER( SkinManager ) - - public: - void initialise(); - void shutdown(); - - /** Load additional MyGUI *_skin.xml file */ - bool load(const std::string& _file); - void _load(xml::ElementPtr _node, const std::string& _file, Version _version); - - ResourceSkin* getByName(const std::string& _name) const; - - bool isExist(const std::string& _name) const; - - const std::string getDefaultSkin() const { return mDefaultName; } - void setDefaultSkin(const std::string& _value); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : ResourceSkin* SkinManager::getByName(const std::string& _name)") - ResourceSkin* getSkin(const std::string& _name) const { return getByName(_name); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - void createDefault(const std::string& _value); - - private: - std::string mDefaultName; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_SKIN_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticImage.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticImage.h deleted file mode 100644 index 945976d7e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticImage.h +++ /dev/null @@ -1,246 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_STATIC_IMAGE_H__ -#define __MYGUI_STATIC_IMAGE_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_ResourceImageSet.h" -#include "MyGUI_ImageInfo.h" -#include "MyGUI_Guid.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT StaticImage : - public Widget - { - MYGUI_RTTI_DERIVED( StaticImage ) - - public: - StaticImage(); - - //------------------------------------------------------------------------------// - // The simple interface - //------------------------------------------------------------------------------// - - /* Set texture and size of image _tile - @param _texture file name or texture name - @param _coord - part of texture where we take tiles - @param _tile size - */ - void setImageInfo(const std::string& _texture, const IntCoord& _coord, const IntSize& _tile); - - /* Set texture - @param _texture file name or texture name - */ - void setImageTexture(const std::string& _value); - - /** Set _rect - part of texture where we take tiles */ - void setImageRect(const IntRect& _value); - - /** Set _coord - part of texture where we take tiles */ - void setImageCoord(const IntCoord& _value); - - /** Set _tile size */ - void setImageTile(const IntSize& _value); - - /** Set current tile index - @param _index - tile index - @remarks Tiles in file start numbering from left to right and from top to bottom. - \n \bExample:\n -
-				+---+---+---+
-				| 0 | 1 | 2 |
-				+---+---+---+
-				| 3 | 4 | 5 |
-				+---+---+---+
-			
- */ - void setImageIndex(size_t _index); - /** Get current tile index */ - size_t getImageIndex(); - - //------------------------------------------------------------------------------// - // The expanded interface - //------------------------------------------------------------------------------// - - //! Get number of items - size_t getItemCount() const { return mItems.size(); } - - //! Select specified _index - void setItemSelect(size_t _index); - //! Get index of selected item (ITEM_NONE if none selected) - size_t getItemSelect() { return mIndexSelect; } - //! Reset item selection - void resetItemSelect() { setItemSelect(ITEM_NONE); } - - //! Insert an item into a list at a specified position - void insertItem(size_t _index, const IntCoord& _item); - //! Add an item to the end of a list - void addItem(const IntCoord& _item) { insertItem(ITEM_NONE, _item); } - //! Replace an item at a specified position - void setItem(size_t _index, const IntCoord& _item); - - //! Delete item at a specified position - void deleteItem(size_t _index); - //! Delete all items - void deleteAllItems(); - - // работа Ñ Ñ„Ñ€ÐµÐ¹Ð¼Ð°Ð¼Ð¸ анимированных индекÑов - /** Add frame - @param _index Image item index - @param _item Frame coordinates at image texture - */ - void addItemFrame(size_t _index, const IntCoord& _item); - - /** Insert frame - @param _index Image item index - @param _indexFrame Frame index where we insert frame - @param _item Frame coordinates at image texture - */ - void insertItemFrame(size_t _index, size_t _indexFrame, const IntCoord& _item); - - /** Add copy of frame (similar to StaticImage::addItemFrame but we copy frame coordinates) - @param _index Image item index - @param _indexSourceFrame Frame index of frame that we copying - */ - void addItemFrameDublicate(size_t _index, size_t _indexSourceFrame); - - /** Insert copy of frame (similar to StaticImage::insertItemFrame but we copy frame coordinates) - @param _index Image item index - @param _indexFrame Frame index where we insert frame - @param _indexSourceFrame Frame index of frame that we copying - */ - void insertItemFrameDublicate(size_t _index, size_t _indexFrame, size_t _indexSourceFrame); - - /** Change frame - @param _index Image item index - @param _indexFrame Frame index to change - @param _item Frame coordinates at image texture - */ - void setItemFrame(size_t _index, size_t _indexFrame, const IntCoord& _item); - - /** Delete frame - @param _index Image item index - @param _indexFrame Frame index that we delete - */ - void deleteItemFrame(size_t _index, size_t _indexFrame); - - /** Delete all frames - @param _index Image item index - */ - void deleteAllItemFrames(size_t _index); - - /** Set item frame rate - @param _index Image item index - @param _rate Duration of one frame in seconds - */ - void setItemFrameRate(size_t _index, float _rate); - - /** Get item frame rate - @param _index Image item index - */ - float getItemFrameRate(size_t _index); - - //------------------------------------------------------------------------------// - // The interface with support of resources - //------------------------------------------------------------------------------// - - /** Select current items resource used in StaticImage - @param _id Resource guid - @return false if resource with such guid not exist - */ - bool setItemResource(const Guid& _id); - - /** Select current items resource used in StaticImage - @param _id Resource name - @return false if resource with such name not exist - */ - bool setItemResource(const std::string& _name); - - /** Select current item group */ - void setItemGroup(const std::string& _value); - /** Select current item mane */ - void setItemName(const std::string& _value); - - /** Select current items resource used in StaticImage - @param _resource Resource pointer - */ - void setItemResourcePtr(ResourceImageSetPtr _resource); - /** Set current item */ - void setItemResourceInfo(const ImageIndexInfo& _info); - - /** Get current items resource used in StaticImage */ - ResourceImageSetPtr getItemResource() { return mResource; } - /** Select current item resource, group and name */ - void setItemResourceInfo(ResourceImageSetPtr _resource, const std::string& _group, const std::string& _name); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~StaticImage(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - void frameEntered(float _frame); - - void recalcIndexes(); - void updateSelectIndex(size_t _index); - - void frameAdvise(bool _advise); - - private: - // куÑок в текÑтуре наших картинок - IntRect mRectImage; - // размер одной картинки - IntSize mSizeTile; - // размер текÑтуры - IntSize mSizeTexture; - // Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ° - size_t mIndexSelect; - - VectorImages mItems; - - bool mFrameAdvise; - float mCurrentTime; - size_t mCurrentFrame; - - ResourceImageSetPtr mResource; - std::string mItemName; - std::string mItemGroup; - std::string mCurrentTextureName; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_STATIC_IMAGE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticText.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticText.h deleted file mode 100644 index 146d03f66..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_StaticText.h +++ /dev/null @@ -1,85 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_STATIC_TEXT_H__ -#define __MYGUI_STATIC_TEXT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT StaticText : - public Widget - { - MYGUI_RTTI_DERIVED( StaticText ) - - public: - StaticText(); - - /** Get text region coordinate */ - IntCoord getTextRegion(); - - /** Get text region size */ - IntSize getTextSize(); - - /** Set widget text font */ - virtual void setFontName(const std::string& _value); - /** Get widget text font name */ - const std::string& getFontName(); - - /** Set widget text font height */ - virtual void setFontHeight(int _value); - /** Get widget text font height */ - int getFontHeight(); - - /** Set widget text align */ - virtual void setTextAlign(Align _value); - /** Get widget text align */ - Align getTextAlign(); - - /** Set widget text colour */ - virtual void setTextColour(const Colour& _value); - /** Get widget text colour */ - const Colour& getTextColour(); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~StaticText(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_STATIC_TEXT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubSkin.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubSkin.h deleted file mode 100644 index 80b97ab91..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubSkin.h +++ /dev/null @@ -1,84 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 02/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SUB_SKIN_H__ -#define __MYGUI_SUB_SKIN_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_ISubWidgetRect.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_IStateInfo.h" - -namespace MyGUI -{ - - class RenderItem; - - class MYGUI_EXPORT SubSkin : - public ISubWidgetRect - { - MYGUI_RTTI_DERIVED( SubSkin ) - - public: - SubSkin(); - virtual ~SubSkin(); - - void setAlpha(float _alpha); - - virtual void setVisible(bool _visible); - - virtual void setStateData(IStateInfo* _data); - - virtual void createDrawItem(ITexture* _texture, ILayerNode * _node); - virtual void destroyDrawItem(); - - // метод Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки ÑÐµÐ±Ñ - virtual void doRender(); - - /*internal:*/ - void _updateView(); - void _correctView(); - - void _setAlign(const IntSize& _oldsize, bool _update); - void _setAlign(const IntCoord& _oldcoord, bool _update); - - virtual void _setUVSet(const FloatRect& _rect); - virtual void _setColour(const Colour& _value); - - protected: - FloatRect mRectTexture; - bool mEmptyView; - - uint32 mCurrentColour; - - FloatRect mCurrentTexture; - IntCoord mCurrentCoord; - - ILayerNode* mNode; - RenderItem* mRenderItem; - }; - -} // namespace MyGUI - -#endif // __MYGUI_SUB_SKIN_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetBinding.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetBinding.h deleted file mode 100644 index b6388b2b6..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetBinding.h +++ /dev/null @@ -1,88 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SUB_WIDGET_BINDING_H__ -#define __MYGUI_SUB_WIDGET_BINDING_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_ISubWidget.h" - -namespace MyGUI -{ - - // вÑпомогательный клаÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑабÑкинов - class MYGUI_EXPORT SubWidgetBinding - { - // Ð´Ð»Ñ Ð´Ð¾Ñтупа к внутренним членам - friend class ResourceSkin; - - public: - SubWidgetBinding() - { - clear(); - } - - SubWidgetBinding(const IntCoord& _coord, Align _aligin, const std::string& _type) - { - create(_coord, _aligin, _type); - } - - void create(const IntCoord& _coord, Align _aligin, const std::string& _type) - { - clear(); - mOffset = _coord; - mAlign = _aligin; - mType = _type; - } - - void clear() - { - mType = ""; - mAlign = Align::Default; - mStates.clear(); - } - - void add(const std::string& _name, IStateInfo* _data, const std::string& _skin) - { - // ищем такой же ключ - MapStateInfo::const_iterator iter = mStates.find(_name); - if (iter != mStates.end()) - { - delete _data; - MYGUI_LOG(Warning, "state with name '" << _name << "' already exist in skin '" << _skin << "'"); - return; - } - // добавлÑем - mStates[_name] = _data; - } - - private: - IntCoord mOffset; - Align mAlign; - std::string mType; - MapStateInfo mStates; - }; - -} // namespace MyGUI - - -#endif // __MYGUI_SUB_WIDGET_BINDING_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetInfo.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetInfo.h deleted file mode 100644 index 0d2bd1e45..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetInfo.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 26/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SUB_WIDGET_INFO_H__ -#define __MYGUI_SUB_WIDGET_INFO_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - // èíôîðìàöèÿ, îá îäíîì ñàáâèäæåòå - struct SubWidgetInfo - { - SubWidgetInfo(const std::string& _type, const IntCoord& _coord, Align _align) : - coord(_coord), - align(_align), - type(_type) - { - } - - IntCoord coord; - Align align; - std::string type; - }; - - typedef std::vector VectorSubWidgetInfo; - -} // namespace MyGUI - -#endif // __MYGUI_SUB_WIDGET_INFO_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetManager.h deleted file mode 100644 index cfbeb4a93..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_SubWidgetManager.h +++ /dev/null @@ -1,44 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_SUB_WIDGET_MANAGER_H__ -#define __MYGUI_SUB_WIDGET_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT SubWidgetManager - { - MYGUI_INSTANCE_HEADER( SubWidgetManager ) - - public: - void initialise(); - void shutdown(); - - }; - -} // namespace MyGUI - -#endif // __MYGUI_SUB_WIDGET_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TCoord.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TCoord.h deleted file mode 100644 index 165e0aa56..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TCoord.h +++ /dev/null @@ -1,229 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MyGUI_TCOORD_H__ -#define __MyGUI_TCOORD_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_TPoint.h" -#include "MyGUI_TSize.h" - -namespace MyGUI -{ - namespace types - { - - template< typename T > struct TCoord - { - T left, top, width, height; - - TCoord() : left( 0 ), top( 0 ), width( 0 ), height( 0 ) { } - TCoord( T const& _left, T const& _top, T const& _width, T const& _height ) : left( _left ), top( _top ), width( _width ), height( _height ) { } - TCoord( TCoord const& _obj ) : left( _obj.left ), top( _obj.top ), width( _obj.width ), height( _obj.height ) { } - TCoord( TPoint const& _point, TSize const& _size ) : left( _point.left ), top( _point.top ), width( _size.width ), height( _size.height ) { } - - TCoord& operator-=( TCoord const& _obj ) - { - left -= _obj.left; - top -= _obj.top; - width -= _obj.width; - height -= _obj.height; - return *this; - } - - TCoord& operator+=( TCoord const& _obj ) - { - left += _obj.left; - top += _obj.top; - width += _obj.width; - height += _obj.height; - return *this; - } - - TCoord operator-( TCoord const& _obj ) const - { - return TCoord(left - _obj.left, top - _obj.top, width - _obj.width, height - _obj.height); - } - - TCoord operator-( TPoint const& _obj ) const - { - return TCoord(left - _obj.left, top - _obj.top, width, height); - } - - TCoord operator-( TSize const& _obj ) const - { - return TCoord(left, top, width - _obj.width, height - _obj.height); - } - - TCoord operator+( TCoord const& _obj ) const - { - return TCoord(left + _obj.left, top + _obj.top, width + _obj.width, height + _obj.height); - } - - TCoord operator+( TPoint const& _obj ) const - { - return TCoord(left + _obj.left, top + _obj.top, width, height); - } - - TCoord operator+( TSize const& _obj ) const - { - return TCoord(left, top, width + _obj.width, height + _obj.height); - } - - TCoord& operator=( TCoord const& _obj ) - { - left = _obj.left; - top = _obj.top; - width = _obj.width; - height = _obj.height; - return *this; - } - - template< typename U > - TCoord& operator=( TCoord const& _obj ) - { - left = _obj.left; - top = _obj.top; - width = _obj.width; - height = _obj.height; - return *this; - } - - TCoord& operator=( TPoint const& _obj ) - { - left = _obj.left; - top = _obj.top; - return *this; - } - - TCoord& operator=( TSize const& _obj ) - { - width = _obj.width; - height = _obj.height; - return *this; - } - - - bool operator==( TCoord const& _obj ) const - { - return ((left == _obj.left) && (top == _obj.top) && (width == _obj.width) && (height == _obj.height)); - } - - bool operator!=( TCoord const& _obj ) const - { - return ! ((left == _obj.left) && (top == _obj.top) && (width == _obj.width) && (height == _obj.height)); - } - - T right() const - { - return left + width; - } - - T bottom() const - { - return top + height; - } - - void clear() - { - left = top = width = height = 0; - } - - void set( T const& _left, T const& _top, T const& _width, T const& _height ) - { - left = _left; - top = _top; - width = _width; - height = _height; - } - - void swap(TCoord& _value) - { - TCoord tmp = _value; - _value = *this; - *this = tmp; - } - - bool empty() const - { - return ((left == 0) && (top == 0) && (width == 0) && (height == 0)); - } - - TPoint point() const - { - return TPoint(left, top); - } - - TSize size() const - { - return TSize(width, height); - } - - bool inside(const TPoint& _value) const - { - return ( (_value.left >= left) && (_value.left <= right()) && (_value.top >= top) && (_value.top <= bottom()) ); - } - - std::string print() const - { - std::ostringstream stream; - stream << *this; - return stream.str(); - } - - static TCoord parse(const std::string& _value) - { - TCoord result; - std::istringstream stream(_value); - stream >> result.left >> result.top >> result.width >> result.height; - if (stream.fail()) return TCoord(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return TCoord(); - item = stream.get(); - } - } - return result; - } - - friend std::ostream& operator << ( std::ostream& _stream, const TCoord& _value ) - { - _stream << _value.left << " " << _value.top << " " << _value.width << " " << _value.height; - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, TCoord& _value ) - { - _stream >> _value.left >> _value.top >> _value.width >> _value.height; - if (_stream.fail()) _value.clear(); - return _stream; - } - - }; - - } // namespace types -} // namespace MyGUI - -#endif // __MyGUI_TCOORD_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TPoint.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TPoint.h deleted file mode 100644 index bfeb692f9..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TPoint.h +++ /dev/null @@ -1,155 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TPONT_H__ -#define __MYGUI_TPONT_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - namespace types - { - template< typename T > struct TPoint - { - T left, top; - - TPoint() : left( 0 ), top( 0 ) { } - TPoint( T const& _left, T const& _top) : left( _left ), top( _top ) { } - TPoint( TPoint const& o ) : left( o.left ), top( o.top ) { } - - TPoint& operator-=( TPoint const& o ) - { - left -= o.left; - top -= o.top; - return *this; - } - - TPoint& operator+=( TPoint const& o ) - { - left += o.left; - top += o.top; - return *this; - } - - TPoint operator-( TPoint const& o ) const - { - return TPoint(left - o.left, top - o.top); - } - - TPoint operator+( TPoint const& o ) const - { - return TPoint(left + o.left, top + o.top); - } - - TPoint& operator=( TPoint const& o ) - { - left = o.left; - top = o.top; - return *this; - } - - template< typename U > - TPoint& operator=( TPoint const& o ) - { - left = o.left; - top = o.top; - return *this; - } - - bool operator==( TPoint const& o ) const - { - return ((left == o.left) && (top == o.top)); - } - - bool operator!=( TPoint const& o ) const - { - return ! ((left == o.left) && (top == o.top)); - } - - void clear() - { - left = top = 0; - } - - void set( T const& _left, T const& _top) - { - left = _left; - top = _top; - } - - void swap(TPoint& _value) - { - TPoint tmp = _value; - _value = *this; - *this = tmp; - } - - bool empty() const - { - return ((left == 0) && (top == 0)); - } - - std::string print() const - { - std::ostringstream stream; - stream << *this; - return stream.str(); - } - - static TPoint parse(const std::string& _value) - { - TPoint result; - std::istringstream stream(_value); - stream >> result.left >> result.top; - if (stream.fail()) return TPoint(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return TPoint(); - item = stream.get(); - } - } - return result; - } - - friend std::ostream& operator << ( std::ostream& _stream, const TPoint& _value ) - { - _stream << _value.left << " " << _value.top; - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, TPoint& _value ) - { - _stream >> _value.left >> _value.top; - if (_stream.fail()) _value.clear(); - return _stream; - } - - }; - - } // namespace types -} // namespace MyGUI - -#endif // __MYGUI_TPONT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TRect.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TRect.h deleted file mode 100644 index c0e41c6f6..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TRect.h +++ /dev/null @@ -1,191 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TRECT_H__ -#define __MYGUI_TRECT_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - namespace types - { - - template< typename T > struct TRect - { - T left, top, right, bottom; - - TRect() : left( 0 ), top( 0 ), right( 0 ), bottom( 0 ) { } - TRect( T const& _left, T const& _top, T const& _right, T const& _bottom ) : left( _left ), top( _top ), right( _right ), bottom( _bottom ) { } - TRect( TRect const& o ) : left( o.left ), top( o.top ), right( o.right ), bottom( o.bottom ) { } - - TRect& operator-=( TRect const& o ) - { - left -= o.left; - top -= o.top; - right -= o.right; - bottom -= o.bottom; - return *this; - } - - TRect& operator+=( TRect const& o ) - { - left += o.left; - top += o.top; - right += o.right; - bottom += o.bottom; - return *this; - } - - TRect operator-( TRect const& o ) const - { - return TRect(left - o.left, top - o.top, right - o.right, bottom - o.bottom); - } - - TRect operator+( TRect const& o ) const - { - return TRect(left + o.left, top + o.top, right + o.right, bottom + o.bottom); - } - - TRect& operator=( TRect const& o ) - { - left = o.left; - top = o.top; - right = o.right; - bottom = o.bottom; - return *this; - } - - template< typename U > - TRect& operator=( TRect const& o ) - { - left = o.left; - top = o.top; - right = o.right; - bottom = o.bottom; - return *this; - } - - bool operator==( TRect const& o ) const - { - return ((left == o.left) && (top == o.top) && (right == o.right) && (bottom == o.bottom)); - } - - bool operator!=( TRect const& o ) const - { - return ! ((left == o.left) && (top == o.top) && (right == o.right) && (bottom == o.bottom)); - } - - T width() const - { - return right - left; - } - - T height() const - { - return bottom - top; - } - - void clear() - { - left = top = right = bottom = 0; - } - - void set( T const& _left, T const& _top, T const& _right, T const& _bottom ) - { - left = _left; - top = _top; - right = _right; - bottom = _bottom; - } - - void swap(TRect& _value) - { - TRect tmp = _value; - _value = *this; - *this = tmp; - } - - bool empty() const - { - return ((left == 0) && (top == 0) && (right == 0) && (bottom == 0)); - } - - bool inside(const TRect& _value) const - { - return ( (_value.left >= left) && (_value.right <= right) && (_value.top >= top) && (_value.bottom <= bottom) ); - } - - bool intersect(const TRect& _value) const - { - return ( (_value.left <= right) && (_value.right >= left) && (_value.top <= bottom) && (_value.bottom >= top) ); - } - - bool inside(const TPoint& _value) const - { - return ( (_value.left >= left) && (_value.left <= right) && (_value.top >= top) && (_value.top <= bottom) ); - } - - std::string print() const - { - std::ostringstream stream; - stream << *this; - return stream.str(); - } - - static TRect parse(const std::string& _value) - { - TRect result; - std::istringstream stream(_value); - stream >> result.left >> result.top >> result.right >> result.bottom; - if (stream.fail()) return TRect(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return TRect(); - item = stream.get(); - } - } - return result; - } - - friend std::ostream& operator << ( std::ostream& _stream, const TRect& _value ) - { - _stream << _value.left << " " << _value.top << " " << _value.right << " " << _value.bottom; - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, TRect& _value ) - { - _stream >> _value.left >> _value.top >> _value.right >> _value.bottom; - if (_stream.fail()) _value.clear(); - return _stream; - } - - }; - - } // namespace types -} // namespace MyGUI - -#endif // __MYGUI_TRECT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TSize.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TSize.h deleted file mode 100644 index 3b896d25b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TSize.h +++ /dev/null @@ -1,156 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TSIZE_H__ -#define __MYGUI_TSIZE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - namespace types - { - - template< typename T > struct TSize - { - T width, height; - - TSize() : width( 0 ), height( 0 ) { } - TSize( T const& w, T const& h) : width( w ), height( h ) { } - TSize( TSize const& o ) : width( o.width ), height( o.height ) { } - - TSize& operator-=( TSize const& o ) - { - width -= o.width; - height -= o.height; - return *this; - } - - TSize& operator+=( TSize const& o ) - { - width += o.width; - height += o.height; - return *this; - } - - TSize operator-( TSize const& o ) const - { - return TSize(width - o.width, height - o.height); - } - - TSize operator+( TSize const& o ) const - { - return TSize(width + o.width, height + o.height); - } - - TSize& operator=( TSize const& o ) - { - width = o.width; - height = o.height; - return *this; - } - - template< typename U > - TSize& operator=( TSize const& o ) - { - width = o.width; - height = o.height; - return *this; - } - - bool operator==( TSize const& o ) const - { - return ((width == o.width) && (height == o.height)); - } - - bool operator!=( TSize const& o ) const - { - return ! ((width == o.width) && (height == o.height)); - } - - void clear() - { - width = height = 0; - } - - void set( T const& w, T const& h) - { - width = w; - height = h; - } - - void swap(TSize& _value) - { - TSize tmp = _value; - _value = *this; - *this = tmp; - } - - bool empty() const - { - return ((width == 0) && (height == 0)); - } - - std::string print() const - { - std::ostringstream stream; - stream << *this; - return stream.str(); - } - - static TSize parse(const std::string& _value) - { - TSize result; - std::istringstream stream(_value); - stream >> result.width >> result.height; - if (stream.fail()) return TSize(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return TSize(); - item = stream.get(); - } - } - return result; - } - - friend std::ostream& operator << ( std::ostream& _stream, const TSize& _value ) - { - _stream << _value.width << " " << _value.height; - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, TSize& _value ) - { - _stream >> _value.width >> _value.height; - if (_stream.fail()) _value.clear(); - return _stream; - } - - }; - - } // namespace types -} // namespace MyGUI - -#endif // __MYGUI_TSIZE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Tab.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Tab.h deleted file mode 100644 index 73056a4f6..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Tab.h +++ /dev/null @@ -1,369 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TAB_H__ -#define __MYGUI_TAB_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_Any.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ControllerFadeAlpha.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_TabPtrSizeT; - - class MYGUI_EXPORT Tab : - public Widget - { - // Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð±Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± удалении - //FIXME - friend class TabItem; - - MYGUI_RTTI_DERIVED( Tab ) - - public: - Tab(); - - struct TabItemInfo - { - TabItemInfo(int _width, const UString& _name, TabItem* _item, Any _data) : - width(_width), - name(_name), - item(_item), - data(_data) - { - } - - int width; - UString name; - TabItem* item; - Any data; - }; - - typedef std::vector VectorTabItemInfo; - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - //------------------------------------------------------------------------------// - // манипулÑции айтемами - - //! Get number of items - size_t getItemCount() const { return mItemsInfo.size(); } - - //! Insert an item into a array at a specified position - TabItem* insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); - //! Insert an item into a array - TabItem* insertItem(TabItem* _to, const UString& _name, Any _data = Any::Null) - { - return insertItemAt(getItemIndex(_to), _name, _data); - } - - //! Add an item to the end of a array - TabItem* addItem(const UString& _name, Any _data = Any::Null) - { - return insertItemAt(ITEM_NONE, _name, _data); - } - - //! Remove item at a specified position - void removeItemAt(size_t _index); - //! Remove item - void removeItem(TabItem* _item) { removeItemAt(getItemIndex(_item)); } - - //! Remove all items - void removeAllItems(); - - - //! Get item from specified position - TabItem* getItemAt(size_t _index); - - //! Get item index - size_t getItemIndex(TabItem* _item); - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndex(TabItem* _item); - - //! Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found - size_t findItemIndexWith(const UString& _name); - - //! Search item, returns the item of the first occurrence in array or nullptr if item not found - TabItem* findItemWith(const UString& _name); - - - //------------------------------------------------------------------------------// - // манипулÑции выделениÑми - - //! Get index of selected item (ITEM_NONE if none selected) - size_t getIndexSelected() { return mIndexSelect; } - - //! Get selected item (nullptr if none selected) - TabItem* getItemSelected(); - - //! Select specified _index - void setIndexSelected(size_t _index); - - //! Select item - void setItemSelected(TabItem* _item) { setIndexSelected(getItemIndex(_item)); } - - - //------------------------------------------------------------------------------// - // манипулÑции данными - - //! Replace an item data at a specified position - void setItemDataAt(size_t _index, Any _data); - //! Replace an item data - void setItemData(TabItem* _item, Any _data) { setItemDataAt(getItemIndex(_item), _data); } - - //! Clear an item data at a specified position - void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } - //! Clear an item data - void clearItemData(TabItem* _item) { clearItemDataAt(getItemIndex(_item)); } - - //! Get item data from specified position - template - ValueType * getItemDataAt(size_t _index, bool _throw = true) - { - MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "Tab::getItemDataAt"); - return mItemsInfo[_index].data.castType(_throw); - } - //! Get item data - template - ValueType * getItemData(TabItem* _item, bool _throw = true) - { - return getItemDataAt(getItemIndex(_item), _throw); - } - - - //------------------------------------------------------------------------------// - // манипулÑции отображением - - //! Replace an item name at a specified position - void setItemNameAt(size_t _index, const UString& _name); - - //! Replace an item name - void setItemName(TabItem* _item, const UString& _name) { setItemNameAt(getItemIndex(_item), _name); } - - //! Get item name from specified position - const UString& getItemNameAt(size_t _index); - - //! Get item name - const UString& getItemName(TabItem* _item) { return getItemNameAt(getItemIndex(_item)); } - - - //------------------------------------------------------------------------------// - // манипулÑции выдимоÑтью - - //! Move all elements so specified becomes visible - void beginToItemAt(size_t _index); - - //! Move all elements so specified becomes visible - void beginToItem(TabItem* _item) { beginToItemAt(getItemIndex(_item)); } - - //! Move all elements so first becomes visible - void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } - - //! Move all elements so last becomes visible - void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } - - //! Move all elements so selected becomes visible - void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } - - - //------------------------------------------------------------------------------// - // оÑтальные манипулÑции - - //! Set button width at a specified position - void setButtonWidthAt(size_t _index, int _width = DEFAULT); - //! Set button width - void setButtonWidth(TabItem* _item, int _width = DEFAULT) { setButtonWidthAt(getItemIndex(_item), _width); } - - //! Get button width at a specified position - int getButtonWidthAt(size_t _index); - //! Get button width - int getButtonWidth(TabItem* _item) { return getButtonWidthAt(getItemIndex(_item)); } - - //------------------------------------------------------------------------------// - - /** Set default button width and disable autowidth mode */ - void setButtonDefaultWidth(int _value); - /** Get default button width */ - int getButtonDefaultWidth() { return mButtonDefaultWidth; } - - /** Enable or disable button auto width */ - void setButtonAutoWidth(bool _value); - /** Get button auto width flag */ - bool getButtonAutoWidth() { return mButtonAutoWidth; } - - /** Enable or disable smooth sheets showing */ - void setSmoothShow(bool _value) { mSmoothShow = _value; } - /** Get smooth sheets showing flag */ - bool getSmoothShow() { return mSmoothShow; } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : Active Tab sheet changed \n - signature : void method(MyGUI::Tab* _sender, size_t _index)\n - @param _sender widget that called this event - @param _index Index of selected sheet - */ - EventPair eventTabChangeSelect; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - MYGUI_OBSOLETE("use : int Tab::getButtonWidthAt(size_t _index)") - int getSheetButtonWidthIndex(size_t _index) { return getButtonWidthAt(_index); } - MYGUI_OBSOLETE("use : int Tab::getButtonWidth(TabItem* _item)") - int getSheetButtonWidth(TabItem* _sheet) { return getButtonWidth(_sheet); } - MYGUI_OBSOLETE("use : void Tab::setButtonWidthAt(size_t _index, int _width)") - void setSheetButtonWidthIndex(size_t _index, int _width = DEFAULT) { setButtonWidthAt(_index, _width); } - MYGUI_OBSOLETE("use : void Tab::setButtonWidth(TabItem* _item, int _width)") - void setSheetButtonWidth(TabItem* _sheet, int _width = DEFAULT) { setButtonWidth(_sheet, _width); } - MYGUI_OBSOLETE("use : void Tab::beginToItemAt(size_t _index)") - void showBarButton(size_t _index) { beginToItemAt(_index); } - MYGUI_OBSOLETE("use : void Tab::beginToItemSelected()") - void showBarSelectButton() { beginToItemSelected(); } - MYGUI_OBSOLETE("use : size_t Tab::getItemCount()") - size_t getSheetCount() { return getItemCount(); } - MYGUI_OBSOLETE("use : const UString& Tab::getItemName(TabItem* _item)") - const UString& getSheetName(TabItem* _sheet) { return getItemName(_sheet); } - MYGUI_OBSOLETE("use : const UString& Tab::getItemNameAt(size_t _index)") - const UString& getSheetNameIndex(size_t _index) { return getItemNameAt(_index); } - MYGUI_OBSOLETE("use : TabItem* Tab::getItemAt(size_t _index)") - TabItem* getSheet(size_t _index) { return getItemAt(_index); } - MYGUI_OBSOLETE("use : void Tab::setItemNameAt(size_t _index, const UString& _name)") - void setSheetNameIndex(size_t _index, const UString& _name, int _width = DEFAULT) { setItemNameAt(_index, _name); } - MYGUI_OBSOLETE("use : void Tab::setItemName(TabItem* _item, const UString& _name)") - void setSheetName(TabItem* _sheet, const UString& _name, int _width = DEFAULT) { setItemName(_sheet, _name); } - MYGUI_OBSOLETE("use : TabItem* Tab::addItem(const UString& _name, Any _data)") - TabItem* addSheet(const UString& _name, int _width = DEFAULT) { return addItem(_name, _width); } - MYGUI_OBSOLETE("use : TabItem* Tab::insertItemAt(size_t _index, const UString& _name, Any _data)") - TabItem* insertSheet(size_t _index, const UString& _name, int _width = DEFAULT) { return insertItemAt(_index, _name); } - MYGUI_OBSOLETE("use : void Tab::removeItemAt(size_t _index)") - void removeSheetIndex(size_t _index) { removeItemAt(_index); } - MYGUI_OBSOLETE("use : void Tab::removeItem(TabItem* _item)") - void removeSheet(TabItem* _sheet) { removeItem(_sheet); } - MYGUI_OBSOLETE("use : void Tab::setIndexSelected(size_t _index)") - void selectSheetIndex(size_t _index, bool _smooth = true) { setIndexSelected(_index); } - MYGUI_OBSOLETE("use : void Tab::setItemSelected(TabItem* _item)") - void selectSheet(TabItem* _sheet, bool _smooth = true) { setItemSelected(_sheet); } - MYGUI_OBSOLETE("use : size_t Tab::getIndexSelected()") - size_t getSelectSheetIndex() { return getIndexSelected(); } - - MYGUI_OBSOLETE("use : size_t Widget::getIndexSelected()") - size_t getItemIndexSelected() { return getIndexSelected(); } - MYGUI_OBSOLETE("use : void Widget::setIndexSelected(size_t _index)") - void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~Tab(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - // переопределÑем Ð´Ð»Ñ Ð¾Ñобого обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñтраниц - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - void updateBar(); - - void notifyPressedButtonEvent(MyGUI::Widget* _sender); - void notifyPressedBarButtonEvent(MyGUI::Widget* _sender); - - int _getTextWidth(const UString& _text); - - void _showItem(TabItem* _sheet, bool _show, bool _smooth); - - void _createItemButton(); - - void _insertItem(size_t _index, const UString& _name, TabItem* _sheet, Any _data); - - // вкладка при удалении уведомлÑет таб - void _notifyDeleteItem(TabItem* _item); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - void actionWidgetHide(Widget* _widget); - - ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); - - Widget* _getWidgetTemplate(); - Widget* _getWidgetBar(); - - private: - int mOffsetTab; // Ñмещение бара при показе кнопок - bool mButtonShow; - int mWidthBar; // ширина в которую помещаютьÑÑ Ð²Ñе кнопки - VectorWidgetPtr mItemButton; // ÑпиÑок кнопок, не должно равно ÑпиÑку Ñтраниц - std::string mButtonSkinName, mEmptySkinName; - - Widget* mWidgetBar; - Button* mButtonLeft; - Button* mButtonRight; - Button* mButtonList; - Widget* mButtonDecor; - VectorWidgetPtr mWidgetsPatch; // ÑпиÑок виджетов которые нужно показать при показе кнопки - Widget* mEmptyBarWidget; - Widget* mItemTemplate; - - // Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ вкладках - VectorTabItemInfo mItemsInfo; - size_t mStartIndex; - size_t mIndexSelect; - - int mButtonDefaultWidth; - bool mSmoothShow; - bool mButtonAutoWidth; - - // флаг, чтобы отÑеч ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ вкладок, при общем шутдауне виджета - bool mShutdown; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_TAB_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TabItem.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TabItem.h deleted file mode 100644 index ab6d27e3e..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TabItem.h +++ /dev/null @@ -1,90 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 01/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TAB_ITEM_H__ -#define __MYGUI_TAB_ITEM_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_Tab.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT TabItem : - public Widget - { - MYGUI_RTTI_DERIVED( TabItem ) - - public: - TabItem(); - - /** Set item caption */ - virtual void setCaption(const UString& _value); - /** Get item caption */ - virtual const UString& getCaption(); - - //! Set button width - void setButtonWidth(int _value = DEFAULT); - //! Get button width - int getButtonWidth(); - - //! Replace an item name - void setItemName(const UString& _value); - //! Get item name - const UString& getItemName(); - - //! Replace an item name - void setItemData(Any _value); - - //! Get item data - template - ValueType * getItemData(bool _throw = true) - { - return mOwner->getItemData(this, _throw); - } - - //! Select sheet - void setItemSelected(); - - //! Remove item - void removeItem(); - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*internal*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - protected: - virtual ~TabItem(); - - void setSelected(bool _value); - - private: - Tab* mOwner; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_TAB_ITEM_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextChangeHistory.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextChangeHistory.h deleted file mode 100644 index 204ee565b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextChangeHistory.h +++ /dev/null @@ -1,67 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TEXT_CHANGE_HISTORY_H__ -#define __MYGUI_TEXT_CHANGE_HISTORY_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Macros.h" -#include "MyGUI_UString.h" -#include - -namespace MyGUI -{ - - // инфо об одной операции - struct TextCommandInfo - { - // типы операций - enum CommandType - { - COMMAND_POSITION, - COMMAND_INSERT, - COMMAND_ERASE - }; - - // Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ вÑтавки текÑта - TextCommandInfo(const UString& _text, size_t _start, CommandType _type) - : text(_text), type(_type), start(_start), undo(ITEM_NONE), redo(ITEM_NONE), length(ITEM_NONE) { } - // Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ - TextCommandInfo(size_t _undo, size_t _redo, size_t _length) - : type(COMMAND_POSITION), start(ITEM_NONE), undo(_undo), redo(_redo), length(_length) { } - - // Ñтрока Ñ…Ð°Ñ€Ñ€Ð°ÐºÑ‚Ð¸Ñ€Ð¸Ð·ÑƒÐµÑ‰Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ - UString text; - // тип операции - CommandType type; - // инфа о начале позиции - size_t start; - // инфа о пÑевдо позиции - size_t undo, redo, length; - }; - - typedef std::vector VectorChangeInfo; - typedef std::deque DequeUndoRedoInfo; - -} // namespace MyGUI - -#endif // __MYGUI_TEXT_CHANGE_HISTORY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextIterator.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextIterator.h deleted file mode 100644 index b1284fb72..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextIterator.h +++ /dev/null @@ -1,125 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TEXT_ITERATOR_H__ -#define __MYGUI_TEXT_ITERATOR_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Colour.h" -#include "MyGUI_TextChangeHistory.h" -#include "MyGUI_IFont.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT TextIterator - { - private: - TextIterator(); - - public: - TextIterator(const UString& _text, VectorChangeInfo * _history = nullptr); - - bool moveNext(); - - // возвращает цвет - UString getTagColour(bool _clear = false); - - // возвращает цвет - bool getTagColour(UString& _colour); - - // удалÑет цвет - void clearTagColour() { getTagColour(true); } - - bool setTagColour(const Colour& _colour); - - bool setTagColour(UString _colour); - - // ÑохранÑет текущий итератор - bool saveStartPoint(); - - // возвращает Ñтроку от Ñохраненного итератора до текущего - UString getFromStart(); - - // удалÑет от запомненной точки до текущей - bool eraseFromStart(); - - // возвращает текущую пÑевдо позицию - size_t getPosition() const { return mPosition; } - - const UString& getText() const { return mText; } - - void insertText(const UString& _insert, bool _multiLine); - - void clearNewLine(UString& _text); - - //очищает веÑÑŒ текÑÑ‚ - void clearText() { clear(); } - - // возвращает размер Ñтроки - size_t getSize() const; - - void setText(const UString& _text, bool _multiLine); - - void cutMaxLength(size_t _max); - - void cutMaxLengthFromBeginning(size_t _max); - - // возвращает текÑÑ‚ без тегов - static UString getOnlyText(const UString& _text); - - static UString getTextNewLine() { return L"\n"; } - - static UString getTextCharInfo(Char _char); - - // проÑто конвертируем цвет в Ñтроку - static UString convertTagColour(const Colour& _colour); - - static UString toTagsString(const UString& _text); - - private: - - // возвращает цвет - bool getTagColour(UString& _colour, UString::iterator& _iter); - - void insert(UString::iterator& _start, UString& _insert); - - UString::iterator erase(UString::iterator _start, UString::iterator _end); - - void clear(); - - private: - UString mText; - UString::iterator mCurrent, mEnd, mSave; - - // Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¸ размер - size_t mPosition; - mutable size_t mSize; - bool mFirst; - - VectorChangeInfo * mHistory; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_TEXT_ITERATOR_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextView.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextView.h deleted file mode 100644 index a8384fd0c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextView.h +++ /dev/null @@ -1,358 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2009 - @module -*/ -#ifndef __MYGUI_TEXT_VIEW_H__ -#define __MYGUI_TEXT_VIEW_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_TextureUtility.h" - -namespace MyGUI -{ - - class CharInfo - { - public: - CharInfo() : width(0) { } - CharInfo(const FloatRect& _rect, int _width) : rect(_rect), width(_width) { } - CharInfo(uint32 _colour) : rect(-1, 0, 0, 0), width((int)_colour) { } - - bool isColour() const { return rect.left == -1; } - int getWidth() const { return width; } - const FloatRect& getUVRect() const { return rect; } - uint32 getColour() const { return (uint32)width; } - - private: - FloatRect rect; - int width; - }; - - typedef std::vector VectorCharInfo; - - struct LineInfo - { - LineInfo() : width(0), offset(0), count(0) { } - void clear() { width = 0; count = 0; simbols.clear(); offset = 0; } - int width; - int offset; - size_t count; - VectorCharInfo simbols; - }; - - typedef std::vector VectorLineInfo; - - class RollBackPoint - { - public: - RollBackPoint() : - position(0), - count(0), - lenght(0), - rollback(false) - { } - - void set( - size_t _position, - UString::const_iterator& _space_point, - size_t _count, - int _length - ) - { - position = _position; - space_point = _space_point; - count = _count; - lenght = _length; - rollback = true; - } - - void clear() { rollback = false; } - bool empty() const { return !rollback; } - int getLenght() const { MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid"); return lenght; } - size_t getCount() const { MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid"); return count; } - size_t getPosition() const { MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid"); return position; } - UString::const_iterator getTextIter() { MYGUI_DEBUG_ASSERT(rollback, "rollback point not valid"); return space_point; } - - private: - size_t position; - UString::const_iterator space_point; - size_t count; - int lenght; - bool rollback; - }; - - class TextView - { - public: - TextView() : - mLength(0), - mFontHeight(0) - { - } - - void update(const UString& _text, IFont* _font, int _height, Align _align, VertexColourType _format, int _maxheight = -1) - { - mFontHeight = _height; - - // ìàññèâ äëÿ áûñòðîé êîíâåðòàöèè öâåòîâ - static const char convert_colour[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, - 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - - mViewSize.clear(); - - RollBackPoint roll_back; - IntSize result; - int width = 0; - size_t count = 0; - mLength = 0; - mLineInfo.clear(); - LineInfo line_info; - int font_height = _font->getDefaultHeight(); - - UString::const_iterator end = _text.end(); - UString::const_iterator index = _text.begin(); - - /*if (index == end) - return;*/ - - result.height += _height; - - for (; index!=end; ++index) - { - Char character = *index; - - // íîâàÿ ñòðîêà - if (character == FontCodeType::CR - || character == FontCodeType::NEL - || character == FontCodeType::LF) - { - if (character == FontCodeType::CR) - { - UString::const_iterator peeki = index; - peeki ++; - if ((peeki != end) && (*peeki == FontCodeType::LF)) - index = peeki; // skip both as one newline - } - - line_info.width = width; - line_info.count = count; - mLength += line_info.count + 1; - - result.height += _height; - if (result.width < width) - result.width = width; - width = 0; - count = 0; - - mLineInfo.push_back(line_info); - line_info.clear(); - - // îòìåíÿåì îòêàò - roll_back.clear(); - - continue; - } - // òåã - else if (character == L'#') - { - // áåðåì ñëåäóþùèé ñèìâîë - ++ index; - if (index == end) { --index; continue; } // ýòî çàùèòà - - character = *index; - // åñëè äâà ïîäðÿä, òî ðèñóåì îäèí øàðï, åñëè íåò òî ìåíÿåì öâåò - if (character != L'#') - { - // ïàðñèì ïåðâûé ñèìâîë - uint32 colour = convert_colour[(character-48) & 0x3F]; - - // è åùå ïÿòü ñèìâîëîâ ïîñëå øàðïà - for (char i=0; i<5; i++) - { - ++ index; - if (index == end) { --index; continue; } // ýòî çàùèòà - colour <<= 4; - colour += convert_colour[ ((*index) - 48) & 0x3F ]; - } - - // åñëè íóæíî, òî ìåíÿåì êðàñíûé è ñèíèé êîìïîíåíòû - texture_utility::convertColour(colour, _format); - - line_info.simbols.push_back( CharInfo(colour) ); - - continue; - } - } - - GlyphInfo* info = _font->getGlyphInfo(character); - if (FontCodeType::Space == character) - { - roll_back.set(line_info.simbols.size(), index, count, width); - } - else if (FontCodeType::Tab == character) - { - roll_back.set(line_info.simbols.size(), index, count, width); - } - - int char_width = info->width; - if (font_height != _height) - { - char_width = char_width * _height / font_height; - if (!char_width) char_width = 1; - } - - // ïåðåíîñ ñëîâ - if (_maxheight != -1 - && (width + char_width) > _maxheight - && !roll_back.empty()) - { - // îòêàòûâàåì äî ïîñëåäíåãî ïðîáåëà - width = roll_back.getLenght(); - count = roll_back.getCount(); - index = roll_back.getTextIter(); - line_info.simbols.erase(line_info.simbols.begin() + roll_back.getPosition(), line_info.simbols.end()); - - // çàïîìèíàåì ìåñòî îòêàòà, êàê ïîëíóþ ñòðîêó - line_info.width = width; - line_info.count = count; - mLength += line_info.count + 1; - - result.height += _height; - if (result.width < width) - result.width = width; - width = 0; - count = 0; - - mLineInfo.push_back(line_info); - line_info.clear(); - - // îòìåíÿåì îòêàò - roll_back.clear(); - - continue; - } - - line_info.simbols.push_back(CharInfo(info->uvRect, char_width)); - width += char_width; - count ++; - } - - line_info.width = width; - line_info.count = count; - mLength += line_info.count; - - mLineInfo.push_back(line_info); - - if (result.width < width) - result.width = width; - - // òåïåðü âûðàâíèâàíèåì ñòðîêè - for (VectorLineInfo::iterator line=mLineInfo.begin(); line!=mLineInfo.end(); ++line) - { - if (_align.isRight()) - line->offset = result.width - line->width; - else if (_align.isHCenter()) - line->offset = (result.width - line->width) / 2; - } - - mViewSize = result; - } - - size_t getCursorPosition(const IntPoint& _value) - { - const int height = mFontHeight; - size_t result = 0; - int top = 0; - - for (VectorLineInfo::const_iterator line=mLineInfo.begin(); line!=mLineInfo.end(); ++line) - { - // ýòî ïîñëåäíÿÿ ñòðîêà - bool lastline = !(line + 1 != mLineInfo.end()); - - // íàøà ñòðî÷êà - if (top + height > _value.top || lastline) - { - top += height; - int left = line->offset; - int count = 0; - - // èùåì ñèìâîë - for (VectorCharInfo::const_iterator sim=line->simbols.begin(); sim!=line->simbols.end(); ++sim) - { - if (sim->isColour()) - continue; - - if ((left + (sim->getWidth() / 2)) > _value.left) - { - break; - } - left += sim->getWidth(); - count ++; - } - - result += count; - break; - } - - if (!lastline) - { - top += height; - result += line->count + 1; - } - } - - return result; - } - - IntPoint getCursorPoint(size_t _position) - { - if (_position >= mLength + 1) _position = mLength; - - size_t position = 0; - int top = 0; - int left = 0; - for (VectorLineInfo::const_iterator line=mLineInfo.begin(); line!=mLineInfo.end(); ++line) - { - left = line->offset; - if (position + line->count >= _position) - { - for (VectorCharInfo::const_iterator sim=line->simbols.begin(); sim!=line->simbols.end(); ++sim) - { - if (sim->isColour()) - continue; - - if (position == _position) - break; - - position ++; - left += sim->getWidth(); - } - break; - } - position += line->count + 1; - top += mFontHeight; - } - - return IntPoint(left, top); - } - - const IntSize& getViewSize() const { return mViewSize; } - size_t getTextLength() const { return mLength; } - const VectorLineInfo& getData() { return mLineInfo; } - - private: - IntSize mViewSize; - size_t mLength; - VectorLineInfo mLineInfo; - int mFontHeight; - }; - - -} // namespace MyGUI - -#endif // __MYGUI_TEXT_VIEW_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextureUtility.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextureUtility.h deleted file mode 100644 index 4883d2ca8..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TextureUtility.h +++ /dev/null @@ -1,50 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 09/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TEXTURE_UTILITY_H__ -#define __MYGUI_TEXTURE_UTILITY_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Colour.h" -#include "MyGUI_RenderFormat.h" - -namespace MyGUI -{ - - namespace texture_utility - { - - MYGUI_EXPORT const IntSize& getTextureSize(const std::string& _texture, bool _cache = true); - MYGUI_EXPORT uint32 toColourARGB(const Colour& _colour); - - MYGUI_FORCEINLINE void convertColour(uint32& _colour, VertexColourType _format) - { - if (_format == VertexColourType::ColourABGR) - _colour = ((_colour & 0x00FF0000) >> 16) | ((_colour & 0x000000FF) << 16) | (_colour & 0xFF00FF00); - } - - - } // namespace texture_utility - -} // namespace MyGUI - -#endif // __MYGUI_TEXTURE_UTILITY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TileRect.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TileRect.h deleted file mode 100644 index b79817f98..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_TileRect.h +++ /dev/null @@ -1,94 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TILE_RECT_H__ -#define __MYGUI_TILE_RECT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_XmlDocument.h" -#include "MyGUI_Types.h" -#include "MyGUI_ISubWidgetRect.h" -#include "MyGUI_ResourceSkin.h" - -namespace MyGUI -{ - - class RenderItem; - - class MYGUI_EXPORT TileRect : public ISubWidgetRect - { - MYGUI_RTTI_DERIVED( TileRect ) - - public: - TileRect(); - virtual ~TileRect(); - - void setAlpha(float _alpha); - - virtual void setVisible(bool _visible); - - virtual void createDrawItem(ITexture* _texture, ILayerNode * _node); - virtual void destroyDrawItem(); - - // метод Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ñовки ÑÐµÐ±Ñ - virtual void doRender(); - - virtual void setStateData(IStateInfo * _data); - - /*internal:*/ - void _updateView(); - void _correctView(); - - void _setAlign(const IntSize& _oldsize, bool _update); - void _setAlign(const IntCoord& _oldcoord, bool _update); - - virtual void _setUVSet(const FloatRect& _rect); - virtual void _setColour(const Colour& _value); - - protected: - FloatRect mRectTexture; - bool mEmptyView; - - uint32 mCurrentColour; - - FloatRect mCurrentTexture; - IntCoord mCurrentCoord; - - ILayerNode* mNode; - RenderItem* mRenderItem; - - IntSize mTileSize; - size_t mCountVertex; - - float mRealTileWidth; - float mRealTileHeight; - - float mTextureHeightOne; - float mTextureWidthOne; - - bool mTileH; - bool mTileV; - }; - -} // namespace MyGUI - -#endif // __MYGUI_TILE_RECT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Timer.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Timer.h deleted file mode 100644 index a93845091..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Timer.h +++ /dev/null @@ -1,48 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 04/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TIMER_H__ -#define __MYGUI_TIMER_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT Timer - { - public: - Timer(); - - void reset(); - unsigned long getMilliseconds(); - - private: - unsigned long getCurrentMilliseconds(); - - private: - unsigned long mTimeStart; - }; - -} // namespace MyGUI - -#endif // __MYGUI_TIMER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Types.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Types.h deleted file mode 100644 index 2051c6c1c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Types.h +++ /dev/null @@ -1,70 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_TYPES_H__ -#define __MYGUI_TYPES_H__ - -#include "MyGUI_Prerequest.h" - -#include -#include -#include - -#include "MyGUI_Utility.h" -#include "MyGUI_Align.h" -#include "MyGUI_TPoint.h" -#include "MyGUI_TSize.h" -#include "MyGUI_TRect.h" -#include "MyGUI_TCoord.h" - -namespace MyGUI -{ - - // определÑем типы - typedef types::TPoint IntPoint; - typedef types::TPoint FloatPoint; - - typedef types::TSize IntSize; - typedef types::TSize FloatSize; - - typedef types::TRect IntRect; - typedef types::TRect FloatRect; - - typedef types::TCoord IntCoord; - typedef types::TCoord FloatCoord; - - typedef std::map MapString; - typedef std::vector VectorString; - - typedef char int8; - typedef short int16; - typedef int int32; - typedef unsigned char uint8; - typedef unsigned short uint16; - typedef unsigned int uint32; - typedef unsigned int uint; - - typedef unsigned int Char; - -} // namespace MyGUI - -#endif // __MYGUI_TYPES_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_UString.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_UString.h deleted file mode 100644 index f42268102..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_UString.h +++ /dev/null @@ -1,2765 +0,0 @@ -// Modified from OpenGUI under lenient license -// Original copyright details and licensing below: -// OpenGUI (http://opengui.sourceforge.net) -// This source code is released under the BSD License - -// Permission is given to the Ogre project to use the contents of file within its -// source and binary applications, as well as any derivative works, in accordance -// with the terms of any license under which Ogre is or will be distributed. -// -// Ogre may relicense its copy of this file, as well as any OpenGUI released updates -// to this file, under any terms that it deems fit, and is not required to maintain -// the original BSD licensing terms of this file, however OpenGUI retains the right -// to present its copy of this file under the terms of any license under which -// OpenGUI is distributed. -// -// Ogre is not required to release to OpenGUI any future changes that it makes to -// this file, and understands and agrees that any such changes that are released -// back to OpenGUI will become available under the terms of any license under which -// OpenGUI is distributed. -// -// For brevity, this permission text may be removed from this file if desired. -// The original record kept within the SourceForge (http://sourceforge.net/) tracker -// is sufficient. -// -// - Eric Shorkey (zero/zeroskill) [January 20th, 2007] - -#ifndef __MYGUI_U_STRING_H__ -#define __MYGUI_U_STRING_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_Diagnostic.h" -#include "MyGUI_LogManager.h" - -// these are explained later -#include -#include -#include - -// this pragma used to avoid warnings from some advanced gcc warnings flags -#if MYGUI_COMPILER == MYGUI_COMPILER_GNUC -#pragma GCC system_header -#endif - -// Workaround for VC7: -// when build with /MD or /MDd, VC7 have both std::basic_string and -// basic_string<__wchar_t> instantiated in msvcprt[d].lib/MSVCP71[D].dll, but the header -// files tells compiler that only one of them is over there (based on /Zc:wchar_t compile -// option). And since this file used both of them, causing compiler instantiating another -// one in user object code, which lead to duplicate symbols with msvcprt.lib/MSVCP71[D].dll. -// -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC && (1300 <= MYGUI_COMP_VER && MYGUI_COMP_VER <= 1310) - -# if defined(_DLL_CPPLIB) - -namespace std -{ - template class _CRTIMP2 basic_string, - allocator >; - - template class _CRTIMP2 basic_string<__wchar_t, char_traits<__wchar_t>, - allocator<__wchar_t> >; -} - -# endif // defined(_DLL_CPPLIB) - -#endif // MYGUI_COMPILER == MYGUI_COMPILER_MSVC && MYGUI_COMP_VER == 1300 - - -namespace MyGUI -{ - - /* READ THIS NOTICE BEFORE USING IN YOUR OWN APPLICATIONS - =NOTICE= - This class is not a complete Unicode solution. It purposefully does not - provide certain functionality, such as proper lexical sorting for - Unicode values. It does provide comparison operators for the sole purpose - of using UString as an index with std::map and other operator< sorted - containers, but it should NOT be relied upon for meaningful lexical - operations, such as alphabetical sorts. If you need this type of - functionality, look into using ICU instead (http://icu.sourceforge.net/). - - =REQUIREMENTS= - There are a few requirements for proper operation. They are fairly small, - and shouldn't restrict usage on any reasonable target. - * Compiler must support unsigned 16-bit integer types - * Compiler must support signed 32-bit integer types - * wchar_t must be either UTF-16 or UTF-32 encoding, and specified as such - using the WCHAR_UTF16 macro as outlined below. - * You must include , , and . Probably more, but - these are the most obvious. - - =REQUIRED PREPROCESSOR MACROS= - This class requires two preprocessor macros to be defined in order to - work as advertised. - INT32 - must be mapped to a signed 32 bit integer (ex. #define INT32 int) - UINT16 - must be mapped to an unsigned 16 bit integer (ex. #define UINT32 unsigned short) - - Additionally, a third macro should be defined to control the evaluation of wchar_t: - WCHAR_UTF16 - should be defined when wchar_t represents UTF-16 code points, - such as in Windows. Otherwise it is assumed that wchar_t is a 32-bit - integer representing UTF-32 code points. - */ - - // THIS IS A VERY BRIEF AUTO DETECTION. YOU MAY NEED TO TWEAK THIS -#ifdef __STDC_ISO_10646__ -// for any compiler that provides this, wchar_t is guaranteed to hold any Unicode value with a single code point (32-bit or larger) -// so we can safely skip the rest of the testing -#else // #ifdef __STDC_ISO_10646__ -#if defined( __WIN32__ ) || defined( _WIN32 ) -#define WCHAR_UTF16 // All currently known Windows platforms utilize UTF-16 encoding in wchar_t -#else // #if defined( __WIN32__ ) || defined( _WIN32 ) -#if WCHAR_MAX <= 0xFFFF // this is a last resort fall back test; WCHAR_MAX is defined in -#define WCHAR_UTF16 // best we can tell, wchar_t is not larger than 16-bit -#endif // #if WCHAR_MAX <= 0xFFFF -#endif // #if defined( __WIN32__ ) || defined( _WIN32 ) -#endif // #ifdef __STDC_ISO_10646__ - - -// MYGUI_IS_NATIVE_WCHAR_T means that wchar_t isn't a typedef of -// uint16 or uint32. -#if MYGUI_COMPILER == MYGUI_COMPILER_MSVC - -// Don't define wchar_t related functions since it'll duplicate -// with UString::code_point related functions when compile -// without /Zc:wchar_t, because in this case both of them are -// a typedef of uint16. -# if defined(_NATIVE_WCHAR_T_DEFINED) -# define MYGUI_IS_NATIVE_WCHAR_T 1 -# else -# define MYGUI_IS_NATIVE_WCHAR_T 0 -# endif - -#else // MYGUI_COMPILER != MYGUI_COMPILER_MSVC - -// Assumed wchar_t is natively for other compilers -# define MYGUI_IS_NATIVE_WCHAR_T 1 - -#endif // MYGUI_COMPILER == MYGUI_COMPILER_MSVC - - //! A UTF-16 string with implicit conversion to/from std::string and std::wstring - /*! This class provides a complete 1 to 1 map of most std::string functions (at least to my - knowledge). Implicit conversions allow this string class to work with all common C++ string - formats, with specialty functions defined where implicit conversion would cause potential - problems or is otherwise unavailable. - - Some additional functionality is present to assist in working with characters using the - 32-bit UTF-32 encoding. (Which is guaranteed to fit any Unicode character into a single - code point.) \b Note: Reverse iterators do not have this functionality due to the - ambiguity that surrounds working with UTF-16 in reverse. (Such as, where should an - iterator point to represent the beginning of a surrogate pair?) - - - \par Supported Input Types - The supported string types for input, and their assumed encoding schemes, are: - - std::string (UTF-8) - - char* (UTF-8) - - std::wstring (autodetected UTF-16 / UTF-32 based on compiler) - - wchar_t* (autodetected UTF-16 / UTF-32 based on compiler) - - - \see - - For additional information on UTF-16 encoding: http://en.wikipedia.org/wiki/UTF-16 - - For additional information on UTF-8 encoding: http://en.wikipedia.org/wiki/UTF-8 - - For additional information on UTF-32 encoding: http://en.wikipedia.org/wiki/UTF-32 - */ - class UString - { - // constants used in UTF-8 conversions - static const unsigned char _lead1 = 0xC0; //110xxxxx - static const unsigned char _lead1_mask = 0x1F; //00011111 - static const unsigned char _lead2 = 0xE0; //1110xxxx - static const unsigned char _lead2_mask = 0x0F; //00001111 - static const unsigned char _lead3 = 0xF0; //11110xxx - static const unsigned char _lead3_mask = 0x07; //00000111 - static const unsigned char _lead4 = 0xF8; //111110xx - static const unsigned char _lead4_mask = 0x03; //00000011 - static const unsigned char _lead5 = 0xFC; //1111110x - static const unsigned char _lead5_mask = 0x01; //00000001 - static const unsigned char _cont = 0x80; //10xxxxxx - static const unsigned char _cont_mask = 0x3F; //00111111 - - public: - //! size type used to indicate string size and character positions within the string - typedef size_t size_type; - //! the usual constant representing: not found, no limit, etc - static const size_type npos = ~(size_t)0; - - //! a single 32-bit Unicode character - typedef uint32 unicode_char; - - //! a single UTF-16 code point - typedef uint16 code_point; - - //! value type typedef for use in iterators - typedef code_point value_type; - - typedef std::basic_string dstring; // data string - - //! string type used for returning UTF-32 formatted data - typedef std::basic_string utf32string; - - //! This exception is used when invalid data streams are encountered - class invalid_data: public std::runtime_error - { /* i don't know why the beautifier is freaking out on this line */ - public: - //! constructor takes a string message that can be later retrieved by the what() function - explicit invalid_data( const std::string& _Message ): std::runtime_error( _Message ) - { - /* The thing is, Bob, it's not that I'm lazy, it's that I just don't care. */ - } - }; - - //######################################################################### - //! base iterator class for UString - class _base_iterator: public std::iterator - { /* i don't know why the beautifier is freaking out on this line */ - friend class UString; - protected: - _base_iterator() - { - mString = 0; - } - - void _seekFwd( size_type c ) - { - mIter += c; - } - void _seekRev( size_type c ) - { - mIter -= c; - } - void _become( const _base_iterator& i ) - { - mIter = i.mIter; - mString = i.mString; - } - bool _test_begin() const - { - return mIter == mString->mData.begin(); - } - bool _test_end() const - { - return mIter == mString->mData.end(); - } - size_type _get_index() const - { - return mIter - mString->mData.begin(); - } - void _jump_to( size_type index ) - { - mIter = mString->mData.begin() + index; - } - - unicode_char _getCharacter() const - { - size_type current_index = _get_index(); - return mString->getChar( current_index ); - } - int _setCharacter( unicode_char uc ) - { - size_type current_index = _get_index(); - int change = mString->setChar( current_index, uc ); - _jump_to( current_index ); - return change; - } - - void _moveNext() - { - _seekFwd( 1 ); // move 1 code point forward - if ( _test_end() ) return; // exit if we hit the end - if ( _utf16_surrogate_follow( mIter[0] ) ) - { - // landing on a follow code point means we might be part of a bigger character - // so we test for that - code_point lead_half = 0; - //NB: we can't possibly be at the beginning here, so no need to test - lead_half = mIter[-1]; // check the previous code point to see if we're part of a surrogate pair - if ( _utf16_surrogate_lead( lead_half ) ) - { - _seekFwd( 1 ); // if so, then advance 1 more code point - } - } - } - void _movePrev() - { - _seekRev( 1 ); // move 1 code point backwards - if ( _test_begin() ) return; // exit if we hit the beginning - if ( _utf16_surrogate_follow( mIter[0] ) ) - { - // landing on a follow code point means we might be part of a bigger character - // so we test for that - code_point lead_half = 0; - lead_half = mIter[-1]; // check the previous character to see if we're part of a surrogate pair - if ( _utf16_surrogate_lead( lead_half ) ) - { - _seekRev( 1 ); // if so, then rewind 1 more code point - } - } - } - - dstring::iterator mIter; - UString* mString; - }; - - //######################################################################### - // FORWARD ITERATORS - //######################################################################### - class _const_fwd_iterator; // forward declaration - - //! forward iterator for UString - class _fwd_iterator: public _base_iterator - { /* i don't know why the beautifier is freaking out on this line */ - friend class _const_fwd_iterator; - public: - _fwd_iterator() { } - _fwd_iterator( const _fwd_iterator& i ) - { - _become( i ); - } - - //! pre-increment - _fwd_iterator& operator++() - { - _seekFwd( 1 ); - return *this; - } - //! post-increment - _fwd_iterator operator++( int ) - { - _fwd_iterator tmp( *this ); - _seekFwd( 1 ); - return tmp; - } - - //! pre-decrement - _fwd_iterator& operator--() - { - _seekRev( 1 ); - return *this; - } - //! post-decrement - _fwd_iterator operator--( int ) - { - _fwd_iterator tmp( *this ); - _seekRev( 1 ); - return tmp; - } - - //! addition operator - _fwd_iterator operator+( size_type n ) - { - _fwd_iterator tmp( *this ); - tmp._seekFwd( n ); - return tmp; - } - //! addition operator - _fwd_iterator operator+( difference_type n ) - { - _fwd_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekRev( -n ); - else - tmp._seekFwd( n ); - return tmp; - } - //! subtraction operator - _fwd_iterator operator-( size_type n ) - { - _fwd_iterator tmp( *this ); - tmp._seekRev( n ); - return tmp; - } - //! subtraction operator - _fwd_iterator operator-( difference_type n ) - { - _fwd_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekFwd( -n ); - else - tmp._seekRev( n ); - return tmp; - } - - //! addition assignment operator - _fwd_iterator& operator+=( size_type n ) - { - _seekFwd( n ); - return *this; - } - //! addition assignment operator - _fwd_iterator& operator+=( difference_type n ) - { - if ( n < 0 ) - _seekRev( -n ); - else - _seekFwd( n ); - return *this; - } - //! subtraction assignment operator - _fwd_iterator& operator-=( size_type n ) - { - _seekRev( n ); - return *this; - } - //! subtraction assignment operator - _fwd_iterator& operator-=( difference_type n ) - { - if ( n < 0 ) - _seekFwd( -n ); - else - _seekRev( n ); - return *this; - } - - //! dereference operator - value_type& operator*() const - { - return *mIter; - } - - //! dereference at offset operator - value_type& operator[]( size_type n ) const - { - _fwd_iterator tmp( *this ); - tmp += n; - return *tmp; - } - //! dereference at offset operator - value_type& operator[]( difference_type n ) const - { - _fwd_iterator tmp( *this ); - tmp += n; - return *tmp; - } - - //! advances to the next Unicode character, honoring surrogate pairs in the UTF-16 stream - _fwd_iterator& moveNext() - { - _moveNext(); - return *this; - } - //! rewinds to the previous Unicode character, honoring surrogate pairs in the UTF-16 stream - _fwd_iterator& movePrev() - { - _movePrev(); - return *this; - } - //! Returns the Unicode value of the character at the current position (decodes surrogate pairs if needed) - unicode_char getCharacter() const - { - return _getCharacter(); - } - //! Sets the Unicode value of the character at the current position (adding a surrogate pair if needed); returns the amount of string length change caused by the operation - int setCharacter( unicode_char uc ) - { - return _setCharacter( uc ); - } - }; - - - //######################################################################### - //! const forward iterator for UString - class _const_fwd_iterator: public _base_iterator - { /* i don't know why the beautifier is freaking out on this line */ - public: - _const_fwd_iterator() { } - _const_fwd_iterator( const _const_fwd_iterator& i ) - { - _become( i ); - } - _const_fwd_iterator( const _fwd_iterator& i ) - { - _become( i ); - } - - //! pre-increment - _const_fwd_iterator& operator++() - { - _seekFwd( 1 ); - return *this; - } - //! post-increment - _const_fwd_iterator operator++( int ) - { - _const_fwd_iterator tmp( *this ); - _seekFwd( 1 ); - return tmp; - } - - //! pre-decrement - _const_fwd_iterator& operator--() - { - _seekRev( 1 ); - return *this; - } - //! post-decrement - _const_fwd_iterator operator--( int ) - { - _const_fwd_iterator tmp( *this ); - _seekRev( 1 ); - return tmp; - } - - //! addition operator - _const_fwd_iterator operator+( size_type n ) - { - _const_fwd_iterator tmp( *this ); - tmp._seekFwd( n ); - return tmp; - } - //! addition operator - _const_fwd_iterator operator+( difference_type n ) - { - _const_fwd_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekRev( -n ); - else - tmp._seekFwd( n ); - return tmp; - } - //! subtraction operator - _const_fwd_iterator operator-( size_type n ) - { - _const_fwd_iterator tmp( *this ); - tmp._seekRev( n ); - return tmp; - } - //! subtraction operator - _const_fwd_iterator operator-( difference_type n ) - { - _const_fwd_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekFwd( -n ); - else - tmp._seekRev( n ); - return tmp; - } - - //! addition assignment operator - _const_fwd_iterator& operator+=( size_type n ) - { - _seekFwd( n ); - return *this; - } - //! addition assignment operator - _const_fwd_iterator& operator+=( difference_type n ) - { - if ( n < 0 ) - _seekRev( -n ); - else - _seekFwd( n ); - return *this; - } - //! subtraction assignment operator - _const_fwd_iterator& operator-=( size_type n ) - { - _seekRev( n ); - return *this; - } - //! subtraction assignment operator - _const_fwd_iterator& operator-=( difference_type n ) - { - if ( n < 0 ) - _seekFwd( -n ); - else - _seekRev( n ); - return *this; - } - - //! dereference operator - const value_type& operator*() const - { - return *mIter; - } - - //! dereference at offset operator - const value_type& operator[]( size_type n ) const - { - _const_fwd_iterator tmp( *this ); - tmp += n; - return *tmp; - } - //! dereference at offset operator - const value_type& operator[]( difference_type n ) const - { - _const_fwd_iterator tmp( *this ); - tmp += n; - return *tmp; - } - - //! advances to the next Unicode character, honoring surrogate pairs in the UTF-16 stream - _const_fwd_iterator& moveNext() - { - _moveNext(); - return *this; - } - //! rewinds to the previous Unicode character, honoring surrogate pairs in the UTF-16 stream - _const_fwd_iterator& movePrev() - { - _movePrev(); - return *this; - } - //! Returns the Unicode value of the character at the current position (decodes surrogate pairs if needed) - unicode_char getCharacter() const - { - return _getCharacter(); - } - - //! difference operator - friend size_type operator-( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! equality operator - friend bool operator==( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! inequality operator - friend bool operator!=( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! less than - friend bool operator<( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! less than or equal - friend bool operator<=( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! greater than - friend bool operator>( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - //! greater than or equal - friend bool operator>=( const _const_fwd_iterator& left, const _const_fwd_iterator& right ); - - }; - - //######################################################################### - // REVERSE ITERATORS - //######################################################################### - class _const_rev_iterator; // forward declaration - //! forward iterator for UString - class _rev_iterator: public _base_iterator - { /* i don't know why the beautifier is freaking out on this line */ - friend class _const_rev_iterator; - public: - _rev_iterator() { } - _rev_iterator( const _rev_iterator& i ) - { - _become( i ); - } - - //! pre-increment - _rev_iterator& operator++() - { - _seekRev( 1 ); - return *this; - } - //! post-increment - _rev_iterator operator++( int ) - { - _rev_iterator tmp( *this ); - _seekRev( 1 ); - return tmp; - } - - //! pre-decrement - _rev_iterator& operator--() - { - _seekFwd( 1 ); - return *this; - } - //! post-decrement - _rev_iterator operator--( int ) - { - _rev_iterator tmp( *this ); - _seekFwd( 1 ); - return tmp; - } - - //! addition operator - _rev_iterator operator+( size_type n ) - { - _rev_iterator tmp( *this ); - tmp._seekRev( n ); - return tmp; - } - //! addition operator - _rev_iterator operator+( difference_type n ) - { - _rev_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekFwd( -n ); - else - tmp._seekRev( n ); - return tmp; - } - //! subtraction operator - _rev_iterator operator-( size_type n ) - { - _rev_iterator tmp( *this ); - tmp._seekFwd( n ); - return tmp; - } - //! subtraction operator - _rev_iterator operator-( difference_type n ) - { - _rev_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekRev( -n ); - else - tmp._seekFwd( n ); - return tmp; - } - - //! addition assignment operator - _rev_iterator& operator+=( size_type n ) - { - _seekRev( n ); - return *this; - } - //! addition assignment operator - _rev_iterator& operator+=( difference_type n ) - { - if ( n < 0 ) - _seekFwd( -n ); - else - _seekRev( n ); - return *this; - } - //! subtraction assignment operator - _rev_iterator& operator-=( size_type n ) - { - _seekFwd( n ); - return *this; - } - //! subtraction assignment operator - _rev_iterator& operator-=( difference_type n ) - { - if ( n < 0 ) - _seekRev( -n ); - else - _seekFwd( n ); - return *this; - } - - //! dereference operator - value_type& operator*() const - { - return mIter[-1]; - } - - //! dereference at offset operator - value_type& operator[]( size_type n ) const - { - _rev_iterator tmp( *this ); - tmp -= n; - return *tmp; - } - //! dereference at offset operator - value_type& operator[]( difference_type n ) const - { - _rev_iterator tmp( *this ); - tmp -= n; - return *tmp; - } - }; - //######################################################################### - //! const reverse iterator for UString - class _const_rev_iterator: public _base_iterator - { /* i don't know why the beautifier is freaking out on this line */ - public: - _const_rev_iterator() { } - _const_rev_iterator( const _const_rev_iterator& i ) - { - _become( i ); - } - _const_rev_iterator( const _rev_iterator& i ) - { - _become( i ); - } - //! pre-increment - _const_rev_iterator& operator++() - { - _seekRev( 1 ); - return *this; - } - //! post-increment - _const_rev_iterator operator++( int ) - { - _const_rev_iterator tmp( *this ); - _seekRev( 1 ); - return tmp; - } - - //! pre-decrement - _const_rev_iterator& operator--() - { - _seekFwd( 1 ); - return *this; - } - //! post-decrement - _const_rev_iterator operator--( int ) - { - _const_rev_iterator tmp( *this ); - _seekFwd( 1 ); - return tmp; - } - - //! addition operator - _const_rev_iterator operator+( size_type n ) - { - _const_rev_iterator tmp( *this ); - tmp._seekRev( n ); - return tmp; - } - //! addition operator - _const_rev_iterator operator+( difference_type n ) - { - _const_rev_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekFwd( -n ); - else - tmp._seekRev( n ); - return tmp; - } - //! subtraction operator - _const_rev_iterator operator-( size_type n ) - { - _const_rev_iterator tmp( *this ); - tmp._seekFwd( n ); - return tmp; - } - //! subtraction operator - _const_rev_iterator operator-( difference_type n ) - { - _const_rev_iterator tmp( *this ); - if ( n < 0 ) - tmp._seekRev( -n ); - else - tmp._seekFwd( n ); - return tmp; - } - - //! addition assignment operator - _const_rev_iterator& operator+=( size_type n ) - { - _seekRev( n ); - return *this; - } - //! addition assignment operator - _const_rev_iterator& operator+=( difference_type n ) - { - if ( n < 0 ) - _seekFwd( -n ); - else - _seekRev( n ); - return *this; - } - //! subtraction assignment operator - _const_rev_iterator& operator-=( size_type n ) - { - _seekFwd( n ); - return *this; - } - //! subtraction assignment operator - _const_rev_iterator& operator-=( difference_type n ) - { - if ( n < 0 ) - _seekRev( -n ); - else - _seekFwd( n ); - return *this; - } - - //! dereference operator - const value_type& operator*() const - { - return mIter[-1]; - } - - //! dereference at offset operator - const value_type& operator[]( size_type n ) const - { - _const_rev_iterator tmp( *this ); - tmp -= n; - return *tmp; - } - //! dereference at offset operator - const value_type& operator[]( difference_type n ) const - { - _const_rev_iterator tmp( *this ); - tmp -= n; - return *tmp; - } - - //! difference operator - friend size_type operator-( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! equality operator - friend bool operator==( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! inequality operator - friend bool operator!=( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! less than - friend bool operator<( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! less than or equal - friend bool operator<=( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! greater than - friend bool operator>( const _const_rev_iterator& left, const _const_rev_iterator& right ); - //! greater than or equal - friend bool operator>=( const _const_rev_iterator& left, const _const_rev_iterator& right ); - }; - //######################################################################### - - typedef _fwd_iterator iterator; //!< iterator - typedef _rev_iterator reverse_iterator; //!< reverse iterator - typedef _const_fwd_iterator const_iterator; //!< const iterator - typedef _const_rev_iterator const_reverse_iterator; //!< const reverse iterator - - - //!\name Constructors/Destructor - //@{ - //! default constructor, creates an empty string - UString() - { - _init(); - } - //! copy constructor - UString( const UString& copy ) - { - _init(); - mData = copy.mData; - } - //! \a length copies of \a ch - UString( size_type length, const code_point& ch ) - { - _init(); - assign( length, ch ); - } - //! duplicate of nul-terminated sequence \a str - UString( const code_point* str ) - { - _init(); - assign( str ); - } - //! duplicate of \a str, \a length code points long - UString( const code_point* str, size_type length ) - { - _init(); - assign( str, length ); - } - //! substring of \a str starting at \a index and \a length code points long - UString( const UString& str, size_type index, size_type length ) - { - _init(); - assign( str, index, length ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! duplicate of nul-terminated \c wchar_t array - UString( const wchar_t* w_str ) - { - _init(); - assign( w_str ); - } - //! duplicate of \a w_str, \a length characters long - UString( const wchar_t* w_str, size_type length ) - { - _init(); - assign( w_str, length ); - } -#endif - //! duplicate of \a wstr - UString( const std::wstring& wstr ) - { - _init(); - assign( wstr ); - } - //! duplicate of nul-terminated C-string \a c_str (UTF-8 encoding) - UString( const char* c_str ) - { - _init(); - assign( c_str ); - } - //! duplicate of \a c_str, \a length characters long (UTF-8 encoding) - UString( const char* c_str, size_type length ) - { - _init(); - assign( c_str, length ); - } - //! duplicate of \a str (UTF-8 encoding) - UString( const std::string& str ) - { - _init(); - assign( str ); - } - //! destructor - ~UString() - { - _cleanBuffer(); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name Utility functions - //@{ - //! Returns the number of code points in the current string - size_type size() const - { - return mData.size(); - } - //! Returns the number of code points in the current string - size_type length() const - { - return size(); - } - //! Returns the number of Unicode characters in the string - /*! Executes in linear time. */ - size_type length_Characters() const - { - const_iterator i = begin(), ie = end(); - size_type c = 0; - while ( i != ie ) - { - i.moveNext(); - ++c; - } - return c; - } - //! returns the maximum number of UTF-16 code points that the string can hold - size_type max_size() const - { - return mData.max_size(); - } - //! sets the capacity of the string to at least \a size code points - void reserve( size_type size ) - { - mData.reserve( size ); - } - //! changes the size of the string to \a size, filling in any new area with \a val - void resize( size_type num, const code_point& val = 0 ) - { - mData.resize( num, val ); - } - //! exchanges the elements of the current string with those of \a from - void swap( UString& from ) - { - mData.swap( from.mData ); - } - //! returns \c true if the string has no elements, \c false otherwise - bool empty() const - { - return mData.empty(); - } - //! returns a pointer to the first character in the current string - const code_point* c_str() const - { - return mData.c_str(); - } - //! returns a pointer to the first character in the current string - const code_point* data() const - { - return c_str(); - } - //! returns the number of elements that the string can hold before it will need to allocate more space - size_type capacity() const - { - return mData.capacity(); - } - //! deletes all of the elements in the string - void clear() - { - mData.clear(); - } - //! returns a substring of the current string, starting at \a index, and \a num characters long. - /*! If \a num is omitted, it will default to \c UString::npos, and the substr() function will simply return the remainder of the string starting at \a index. */ - UString substr( size_type index, size_type num = npos ) const - { - // this could avoid the extra copy if we used a private specialty constructor - dstring data = mData.substr( index, num ); - UString tmp; - tmp.mData.swap( data ); - return tmp; - } - //! appends \a val to the end of the string - void push_back( unicode_char val ) - { - code_point cp[2]; - size_t c = _utf32_to_utf16( val, cp ); - if ( c > 0 ) push_back( cp[0] ); - if ( c > 1 ) push_back( cp[1] ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! appends \a val to the end of the string - void push_back( wchar_t val ) - { - // we do this because the Unicode method still preserves UTF-16 code points - mData.push_back( static_cast( val ) ); - } -#endif - //! appends \a val to the end of the string - /*! This can be used to push surrogate pair code points, you'll just need to push them - one after the other. */ - void push_back( code_point val ) - { - mData.push_back( val ); - } - //! appends \a val to the end of the string - /*! Limited to characters under the 127 value barrier. */ - void push_back( char val ) - { - mData.push_back( static_cast( val ) ); - } - //! returns \c true if the given Unicode character \a ch is in this string - bool inString( unicode_char ch ) const - { - const_iterator i, ie = end(); - for ( i = begin(); i != ie; i.moveNext() ) - { - if ( i.getCharacter() == ch ) - return true; - } - return false; - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name Stream variations - //@{ - //! returns the current string in UTF-8 form within a std::string - const std::string& asUTF8() const - { - _load_buffer_UTF8(); - return *m_buffer.mStrBuffer; - } - //! returns the current string in UTF-8 form as a nul-terminated char array - const char* asUTF8_c_str() const - { - _load_buffer_UTF8(); - return m_buffer.mStrBuffer->c_str(); - } - //! returns the current string in UTF-32 form within a utf32string - const utf32string& asUTF32() const - { - _load_buffer_UTF32(); - return *m_buffer.mUTF32StrBuffer; - } - //! returns the current string in UTF-32 form as a nul-terminated unicode_char array - const unicode_char* asUTF32_c_str() const - { - _load_buffer_UTF32(); - return m_buffer.mUTF32StrBuffer->c_str(); - } - //! returns the current string in the native form of std::wstring - const std::wstring& asWStr() const - { - _load_buffer_WStr(); - return *m_buffer.mWStrBuffer; - } - //! returns the current string in the native form of a nul-terminated wchar_t array - const wchar_t* asWStr_c_str() const - { - _load_buffer_WStr(); - return m_buffer.mWStrBuffer->c_str(); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name Single Character Access - //@{ - //! returns a reference to the element in the string at index \c loc - code_point& at( size_type loc ) - { - return mData.at( loc ); - } - //! returns a reference to the element in the string at index \c loc - const code_point& at( size_type loc ) const - { - return mData.at( loc ); - } - //! returns the data point \a loc evaluated as a UTF-32 value - /*! This function will will only properly decode surrogate pairs when \a loc points to the index - of a lead code point that is followed by a trailing code point. Evaluating the trailing code point - itself, or pointing to a code point that is a sentinel value (part of a broken pair) will return - the value of just that code point (not a valid Unicode value, but useful as a sentinel value). */ - unicode_char getChar( size_type loc ) const - { - const code_point* ptr = c_str(); - unicode_char uc; - size_t len = _utf16_char_length( ptr[loc] ); - code_point cp[2] = { /* blame the code beautifier */ 0, 0 }; - cp[0] = ptr[loc]; - - if ( len == 2 && ( loc + 1 ) < mData.length() ) - { - cp[1] = ptr[loc+1]; - } - _utf16_to_utf32( cp, uc ); - return uc; - } - //! sets the value of the character at \a loc to the Unicode value \a ch (UTF-32) - /*! Providing sentinel values (values between U+D800-U+DFFF) are accepted, but you should be aware - that you can also unwittingly create a valid surrogate pair if you don't pay attention to what you - are doing. \note This operation may also lengthen the string if a surrogate pair is needed to - represent the value given, but one is not available to replace; or alternatively shorten the string - if an existing surrogate pair is replaced with a character that is representable without a surrogate - pair. The return value will signify any lengthening or shortening performed, returning 0 if no change - was made, -1 if the string was shortened, or 1 if the string was lengthened. Any single call can - only change the string length by + or - 1. */ - int setChar( size_type loc, unicode_char ch ) - { - code_point cp[2] = { /* blame the code beautifier */ 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - unicode_char existingChar = getChar( loc ); - size_t existingSize = _utf16_char_length( existingChar ); - size_t newSize = _utf16_char_length( ch ); - - if ( newSize > existingSize ) - { - at( loc ) = cp[0]; - insert( loc + 1, 1, cp[1] ); - return 1; - } - if ( newSize < existingSize ) - { - erase( loc, 1 ); - at( loc ) = cp[0]; - return -1; - } - - // newSize == existingSize - at( loc ) = cp[0]; - if ( lc == 2 ) at( loc + 1 ) = cp[1]; - return 0; - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name iterator acquisition - //@{ - //! returns an iterator to the first element of the string - iterator begin() - { - iterator i; - i.mIter = mData.begin(); - i.mString = this; - return i; - } - //! returns an iterator to the first element of the string - const_iterator begin() const - { - const_iterator i; - i.mIter = const_cast( this )->mData.begin(); - i.mString = const_cast( this ); - return i; - } - //! returns an iterator just past the end of the string - iterator end() - { - iterator i; - i.mIter = mData.end(); - i.mString = this; - return i; - } - //! returns an iterator just past the end of the string - const_iterator end() const - { - const_iterator i; - i.mIter = const_cast( this )->mData.end(); - i.mString = const_cast( this ); - return i; - } - //! returns a reverse iterator to the last element of the string - reverse_iterator rbegin() - { - reverse_iterator i; - i.mIter = mData.end(); - i.mString = this; - return i; - } - //! returns a reverse iterator to the last element of the string - const_reverse_iterator rbegin() const - { - const_reverse_iterator i; - i.mIter = const_cast( this )->mData.end(); - i.mString = const_cast( this ); - return i; - } - //! returns a reverse iterator just past the beginning of the string - reverse_iterator rend() - { - reverse_iterator i; - i.mIter = mData.begin(); - i.mString = this; - return i; - } - //! returns a reverse iterator just past the beginning of the string - const_reverse_iterator rend() const - { - const_reverse_iterator i; - i.mIter = const_cast( this )->mData.begin(); - i.mString = const_cast( this ); - return i; - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name assign - //@{ - //! gives the current string the values from \a start to \a end - UString& assign( iterator start, iterator end ) - { - mData.assign( start.mIter, end.mIter ); - return *this; - } - //! assign \a str to the current string - UString& assign( const UString& str ) - { - mData.assign( str.mData ); - return *this; - } - //! assign the nul-terminated \a str to the current string - UString& assign( const code_point* str ) - { - mData.assign( str ); - return *this; - } - //! assign the first \a num characters of \a str to the current string - UString& assign( const code_point* str, size_type num ) - { - mData.assign( str, num ); - return *this; - } - //! assign \a len entries from \a str to the current string, starting at \a index - UString& assign( const UString& str, size_type index, size_type len ) - { - mData.assign( str.mData, index, len ); - return *this; - } - //! assign \a num copies of \a ch to the current string - UString& assign( size_type num, const code_point& ch ) - { - mData.assign( num, ch ); - return *this; - } - //! assign \a wstr to the current string (\a wstr is treated as a UTF-16 stream) - UString& assign( const std::wstring& wstr ) - { - mData.clear(); - mData.reserve( wstr.length() ); // best guess bulk allocate -#ifdef WCHAR_UTF16 // if we're already working in UTF-16, this is easy - code_point tmp; - std::wstring::const_iterator i, ie = wstr.end(); - for ( i = wstr.begin(); i != ie; ++i ) - { - tmp = static_cast( *i ); - mData.push_back( tmp ); - } -#else // otherwise we do it the safe way (which is still 100% safe to pass UTF-16 through, just slower) - code_point cp[3] = { 0, 0, 0 }; - unicode_char tmp; - std::wstring::const_iterator i, ie = wstr.end(); - for ( i = wstr.begin(); i != ie; i++ ) - { - tmp = static_cast( *i ); - size_t lc = _utf32_to_utf16( tmp, cp ); - if ( lc > 0 ) mData.push_back( cp[0] ); - if ( lc > 1 ) mData.push_back( cp[1] ); - } -#endif - return *this; - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! assign \a w_str to the current string - UString& assign( const wchar_t* w_str ) - { - std::wstring tmp; - tmp.assign( w_str ); - return assign( tmp ); - } - //! assign the first \a num characters of \a w_str to the current string - UString& assign( const wchar_t* w_str, size_type num ) - { - std::wstring tmp; - tmp.assign( w_str, num ); - return assign( tmp ); - } -#endif - //! assign \a str to the current string (\a str is treated as a UTF-8 stream) - UString& assign( const std::string& str ) - { - size_type len = _verifyUTF8( str ); - clear(); // empty our contents, if there are any - reserve( len ); // best guess bulk capacity growth - - // This is a 3 step process, converting each byte in the UTF-8 stream to UTF-32, - // then converting it to UTF-16, then finally appending the data buffer - - unicode_char uc; // temporary Unicode character buffer - unsigned char utf8buf[7]; // temporary UTF-8 buffer - utf8buf[6] = 0; - size_t utf8len; // UTF-8 length - code_point utf16buff[3]; // temporary UTF-16 buffer - utf16buff[2] = 0; - size_t utf16len; // UTF-16 length - - std::string::const_iterator i, ie = str.end(); - for ( i = str.begin(); i != ie; ++i ) - { - utf8len = _utf8_char_length( static_cast( *i ) ); // estimate bytes to load - for ( size_t j = 0; j < utf8len; j++ ) - { // load the needed UTF-8 bytes - utf8buf[j] = ( static_cast( *( i + j ) ) ); // we don't increment 'i' here just in case the estimate is wrong (shouldn't happen, but we're being careful) - } - utf8buf[utf8len] = 0; // nul terminate so we throw an exception before running off the end of the buffer - utf8len = _utf8_to_utf32( utf8buf, uc ); // do the UTF-8 -> UTF-32 conversion - i += utf8len - 1; // we subtract 1 for the increment of the 'for' loop - - utf16len = _utf32_to_utf16( uc, utf16buff ); // UTF-32 -> UTF-16 conversion - append( utf16buff, utf16len ); // append the characters to the string - } - return *this; - } - //! assign \a c_str to the current string (\a c_str is treated as a UTF-8 stream) - UString& assign( const char* c_str ) - { - std::string tmp( c_str ); - return assign( tmp ); - } - //! assign the first \a num characters of \a c_str to the current string (\a c_str is treated as a UTF-8 stream) - UString& assign( const char* c_str, size_type num ) - { - std::string tmp; - tmp.assign( c_str, num ); - return assign( tmp ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name append - //@{ - //! appends \a str on to the end of the current string - UString& append( const UString& str ) - { - mData.append( str.mData ); - return *this; - } - //! appends \a str on to the end of the current string - UString& append( const code_point* str ) - { - mData.append( str ); - return *this; - } - //! appends a substring of \a str starting at \a index that is \a len characters long on to the end of the current string - UString& append( const UString& str, size_type index, size_type len ) - { - mData.append( str.mData, index, len ); - return *this; - } - //! appends \a num characters of \a str on to the end of the current string - UString& append( const code_point* str, size_type num ) - { - mData.append( str, num ); - return *this; - } - //! appends \a num repetitions of \a ch on to the end of the current string - UString& append( size_type num, code_point ch ) - { - mData.append( num, ch ); - return *this; - } - //! appends the sequence denoted by \a start and \a end on to the end of the current string - UString& append( iterator start, iterator end ) - { - mData.append( start.mIter, end.mIter ); - return *this; - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! appends \a num characters of \a str on to the end of the current string - UString& append( const wchar_t* w_str, size_type num ) - { - std::wstring tmp( w_str, num ); - return append( tmp ); - } - //! appends \a num repetitions of \a ch on to the end of the current string - UString& append( size_type num, wchar_t ch ) - { - return append( num, static_cast( ch ) ); - } -#endif - //! appends \a num characters of \a str on to the end of the current string (UTF-8 encoding) - UString& append( const char* c_str, size_type num ) - { - UString tmp( c_str, num ); - append( tmp ); - return *this; - } - //! appends \a num repetitions of \a ch on to the end of the current string (Unicode values less than 128) - UString& append( size_type num, char ch ) - { - append( num, static_cast( ch ) ); - return *this; - } - //! appends \a num repetitions of \a ch on to the end of the current string (Full Unicode spectrum) - UString& append( size_type num, unicode_char ch ) - { - code_point cp[2] = { 0, 0 }; - if ( _utf32_to_utf16( ch, cp ) == 2 ) - { - for ( size_type i = 0; i < num; i++ ) - { - append( 1, cp[0] ); - append( 1, cp[1] ); - } - } - else - { - for ( size_type i = 0; i < num; i++ ) - { - append( 1, cp[0] ); - } - } - return *this; - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name insert - //@{ - //! inserts \a ch before the code point denoted by \a i - iterator insert( iterator i, const code_point& ch ) - { - iterator ret; - ret.mIter = mData.insert( i.mIter, ch ); - ret.mString = this; - return ret; - } - //! inserts \a str into the current string, at location \a index - UString& insert( size_type index, const UString& str ) - { - mData.insert( index, str.mData ); - return *this; - } - //! inserts \a str into the current string, at location \a index - UString& insert( size_type index, const code_point* str ) - { - mData.insert( index, str ); - return *this; - } - //! inserts a substring of \a str (starting at \a index2 and \a num code points long) into the current string, at location \a index1 - UString& insert( size_type index1, const UString& str, size_type index2, size_type num ) - { - mData.insert( index1, str.mData, index2, num ); - return *this; - } - //! inserts the code points denoted by \a start and \a end into the current string, before the code point specified by \a i - void insert( iterator i, iterator start, iterator end ) - { - mData.insert( i.mIter, start.mIter, end.mIter ); - } - //! inserts \a num code points of \a str into the current string, at location \a index - UString& insert( size_type index, const code_point* str, size_type num ) - { - mData.insert( index, str, num ); - return *this; - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! inserts \a num code points of \a str into the current string, at location \a index - UString& insert( size_type index, const wchar_t* w_str, size_type num ) - { - UString tmp( w_str, num ); - insert( index, tmp ); - return *this; - } -#endif - //! inserts \a num code points of \a str into the current string, at location \a index - UString& insert( size_type index, const char* c_str, size_type num ) - { - UString tmp( c_str, num ); - insert( index, tmp ); - return *this; - } - //! inserts \a num copies of \a ch into the current string, at location \a index - UString& insert( size_type index, size_type num, code_point ch ) - { - mData.insert( index, num, ch ); - return *this; - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! inserts \a num copies of \a ch into the current string, at location \a index - UString& insert( size_type index, size_type num, wchar_t ch ) - { - insert( index, num, static_cast( ch ) ); - return *this; - } -#endif - //! inserts \a num copies of \a ch into the current string, at location \a index - UString& insert( size_type index, size_type num, char ch ) - { - insert( index, num, static_cast( ch ) ); - return *this; - } - //! inserts \a num copies of \a ch into the current string, at location \a index - UString& insert( size_type index, size_type num, unicode_char ch ) - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - if ( lc == 1 ) - { - return insert( index, num, cp[0] ); - } - for ( size_type c = 0; c < num; c++ ) - { - // insert in reverse order to preserve ordering after insert - insert( index, 1, cp[1] ); - insert( index, 1, cp[0] ); - } - return *this; - } - //! inserts \a num copies of \a ch into the current string, before the code point denoted by \a i - void insert( iterator i, size_type num, const code_point& ch ) - { - mData.insert( i.mIter, num, ch ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! inserts \a num copies of \a ch into the current string, before the code point denoted by \a i - void insert( iterator i, size_type num, const wchar_t& ch ) - { - insert( i, num, static_cast( ch ) ); - } -#endif - //! inserts \a num copies of \a ch into the current string, before the code point denoted by \a i - void insert( iterator i, size_type num, const char& ch ) - { - insert( i, num, static_cast( ch ) ); - } - //! inserts \a num copies of \a ch into the current string, before the code point denoted by \a i - void insert( iterator i, size_type num, const unicode_char& ch ) - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - if ( lc == 1 ) - { - insert( i, num, cp[0] ); - } - else - { - for ( size_type c = 0; c < num; c++ ) - { - // insert in reverse order to preserve ordering after insert - insert( i, 1, cp[1] ); - insert( i, 1, cp[0] ); - } - } - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name erase - //@{ - //! removes the code point pointed to by \a loc, returning an iterator to the next character - iterator erase( iterator loc ) - { - iterator ret; - ret.mIter = mData.erase( loc.mIter ); - ret.mString = this; - return ret; - } - //! removes the code points between \a start and \a end (including the one at \a start but not the one at \a end), returning an iterator to the code point after the last code point removed - iterator erase( iterator start, iterator end ) - { - iterator ret; - ret.mIter = mData.erase( start.mIter, end.mIter ); - ret.mString = this; - return ret; - } - //! removes \a num code points from the current string, starting at \a index - UString& erase( size_type index = 0, size_type num = npos ) - { - if ( num == npos ) - mData.erase( index ); - else - mData.erase( index, num ); - return *this; - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name replace - //@{ - //! replaces up to \a num1 code points of the current string (starting at \a index1) with \a str - UString& replace( size_type index1, size_type num1, const UString& str ) - { - mData.replace( index1, num1, str.mData, 0, npos ); - return *this; - } - //! replaces up to \a num1 code points of the current string (starting at \a index1) with up to \a num2 code points from \a str - UString& replace( size_type index1, size_type num1, const UString& str, size_type num2 ) - { - mData.replace( index1, num1, str.mData, 0, num2 ); - return *this; - } - //! replaces up to \a num1 code points of the current string (starting at \a index1) with up to \a num2 code points from \a str beginning at \a index2 - UString& replace( size_type index1, size_type num1, const UString& str, size_type index2, size_type num2 ) - { - mData.replace( index1, num1, str.mData, index2, num2 ); - return *this; - } - //! replaces code points in the current string from \a start to \a end with \a num code points from \a str - UString& replace( iterator start, iterator end, const UString& str, size_type num = npos ) - { - _const_fwd_iterator st(start); //Work around for gcc, allow it to find correct overload - - size_type index1 = begin() - st; - size_type num1 = end - st; - return replace( index1, num1, str, 0, num ); - } - //! replaces up to \a num1 code points in the current string (beginning at \a index) with \c num2 copies of \c ch - UString& replace( size_type index, size_type num1, size_type num2, code_point ch ) - { - mData.replace( index, num1, num2, ch ); - return *this; - } - //! replaces the code points in the current string from \a start to \a end with \a num copies of \a ch - UString& replace( iterator start, iterator end, size_type num, code_point ch ) - { - _const_fwd_iterator st(start); //Work around for gcc, allow it to find correct overload - - size_type index1 = begin() - st; - size_type num1 = end - st; - return replace( index1, num1, num, ch ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name compare - //@{ - //! compare \a str to the current string - int compare( const UString& str ) const - { - return mData.compare( str.mData ); - } - //! compare \a str to the current string - int compare( const code_point* str ) const - { - return mData.compare( str ); - } - //! compare \a str to a substring of the current string, starting at \a index for \a length characters - int compare( size_type index, size_type length, const UString& str ) const - { - return mData.compare( index, length, str.mData ); - } - //! compare a substring of \a str to a substring of the current string, where \a index2 and \a length2 refer to \a str and \a index and \a length refer to the current string - int compare( size_type index, size_type length, const UString& str, size_type index2, size_type length2 ) const - { - return mData.compare( index, length, str.mData, index2, length2 ); - } - //! compare a substring of \a str to a substring of the current string, where the substring of \a str begins at zero and is \a length2 characters long, and the substring of the current string begins at \a index and is \a length characters long - int compare( size_type index, size_type length, const code_point* str, size_type length2 ) const - { - return mData.compare( index, length, str, length2 ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! compare a substring of \a str to a substring of the current string, where the substring of \a str begins at zero and is \a length2 elements long, and the substring of the current string begins at \a index and is \a length characters long - int compare( size_type index, size_type length, const wchar_t* w_str, size_type length2 ) const - { - UString tmp( w_str, length2 ); - return compare( index, length, tmp ); - } -#endif - //! compare a substring of \a str to a substring of the current string, where the substring of \a str begins at zero and is \a length2 UTF-8 code points long, and the substring of the current string begins at \a index and is \a length characters long - int compare( size_type index, size_type length, const char* c_str, size_type length2 ) const - { - UString tmp( c_str, length2 ); - return compare( index, length, tmp ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name find & rfind - //@{ - //! returns the index of the first occurrence of \a str within the current string, starting at \a index; returns \c UString::npos if nothing is found - /*! \a str is a UTF-16 encoded string, but through implicit casting can also be a UTF-8 encoded string (const char* or std::string) */ - size_type find( const UString& str, size_type index = 0 ) const - { - return mData.find( str.c_str(), index ); - } - //! returns the index of the first occurrence of \a str within the current string and within \a length code points, starting at \a index; returns \c UString::npos if nothing is found - /*! \a cp_str is a UTF-16 encoded string */ - size_type find( const code_point* cp_str, size_type index, size_type length ) const - { - UString tmp( cp_str ); - return mData.find( tmp.c_str(), index, length ); - } - //! returns the index of the first occurrence of \a str within the current string and within \a length code points, starting at \a index; returns \c UString::npos if nothing is found - /*! \a cp_str is a UTF-8 encoded string */ - size_type find( const char* c_str, size_type index, size_type length ) const - { - UString tmp( c_str ); - return mData.find( tmp.c_str(), index, length ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the first occurrence of \a str within the current string and within \a length code points, starting at \a index; returns \c UString::npos if nothing is found - /*! \a cp_str is a UTF-16 encoded string */ - size_type find( const wchar_t* w_str, size_type index, size_type length ) const - { - UString tmp( w_str ); - return mData.find( tmp.c_str(), index, length ); - } -#endif - //! returns the index of the first occurrence \a ch within the current string, starting at \a index; returns \c UString::npos if nothing is found - /*! \a ch is only capable of representing Unicode values up to U+007F (127) */ - size_type find( char ch, size_type index = 0 ) const - { - return find( static_cast( ch ), index ); - } - //! returns the index of the first occurrence \a ch within the current string, starting at \a index; returns \c UString::npos if nothing is found - /*! \a ch is only capable of representing Unicode values up to U+FFFF (65535) */ - size_type find( code_point ch, size_type index = 0 ) const - { - return mData.find( ch, index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the first occurrence \a ch within the current string, starting at \a index; returns \c UString::npos if nothing is found - /*! \a ch is only capable of representing Unicode values up to U+FFFF (65535) */ - size_type find( wchar_t ch, size_type index = 0 ) const - { - return find( static_cast( ch ), index ); - } -#endif - //! returns the index of the first occurrence \a ch within the current string, starting at \a index; returns \c UString::npos if nothing is found - /*! \a ch can fully represent any Unicode character */ - size_type find( unicode_char ch, size_type index = 0 ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return find( UString( cp, lc ), index ); - } - - //! returns the location of the first occurrence of \a str in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type rfind( const UString& str, size_type index = 0 ) const - { - return mData.rfind( str.c_str(), index ); - } - //! returns the location of the first occurrence of \a str in the current string, doing a reverse search from \a index, searching at most \a num characters; returns \c UString::npos if nothing is found - size_type rfind( const code_point* cp_str, size_type index, size_type num ) const - { - UString tmp( cp_str ); - return mData.rfind( tmp.c_str(), index, num ); - } - //! returns the location of the first occurrence of \a str in the current string, doing a reverse search from \a index, searching at most \a num characters; returns \c UString::npos if nothing is found - size_type rfind( const char* c_str, size_type index, size_type num ) const - { - UString tmp( c_str ); - return mData.rfind( tmp.c_str(), index, num ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the location of the first occurrence of \a str in the current string, doing a reverse search from \a index, searching at most \a num characters; returns \c UString::npos if nothing is found - size_type rfind( const wchar_t* w_str, size_type index, size_type num ) const - { - UString tmp( w_str ); - return mData.rfind( tmp.c_str(), index, num ); - } -#endif - //! returns the location of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type rfind( char ch, size_type index = 0 ) const - { - return rfind( static_cast( ch ), index ); - } - //! returns the location of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type rfind( code_point ch, size_type index ) const - { - return mData.rfind( ch, index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the location of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type rfind( wchar_t ch, size_type index = 0 ) const - { - return rfind( static_cast( ch ), index ); - } -#endif - //! returns the location of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type rfind( unicode_char ch, size_type index = 0 ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return rfind( UString( cp, lc ), index ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name find_first/last_(not)_of - //@{ - //! Returns the index of the first character within the current string that matches \b any character in \a str, beginning the search at \a index and searching at most \a num characters; returns \c UString::npos if nothing is found - size_type find_first_of( const UString &str, size_type index = 0, size_type num = npos ) const - { - size_type i = 0; - const size_type len = length(); - while ( i < num && ( index + i ) < len ) - { - unicode_char ch = getChar( index + i ); - if ( str.inString( ch ) ) - return index + i; - i += _utf16_char_length( ch ); // increment by the Unicode character length - } - return npos; - } - //! returns the index of the first occurrence of \a ch in the current string, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_of( code_point ch, size_type index = 0 ) const - { - UString tmp; - tmp.assign( 1, ch ); - return find_first_of( tmp, index ); - } - //! returns the index of the first occurrence of \a ch in the current string, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_of( char ch, size_type index = 0 ) const - { - return find_first_of( static_cast( ch ), index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the first occurrence of \a ch in the current string, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_of( wchar_t ch, size_type index = 0 ) const - { - return find_first_of( static_cast( ch ), index ); - } -#endif - //! returns the index of the first occurrence of \a ch in the current string, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_of( unicode_char ch, size_type index = 0 ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return find_first_of( UString( cp, lc ), index ); - } - - //! returns the index of the first character within the current string that does not match any character in \a str, beginning the search at \a index and searching at most \a num characters; returns \c UString::npos if nothing is found - size_type find_first_not_of( const UString& str, size_type index = 0, size_type num = npos ) const - { - size_type i = 0; - const size_type len = length(); - while ( i < num && ( index + i ) < len ) - { - unicode_char ch = getChar( index + i ); - if ( !str.inString( ch ) ) - return index + i; - i += _utf16_char_length( ch ); // increment by the Unicode character length - } - return npos; - } - //! returns the index of the first character within the current string that does not match \a ch, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_not_of( code_point ch, size_type index = 0 ) const - { - UString tmp; - tmp.assign( 1, ch ); - return find_first_not_of( tmp, index ); - } - //! returns the index of the first character within the current string that does not match \a ch, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_not_of( char ch, size_type index = 0 ) const - { - return find_first_not_of( static_cast( ch ), index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the first character within the current string that does not match \a ch, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_not_of( wchar_t ch, size_type index = 0 ) const - { - return find_first_not_of( static_cast( ch ), index ); - } -#endif - //! returns the index of the first character within the current string that does not match \a ch, starting the search at \a index; returns \c UString::npos if nothing is found - size_type find_first_not_of( unicode_char ch, size_type index = 0 ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return find_first_not_of( UString( cp, lc ), index ); - } - - //! returns the index of the first character within the current string that matches any character in \a str, doing a reverse search from \a index and searching at most \a num characters; returns \c UString::npos if nothing is found - size_type find_last_of( const UString& str, size_type index = npos, size_type num = npos ) const - { - size_type i = 0; - const size_type len = length(); - if ( index > len ) index = len - 1; - - while ( i < num && ( index - i ) != npos ) - { - size_type j = index - i; - // careful to step full Unicode characters - if ( j != 0 && _utf16_surrogate_follow( at( j ) ) && _utf16_surrogate_lead( at( j - 1 ) ) ) - { - j = index - ++i; - } - // and back to the usual dull test - unicode_char ch = getChar( j ); - if ( str.inString( ch ) ) - return j; - i++; - } - return npos; - } - //! returns the index of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_of( code_point ch, size_type index = npos ) const - { - UString tmp; - tmp.assign( 1, ch ); - return find_last_of( tmp, index ); - } - //! returns the index of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_of( char ch, size_type index = npos ) const - { - return find_last_of( static_cast( ch ), index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_of( wchar_t ch, size_type index = npos ) const - { - return find_last_of( static_cast( ch ), index ); - } -#endif - //! returns the index of the first occurrence of \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_of( unicode_char ch, size_type index = npos ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return find_last_of( UString( cp, lc ), index ); - } - - //! returns the index of the last character within the current string that does not match any character in \a str, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_not_of( const UString& str, size_type index = npos, size_type num = npos ) const - { - size_type i = 0; - const size_type len = length(); - if ( index > len ) index = len - 1; - - while ( i < num && ( index - i ) != npos ) - { - size_type j = index - i; - // careful to step full Unicode characters - if ( j != 0 && _utf16_surrogate_follow( at( j ) ) && _utf16_surrogate_lead( at( j - 1 ) ) ) - { - j = index - ++i; - } - // and back to the usual dull test - unicode_char ch = getChar( j ); - if ( !str.inString( ch ) ) - return j; - i++; - } - return npos; - } - //! returns the index of the last occurrence of a character that does not match \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_not_of( code_point ch, size_type index = npos ) const - { - UString tmp; - tmp.assign( 1, ch ); - return find_last_not_of( tmp, index ); - } - //! returns the index of the last occurrence of a character that does not match \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_not_of( char ch, size_type index = npos ) const - { - return find_last_not_of( static_cast( ch ), index ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! returns the index of the last occurrence of a character that does not match \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_not_of( wchar_t ch, size_type index = npos ) const - { - return find_last_not_of( static_cast( ch ), index ); - } -#endif - //! returns the index of the last occurrence of a character that does not match \a ch in the current string, doing a reverse search from \a index; returns \c UString::npos if nothing is found - size_type find_last_not_of( unicode_char ch, size_type index = npos ) const - { - code_point cp[3] = { 0, 0, 0 }; - size_t lc = _utf32_to_utf16( ch, cp ); - return find_last_not_of( UString( cp, lc ), index ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name Operators - //@{ - //! less than operator - bool operator<( const UString& right ) const - { - return compare( right ) < 0; - } - //! less than or equal operator - bool operator<=( const UString& right ) const - { - return compare( right ) <= 0; - } - //! greater than operator - bool operator>( const UString& right ) const - { - return compare( right ) > 0; - } - //! greater than or equal operator - bool operator>=( const UString& right ) const - { - return compare( right ) >= 0; - } - //! equality operator - bool operator==( const UString& right ) const - { - return compare( right ) == 0; - } - //! inequality operator - bool operator!=( const UString& right ) const - { - return !operator==( right ); - } - //! assignment operator, implicitly casts all compatible types - UString& operator=( const UString& s ) - { - return assign( s ); - } - //! assignment operator - UString& operator=( code_point ch ) - { - clear(); - return append( 1, ch ); - } - //! assignment operator - UString& operator=( char ch ) - { - clear(); - return append( 1, ch ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! assignment operator - UString& operator=( wchar_t ch ) - { - clear(); - return append( 1, ch ); - } -#endif - //! assignment operator - UString& operator=( unicode_char ch ) - { - clear(); - return append( 1, ch ); - } - //! code point dereference operator - code_point& operator[]( size_type index ) - { - return at( index ); - } - //! code point dereference operator - const code_point& operator[]( size_type index ) const - { - return at( index ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name Implicit Cast Operators - //@{ - //! implicit cast to std::string - operator std::string() const - { - return std::string( asUTF8() ); - } - //! implicit cast to std::wstring - operator std::wstring() const - { - return std::wstring( asWStr() ); - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name UTF-16 character encoding/decoding - //@{ - //! returns \c true if \a cp does not match the signature for the lead of follow code point of a surrogate pair in a UTF-16 sequence - static bool _utf16_independent_char( code_point cp ) - { - if ( 0xD800 <= cp && cp <= 0xDFFF ) // tests if the cp is within the surrogate pair range - return false; // it matches a surrogate pair signature - return true; // everything else is a standalone code point - } - //! returns \c true if \a cp matches the signature of a surrogate pair lead character - static bool _utf16_surrogate_lead( code_point cp ) - { - if ( 0xD800 <= cp && cp <= 0xDBFF ) // tests if the cp is within the 2nd word of a surrogate pair - return true; // it is a 1st word - return false; // it isn't - } - //! returns \c true if \a cp matches the signature of a surrogate pair following character - static bool _utf16_surrogate_follow( code_point cp ) - { - if ( 0xDC00 <= cp && cp <= 0xDFFF ) // tests if the cp is within the 2nd word of a surrogate pair - return true; // it is a 2nd word - return false; // everything else isn't - } - //! estimates the number of UTF-16 code points in the sequence starting with \a cp - static size_t _utf16_char_length( code_point cp ) - { - if ( 0xD800 <= cp && cp <= 0xDBFF ) // test if cp is the beginning of a surrogate pair - return 2; // if it is, then we are 2 words long - return 1; // otherwise we are only 1 word long - } - //! returns the number of UTF-16 code points needed to represent the given UTF-32 character \a cp - static size_t _utf16_char_length( unicode_char uc ) - { - if ( uc > 0xFFFF ) // test if uc is greater than the single word maximum - return 2; // if so, we need a surrogate pair - return 1; // otherwise we can stuff it into a single word - } - //! converts the given UTF-16 character buffer \a in_cp to a single UTF-32 Unicode character \a out_uc, returns the number of code points used to create the output character (2 for surrogate pairs, otherwise 1) - /*! This function does it's best to prevent error conditions, verifying complete - surrogate pairs before applying the algorithm. In the event that half of a pair - is found it will happily generate a value in the 0xD800 - 0xDFFF range, which is - normally an invalid Unicode value but we preserve them for use as sentinel values. */ - static size_t _utf16_to_utf32( const code_point in_cp[2], unicode_char& out_uc ) - { - const code_point& cp1 = in_cp[0]; - const code_point& cp2 = in_cp[1]; - bool wordPair = false; - - // does it look like a surrogate pair? - if ( 0xD800 <= cp1 && cp1 <= 0xDBFF ) - { - // looks like one, but does the other half match the algorithm as well? - if ( 0xDC00 <= cp2 && cp2 <= 0xDFFF ) - wordPair = true; // yep! - } - - if ( !wordPair ) - { // if we aren't a 100% authentic surrogate pair, then just copy the value - out_uc = cp1; - return 1; - } - - unsigned short cU = cp1, cL = cp2; // copy upper and lower words of surrogate pair to writable buffers - cU -= 0xD800; // remove the encoding markers - cL -= 0xDC00; - - out_uc = ( cU & 0x03FF ) << 10; // grab the 10 upper bits and set them in their proper location - out_uc |= ( cL & 0x03FF ); // combine in the lower 10 bits - out_uc += 0x10000; // add back in the value offset - - return 2; // this whole operation takes to words, so that's what we'll return - } - //! writes the given UTF-32 \a uc_in to the buffer location \a out_cp using UTF-16 encoding, returns the number of code points used to encode the input (always 1 or 2) - /*! This function, like its counterpart, will happily create invalid UTF-16 surrogate pairs. These - invalid entries will be created for any value of \c in_uc that falls in the range U+D800 - U+DFFF. - These are generally useful as sentinel values to represent various program specific conditions. - \note This function will also pass through any single UTF-16 code point without modification, - making it a safe method of ensuring a stream that is unknown UTF-32 or UTF-16 is truly UTF-16.*/ - static size_t _utf32_to_utf16( const unicode_char& in_uc, code_point out_cp[2] ) - { - if ( in_uc <= 0xFFFF ) - { // we blindly preserve sentinel values because our decoder understands them - out_cp[0] = in_uc; - return 1; - } - unicode_char uc = in_uc; // copy to writable buffer - unsigned short tmp; // single code point buffer - uc -= 0x10000; // subtract value offset - - //process upper word - tmp = ( uc >> 10 ) & 0x03FF; // grab the upper 10 bits - tmp += 0xD800; // add encoding offset - out_cp[0] = tmp; // write - - // process lower word - tmp = uc & 0x03FF; // grab the lower 10 bits - tmp += 0xDC00; // add encoding offset - out_cp[1] = tmp; // write - - return 2; // return used word count (2 for surrogate pairs) - } - //@} - - ////////////////////////////////////////////////////////////////////////// - - //!\name UTF-8 character encoding/decoding - //@{ - //! returns \c true if \a cp is the beginning of a UTF-8 sequence - static bool _utf8_start_char( unsigned char cp ) - { - return ( cp & ~_cont_mask ) != _cont; - } - //! estimates the number of UTF-8 code points in the sequence starting with \a cp - static size_t _utf8_char_length( unsigned char cp ) - { - if ( !( cp & 0x80 ) ) return 1; - if (( cp & ~_lead1_mask ) == _lead1 ) return 2; - if (( cp & ~_lead2_mask ) == _lead2 ) return 3; - if (( cp & ~_lead3_mask ) == _lead3 ) return 4; - if (( cp & ~_lead4_mask ) == _lead4 ) return 5; - if (( cp & ~_lead5_mask ) == _lead5 ) return 6; - throw invalid_data( "invalid UTF-8 sequence header value" ); - } - //! returns the number of UTF-8 code points needed to represent the given UTF-32 character \a cp - static size_t _utf8_char_length( unicode_char uc ) - { - /* - 7 bit: U-00000000 - U-0000007F: 0xxxxxxx - 11 bit: U-00000080 - U-000007FF: 110xxxxx 10xxxxxx - 16 bit: U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx - 21 bit: U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - 26 bit: U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - 31 bit: U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - */ - if ( !( uc & ~0x0000007F ) ) return 1; - if ( !( uc & ~0x000007FF ) ) return 2; - if ( !( uc & ~0x0000FFFF ) ) return 3; - if ( !( uc & ~0x001FFFFF ) ) return 4; - if ( !( uc & ~0x03FFFFFF ) ) return 5; - if ( !( uc & ~0x7FFFFFFF ) ) return 6; - throw invalid_data( "invalid UTF-32 value" ); - } - - //! converts the given UTF-8 character buffer to a single UTF-32 Unicode character, returns the number of bytes used to create the output character (maximum of 6) - static size_t _utf8_to_utf32( const unsigned char in_cp[6], unicode_char& out_uc ) - { - size_t len = _utf8_char_length( in_cp[0] ); - if ( len == 1 ) - { // if we are only 1 byte long, then just grab it and exit - out_uc = in_cp[0]; - return 1; - } - - unicode_char c = 0; // temporary buffer - size_t i = 0; - switch ( len ) - { // load header byte - case 6: - c = in_cp[i] & _lead5_mask; - break; - case 5: - c = in_cp[i] & _lead4_mask; - break; - case 4: - c = in_cp[i] & _lead3_mask; - break; - case 3: - c = in_cp[i] & _lead2_mask; - break; - case 2: - c = in_cp[i] & _lead1_mask; - break; - } - - for ( ++i; i < len; i++ ) - { // load each continuation byte - if (( in_cp[i] & ~_cont_mask ) != _cont ) - throw invalid_data( "bad UTF-8 continuation byte" ); - c <<= 6; - c |= ( in_cp[i] & _cont_mask ); - } - - out_uc = c; // write the final value and return the used byte length - return len; - } - //! writes the given UTF-32 \a uc_in to the buffer location \a out_cp using UTF-8 encoding, returns the number of bytes used to encode the input - static size_t _utf32_to_utf8( const unicode_char& in_uc, unsigned char out_cp[6] ) - { - size_t len = _utf8_char_length( in_uc ); // predict byte length of sequence - unicode_char c = in_uc; // copy to temp buffer - - //stuff all of the lower bits - for ( size_t i = len - 1; i > 0; i-- ) - { - out_cp[i] = (( c ) & _cont_mask ) | _cont; - c >>= 6; - } - - //now write the header byte - switch ( len ) - { - case 6: - out_cp[0] = (( c ) & _lead5_mask ) | _lead5; - break; - case 5: - out_cp[0] = (( c ) & _lead4_mask ) | _lead4; - break; - case 4: - out_cp[0] = (( c ) & _lead3_mask ) | _lead3; - break; - case 3: - out_cp[0] = (( c ) & _lead2_mask ) | _lead2; - break; - case 2: - out_cp[0] = (( c ) & _lead1_mask ) | _lead1; - break; - case 1: - default: - out_cp[0] = ( c ) & 0x7F; - break; - } - - // return the byte length of the sequence - return len; - } - - //! verifies a UTF-8 stream, returning the total number of Unicode characters found - static size_type _verifyUTF8( const unsigned char* c_str ) - { - std::string tmp( reinterpret_cast( c_str ) ); - return _verifyUTF8( tmp ); - } - //! verifies a UTF-8 stream, returning the total number of Unicode characters found - static size_type _verifyUTF8( const std::string& str ) - { - std::string::const_iterator i, ie = str.end(); - i = str.begin(); - size_type length = 0; - - while ( i != ie ) - { - // characters pass until we find an extended sequence - if (( *i ) & 0x80 ) - { - unsigned char c = ( *i ); - size_t contBytes = 0; - - // get continuation byte count and test for overlong sequences - if (( c & ~_lead1_mask ) == _lead1 ) - { // 1 additional byte - if ( c == _lead1 ) throw invalid_data( "overlong UTF-8 sequence" ); - contBytes = 1; - - } - else if (( c & ~_lead2_mask ) == _lead2 ) - { // 2 additional bytes - contBytes = 2; - if ( c == _lead2 ) - { // possible overlong UTF-8 sequence - c = ( *( i + 1 ) ); // look ahead to next byte in sequence - if (( c & _lead2 ) == _cont ) throw invalid_data( "overlong UTF-8 sequence" ); - } - - } - else if (( c & ~_lead3_mask ) == _lead3 ) - { // 3 additional bytes - contBytes = 3; - if ( c == _lead3 ) - { // possible overlong UTF-8 sequence - c = ( *( i + 1 ) ); // look ahead to next byte in sequence - if (( c & _lead3 ) == _cont ) throw invalid_data( "overlong UTF-8 sequence" ); - } - - } - else if (( c & ~_lead4_mask ) == _lead4 ) - { // 4 additional bytes - contBytes = 4; - if ( c == _lead4 ) - { // possible overlong UTF-8 sequence - c = ( *( i + 1 ) ); // look ahead to next byte in sequence - if (( c & _lead4 ) == _cont ) throw invalid_data( "overlong UTF-8 sequence" ); - } - - } - else if (( c & ~_lead5_mask ) == _lead5 ) - { // 5 additional bytes - contBytes = 5; - if ( c == _lead5 ) - { // possible overlong UTF-8 sequence - c = ( *( i + 1 ) ); // look ahead to next byte in sequence - if (( c & _lead5 ) == _cont ) throw invalid_data( "overlong UTF-8 sequence" ); - } - } - - // check remaining continuation bytes for - while ( contBytes-- ) - { - c = ( *( ++i ) ); // get next byte in sequence - if (( c & ~_cont_mask ) != _cont ) - throw invalid_data( "bad UTF-8 continuation byte" ); - } - } - length++; - i++; - } - return length; - } - //@} - - private: - //template friend class _iterator; - dstring mData; - - //! buffer data type identifier - enum BufferType - { - bt_none, - bt_string, - bt_wstring, - bt_utf32string - }; - - //! common constructor operations - void _init() - { - m_buffer.mVoidBuffer = 0; - m_bufferType = bt_none; - m_bufferSize = 0; - } - - /////////////////////////////////////////////////////////////////////// - // Scratch buffer - //! auto cleans the scratch buffer using the proper delete for the stored type - void _cleanBuffer() const - { - if ( m_buffer.mVoidBuffer != 0 ) - { - switch ( m_bufferType ) - { - case bt_string: - delete m_buffer.mStrBuffer; - break; - case bt_wstring: - delete m_buffer.mWStrBuffer; - break; - case bt_utf32string: - delete m_buffer.mUTF32StrBuffer; - break; - case bt_none: // under the worse of circumstances, this is all we can do, and hope it works out - default: - //delete m_buffer.mVoidBuffer; - // delete void* is undefined, don't do that - MYGUI_ASSERT(false, "This should never happen - mVoidBuffer should never contain something if we " - "don't know the type"); - break; - } - m_buffer.mVoidBuffer = 0; - m_bufferSize = 0; - } - } - - //! create a std::string in the scratch buffer area - void _getBufferStr() const - { - if ( m_bufferType != bt_string ) - { - _cleanBuffer(); - m_buffer.mStrBuffer = new std::string(); - m_bufferType = bt_string; - } - m_buffer.mStrBuffer->clear(); - } - //! create a std::wstring in the scratch buffer area - void _getBufferWStr() const - { - if ( m_bufferType != bt_wstring ) - { - _cleanBuffer(); - m_buffer.mWStrBuffer = new std::wstring(); - m_bufferType = bt_wstring; - } - m_buffer.mWStrBuffer->clear(); - } - //! create a utf32string in the scratch buffer area - void _getBufferUTF32Str() const - { - if ( m_bufferType != bt_utf32string ) - { - _cleanBuffer(); - m_buffer.mUTF32StrBuffer = new utf32string(); - m_bufferType = bt_utf32string; - } - m_buffer.mUTF32StrBuffer->clear(); - } - - void _load_buffer_UTF8() const - { - _getBufferStr(); - std::string& buffer = ( *m_buffer.mStrBuffer ); - buffer.reserve( length() ); - - unsigned char utf8buf[6]; - char* charbuf = ( char* )utf8buf; - unicode_char c; - size_t len; - - const_iterator i, ie = end(); - for ( i = begin(); i != ie; i.moveNext() ) - { - c = i.getCharacter(); - len = _utf32_to_utf8( c, utf8buf ); - size_t j = 0; - while ( j < len ) - buffer.push_back( charbuf[j++] ); - } - } - void _load_buffer_WStr() const - { - _getBufferWStr(); - std::wstring& buffer = ( *m_buffer.mWStrBuffer ); - buffer.reserve( length() ); // may over reserve, but should be close enough -#ifdef WCHAR_UTF16 // wchar_t matches UTF-16 - const_iterator i, ie = end(); - for ( i = begin(); i != ie; ++i ) - { - buffer.push_back(( wchar_t )( *i ) ); - } -#else // wchar_t fits UTF-32 - unicode_char c; - const_iterator i, ie = end(); - for ( i = begin(); i != ie; i.moveNext() ) - { - c = i.getCharacter(); - buffer.push_back(( wchar_t )c ); - } -#endif - } - void _load_buffer_UTF32() const - { - _getBufferUTF32Str(); - utf32string& buffer = ( *m_buffer.mUTF32StrBuffer ); - buffer.reserve( length() ); // may over reserve, but should be close enough - - unicode_char c; - - const_iterator i, ie = end(); - for ( i = begin(); i != ie; i.moveNext() ) - { - c = i.getCharacter(); - buffer.push_back( c ); - } - } - - mutable BufferType m_bufferType; // identifies the data type held in m_buffer - mutable size_t m_bufferSize; // size of the CString buffer - - // multi-purpose buffer used everywhere we need a throw-away buffer - union Buffer - { - mutable void* mVoidBuffer; - mutable std::string* mStrBuffer; - mutable std::wstring* mWStrBuffer; - mutable utf32string* mUTF32StrBuffer; - } - m_buffer; - }; - - //! string addition operator \relates UString - inline UString operator+( const UString& s1, const UString& s2 ) - { - return UString( s1 ).append( s2 ); - } - //! string addition operator \relates UString - inline UString operator+( const UString& s1, UString::code_point c ) - { - return UString( s1 ).append( 1, c ); - } - //! string addition operator \relates UString - inline UString operator+( const UString& s1, UString::unicode_char c ) - { - return UString( s1 ).append( 1, c ); - } - //! string addition operator \relates UString - inline UString operator+( const UString& s1, char c ) - { - return UString( s1 ).append( 1, c ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! string addition operator \relates UString - inline UString operator+( const UString& s1, wchar_t c ) - { - return UString( s1 ).append( 1, c ); - } -#endif - //! string addition operator \relates UString - inline UString operator+( UString::code_point c, const UString& s2 ) - { - return UString().append( 1, c ).append( s2 ); - } - //! string addition operator \relates UString - inline UString operator+( UString::unicode_char c, const UString& s2 ) - { - return UString().append( 1, c ).append( s2 ); - } - //! string addition operator \relates UString - inline UString operator+( char c, const UString& s2 ) - { - return UString().append( 1, c ).append( s2 ); - } -#if MYGUI_IS_NATIVE_WCHAR_T - //! string addition operator \relates UString - inline UString operator+( wchar_t c, const UString& s2 ) - { - return UString().append( 1, c ).append( s2 ); - } -#endif - - // (const) forward iterator common operators - inline UString::size_type operator-( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return ( left.mIter - right.mIter ); - } - inline bool operator==( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter == right.mIter; - } - inline bool operator!=( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter != right.mIter; - } - inline bool operator<( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter < right.mIter; - } - inline bool operator<=( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter <= right.mIter; - } - inline bool operator>( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter > right.mIter; - } - inline bool operator>=( const UString::_const_fwd_iterator& left, const UString::_const_fwd_iterator& right ) - { - return left.mIter >= right.mIter; - } - - // (const) reverse iterator common operators - // NB: many of these operations are evaluated in reverse because this is a reverse iterator wrapping a forward iterator - inline UString::size_type operator-( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return ( right.mIter - left.mIter ); - } - inline bool operator==( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return left.mIter == right.mIter; - } - inline bool operator!=( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return left.mIter != right.mIter; - } - inline bool operator<( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return right.mIter < left.mIter; - } - inline bool operator<=( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return right.mIter <= left.mIter; - } - inline bool operator>( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return right.mIter > left.mIter; - } - inline bool operator>=( const UString::_const_rev_iterator& left, const UString::_const_rev_iterator& right ) - { - return right.mIter >= left.mIter; - } - - //! std::ostream write operator \relates UString - inline std::ostream& operator << ( std::ostream& os, const UString& s ) - { - return os << s.asUTF8(); - } - - //! std::wostream write operator \relates UString - //inline std::wostream& operator << ( std::wostream& os, const UString& s ) - //{ - // return os << s.asWStr(); - //} - - - -} - -#endif // __MYGUI_U_STRING_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Utility.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Utility.h deleted file mode 100644 index 1cc81d70f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Utility.h +++ /dev/null @@ -1,355 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_UTILITY_H__ -#define __MYGUI_UTILITY_H__ - -#include "MyGUI_Prerequest.h" -#include -#include - -namespace MyGUI -{ - namespace utility - { - - inline void trim(std::string& _str, bool _left = true, bool _right = true) - { - if (_right) _str.erase(_str.find_last_not_of(" \t\r")+1); - if (_left) _str.erase(0, _str.find_first_not_of(" \t\r")); - } - - // конвертирование в Ñтроку - template - inline std::string toString (T p) - { - std::ostringstream stream; - stream << p; - return stream.str(); - } - - inline const std::string& toString (const std::string& _value) - { - return _value; - } - - template - inline std::string toString (T1 p1, T2 p2) - { - std::ostringstream stream; - stream << p1 << p2; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3) - { - std::ostringstream stream; - stream << p1 << p2 << p3; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4 << p5; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4 << p5 << p6; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4 << p5 << p6 << p7; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4 << p5 << p6 << p7 << p8; - return stream.str(); - } - - template - inline std::string toString (T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9) - { - std::ostringstream stream; - stream << p1 << p2 << p3 << p4 << p5 << p6 << p7 << p8 << p9; - return stream.str(); - } - - template< > - inline std::string toString (bool _value) - { - return _value ? "true" : "false"; - } - - - // утилиты Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга - template - inline T parseValue( const std::string& _value ) - { - std::istringstream stream(_value); - T result; - stream >> result; - if (stream.fail()) return T(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return T(); - item = stream.get(); - } - } - return result; - } - - // Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð¼Ð¿Ð»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´ bool - template<> - inline bool parseValue( const std::string& _value ) - { - if (_value == "true" || _value == "1") return true; - return false; - } - - // Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð¼Ð¿Ð»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´ char - template<> - inline char parseValue( const std::string& _value ) { return (char)parseValue(_value); } - - // Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð¼Ð¿Ð»ÐµÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´ unsigned char - template<> - inline unsigned char parseValue( const std::string& _value ) { return (unsigned char)parseValue(_value); } - - - inline short parseShort(const std::string& _value) { return parseValue(_value); } - inline unsigned short parseUShort(const std::string& _value) { return parseValue(_value); } - inline int parseInt(const std::string& _value) { return parseValue(_value); } - inline unsigned int parseUInt(const std::string& _value) { return parseValue(_value); } - inline size_t parseSizeT(const std::string& _value) { return parseValue(_value); } - inline float parseFloat(const std::string& _value) { return parseValue(_value); } - inline double parseDouble(const std::string& _value) { return parseValue(_value); } - - inline bool parseBool(const std::string& _value) { return parseValue(_value); } - inline char parseChar(const std::string& _value) { return parseValue(_value); } - inline unsigned char parseUChar(const std::string& _value) { return parseValue(_value); } - - // Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга Ñложных типов, ÑоÑтоÑщих из проÑÑ‚Ñ‹Ñ… - template - inline T1 parseValueEx2(const std::string& _value) - { - T2 p1, p2; - std::istringstream stream(_value); - stream >> p1 >> p2; - if (stream.fail()) return T1(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return T1(); - item = stream.get(); - } - } - return T1(p1, p2); - } - - template - inline T1 parseValueEx3(const std::string& _value) - { - T2 p1, p2, p3; - std::istringstream stream(_value); - stream >> p1 >> p2 >> p3; - if (stream.fail()) return T1(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return T1(); - item = stream.get(); - } - } - return T1(p1, p2, p3); - } - - template - inline T1 parseValueEx4(const std::string& _value) - { - T2 p1, p2, p3, p4; - std::istringstream stream(_value); - stream >> p1 >> p2 >> p3 >> p4; - if (stream.fail()) return T1(); - else - { - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return T1(); - item = stream.get(); - } - } - return T1(p1, p2, p3, p4); - } - - namespace templates - { - template - inline void split(std::vector& _ret, const std::string& _source, const std::string& _delims) - { - size_t start = _source.find_first_not_of(_delims); - while (start != _source.npos) - { - size_t end = _source.find_first_of(_delims, start); - if (end != _source.npos) _ret.push_back(_source.substr(start, end-start)); - else - { - _ret.push_back(_source.substr(start)); - break; - } - start = _source.find_first_not_of(_delims, end + 1); - } - } - } // namespace templates - - inline std::vector split(const std::string& _source, const std::string& _delims = "\t\n ") - { - std::vector result; - templates::split(result, _source, _delims); - return result; - } - - template - inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2, T3& _p3, T4& _p4) - { - std::istringstream stream(_value); - - stream >> _p1 >> _p2 >> _p3 >> _p4; - - if (stream.fail()) return false; - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return false; - item = stream.get(); - } - - return true; - } - - template - inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2, T3& _p3) - { - std::istringstream stream(_value); - - stream >> _p1 >> _p2 >> _p3; - - if (stream.fail()) return false; - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return false; - item = stream.get(); - } - - return true; - } - - template - inline bool parseComplex(const std::string& _value, T1& _p1, T2& _p2) - { - std::istringstream stream(_value); - - stream >> _p1 >> _p2; - - if (stream.fail()) return false; - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return false; - item = stream.get(); - } - - return true; - } - - template - inline bool parseComplex(const std::string& _value, T1& _p1) - { - std::istringstream stream(_value); - - stream >> _p1; - - if (stream.fail()) return false; - int item = stream.get(); - while (item != -1) - { - if (item != ' ' && item != '\t') return false; - item = stream.get(); - } - - return true; - } - - template<> - inline bool parseComplex(const std::string& _value, bool& _p1) - { - std::string value(_value); - trim(value); - if ((value == "true") || (value == "1")) - { - _p1 = true; - return true; - } - else if ((value == "false") || (value == "0")) - { - _p1 = false; - return true; - } - - return false; - } - - } // namespace utility - -} // namespace MyGUI - -#endif // __MYGUI_UTILITY_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VScroll.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VScroll.h deleted file mode 100644 index 8f2b59cc9..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VScroll.h +++ /dev/null @@ -1,176 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_VSCROLL_H__ -#define __MYGUI_VSCROLL_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_EventPair.h" - -namespace MyGUI -{ - - typedef delegates::CDelegate2 EventHandle_VScrollPtrSizeT; - - class MYGUI_EXPORT VScroll : - public Widget - { - MYGUI_RTTI_DERIVED( VScroll ) - - public: - VScroll(); - - /** Set scroll range */ - void setScrollRange(size_t _value); - /** Get scroll range */ - size_t getScrollRange() { return mScrollRange; } - - /** Set scroll position (value from 0 to range - 1) */ - void setScrollPosition(size_t _value); - /** Get scroll position (value from 0 to range - 1) */ - size_t getScrollPosition() { return mScrollPosition; } - - /** Set scroll page - @param _page Tracker step when buttons pressed - */ - void setScrollPage(size_t _value) { mScrollPage = _value; } - /** Get scroll page */ - size_t getScrollPage() { return mScrollPage; } - - /** Set scroll view page - @param _viewPage Tracker step when pressed on scroll line - */ - void setScrollViewPage(size_t _value) { mScrollViewPage = _value; } - /** Get scroll view page */ - size_t getScrollViewPage() { return mScrollViewPage; } - - /** Get size in pixels of area where scroll moves */ - virtual int getLineSize(); - - /** Set size of track in pixels - @param _value in pixels, if less than MinTrackSize, MinTrackSize used - */ - virtual void setTrackSize(int _value); - /** Get size of track in pixels */ - virtual int getTrackSize(); - - /** Set minimal track size (used for setTrackSize)*/ - void setMinTrackSize(int _value) { mMinTrackSize = _value; } - /** Get minimal track size */ - int getMinTrackSize() { return mMinTrackSize; } - - /** Enable or disable move to click mode.\n - Move to click mode: Tracker moves to cursor when pressed on scroll line.\n - Disabled (false) by default. - */ - void setMoveToClick(bool _value) { mMoveToClick = _value; } - /** Get move to click mode flag */ - bool getMoveToClick() { return mMoveToClick; } - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : scroll tracker position changed.\n - signature : void method(MyGUI::VScroll* _sender, size_t _position)\n - @param _sender widget that called this event - @param _position - new tracker position - */ - EventPair eventScrollChangePosition; - - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~VScroll(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - virtual void updateTrack(); - virtual void TrackMove(int _left, int _top); - - virtual void onMouseWheel(int _rel); - - void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseReleased(Widget* _sender, int _left, int _top, MouseButton _id); - void notifyMouseDrag(Widget* _sender, int _left, int _top); - void notifyMouseWheel(Widget* _sender, int _rel); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - protected: - // наши кнопки - Button* mWidgetStart; - Button* mWidgetEnd; - Button* mWidgetTrack; - // куÑки между кнопками - Button* mWidgetFirstPart; - Button* mWidgetSecondPart; - - // Ñмещение внутри окна - IntPoint mPreActionOffset; - - // диапазон на который трек может двигатьÑÑ - size_t mSkinRangeStart; - size_t mSkinRangeEnd; - - size_t mScrollRange; - size_t mScrollPosition; - size_t mScrollPage; // на Ñколько перещелкивать, при щелчке на кнопке - size_t mScrollViewPage; // на Ñколько перещелкивать, при щелчке по полоÑе - - int mMinTrackSize; - bool mMoveToClick; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_VSCROLL_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Version.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Version.h deleted file mode 100644 index 33c69b2dc..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Version.h +++ /dev/null @@ -1,96 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_VERSION_H__ -#define __MYGUI_VERSION_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_Utility.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT Version - { - public: - Version() : value(0) { } - Version(uint8 _major, uint8 _minor, uint16 _patch) : value((uint32(_major) << 24) + (uint32(_minor) << 16) + uint32(_patch)) { } - Version(uint8 _major, uint8 _minor) : value((uint32(_major) << 24) + (uint32(_minor) << 16)) { } - explicit Version(const std::string& _value) : value(parse(_value).value) { } - - friend bool operator < (Version const& a, Version const& b) { return a.getPoorVersion() < b.getPoorVersion(); } - friend bool operator >= (Version const& a, Version const& b) { return !(a < b); } - friend bool operator > (Version const& a, Version const& b) { return (b < a); } - friend bool operator <= (Version const& a, Version const& b) { return !(a > b); } - - friend bool operator == (Version const& a, Version const& b) { return !(a < b) && !(a > b); } - friend bool operator != (Version const& a, Version const& b) { return !(a == b); } - - friend std::ostream& operator << ( std::ostream& _stream, const Version& _value ) - { - _stream << _value.print(); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, Version& _value ) - { - std::string value; - _stream >> value; - _value = Version::parse(value); - return _stream; - } - - uint8 getMajor() const { return uint8((value & 0xFF000000) >> 24); } - uint8 getMinor() const { return uint8((value & 0x00FF0000) >> 16); } - uint16 getPatch() const { return uint16(value & 0x0000FFFF); } - - uint32 getPoorVersion() const { return value & 0xFFFF0000; } - uint32 getFullVersion() const { return value; } - - std::string print() const - { - if (getPatch() == 0) return utility::toString(getMajor(), ".", getMinor()); - return utility::toString(getMajor(), ".", getMinor(), ".", getPatch()); - } - - static Version parse(const std::string& _value) - { - const std::vector& vec = utility::split(_value, "."); - if (vec.empty()) return Version(); - uint8 major = (uint8)utility::parseValue(vec[0]); - uint8 minor = vec.size() > 1 ? (uint8)utility::parseValue(vec[1]) : uint8(0); - uint16 patch = vec.size() > 2 ? (uint16)utility::parseValue(vec[2]) : uint16(0); - return Version(major, minor, patch); - } - - private: - union - { - uint32 value; - uint8 value_data[4]; - }; - }; - -} // namespace MyGUI - -#endif // __MYGUI_VERSION_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VertexData.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VertexData.h deleted file mode 100644 index 716749092..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_VertexData.h +++ /dev/null @@ -1,87 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_VERTEX_DATA_H__ -#define __MYGUI_VERTEX_DATA_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" - -namespace MyGUI -{ - - struct Vertex - { - void set(float _x, float _y, float _z, float _u, float _v, uint32 _colour) - { - x = _x; - y = _y; - z = _z; - u = _u; - v = _v; - colour = _colour; - } - - float x, y, z; - uint32 colour; - float u, v; - }; - - struct VertexQuad - { - enum Enum - { - CornerLT = 0, - CornerRT = 1, - CornerLB = 2, - CornerLB2 = 3, - CornerRT2 = 4, - CornerRB = 5, - VertexCount = 6 - }; - - void set(float _l, float _t, float _r, float _b, float _z, float _u1, float _v1, float _u2, float _v2, uint32 _colour) - { - vertex[CornerLT].set(_l, _t, _z, _u1, _v1, _colour); - vertex[CornerRT].set(_r, _t, _z, _u2, _v1, _colour); - vertex[CornerLB].set(_l, _b, _z, _u1, _v2, _colour); - vertex[CornerRB].set(_r, _b, _z, _u2, _v2, _colour); - vertex[CornerRT2] = vertex[CornerRT]; - vertex[CornerLB2] = vertex[CornerLB]; - } - - void set(float _x1, float _y1, float _x2, float _y2, float _x3, float _y3, float _x4, float _y4, float _z, float _u1, float _v1, float _u2, float _v2, uint32 _colour) - { - vertex[CornerLT].set(_x1, _y1, _z, _u1, _v1, _colour); - vertex[CornerRT].set(_x2, _y2, _z, _u2, _v1, _colour); - vertex[CornerLB].set(_x4, _y4, _z, _u1, _v2, _colour); - vertex[CornerRB].set(_x3, _y3, _z, _u2, _v2, _colour); - vertex[CornerRT2] = vertex[CornerRT]; - vertex[CornerLB2] = vertex[CornerLB]; - } - - Vertex vertex[6]; - }; - -} // namespace MyGUI - -#endif // __MYGUI_VERTEX_DATA_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Widget.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Widget.h deleted file mode 100644 index 5679bc382..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Widget.h +++ /dev/null @@ -1,503 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_H__ -#define __MYGUI_WIDGET_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Any.h" -#include "MyGUI_ICroppedRectangle.h" -#include "MyGUI_ISubWidgetRect.h" -#include "MyGUI_ISubWidgetText.h" -#include "MyGUI_LayerItem.h" -#include "MyGUI_WidgetUserData.h" -#include "MyGUI_WidgetEvent.h" -#include "MyGUI_IWidgetCreator.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_IObject.h" - -namespace MyGUI -{ - - class MYGUI_EXPORT Widget : - public IObject, - public ICroppedRectangle, - public LayerItem, - public UserData, - public WidgetEvent, - public IWidgetCreator, - public delegates::IDelegateUnlink - { - // Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° закрытых деÑтрукторов - friend class IWidgetCreator; - - MYGUI_RTTI_BASE( Widget ) - - public: - Widget(); - - /** Create child widget - @param _type widget type - @param _skin widget skin - @param _coord int coordinates of widget (_left, _top, _width, _height) - @param _align widget align (possible values can be found in enum Align) - @param _name if needed (you can use it for finding widget by name later) - */ - Widget* createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = ""); - - /** See Widget::createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "") */ - Widget* createWidgetT(const std::string& _type, const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _name = ""); - - /** Create widget using coordinates relative to parent. see Widget::createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "") */ - Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _name = ""); - - /** Create widget using coordinates relative to parent. see Widget::createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "") */ - Widget* createWidgetRealT(const std::string& _type, const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _name = ""); - - // templates for creating widgets by type - /** Same as Widget::createWidgetT but return T pointer instead of Widget* */ - template - T* createWidget(const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _name = "") - { - return static_cast(createWidgetT(T::getClassTypeName(), _skin, _coord, _align, _name)); - } - - /** Same as Widget::createWidgetT but return T pointer instead of Widget* */ - template - T* createWidget(const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _name = "") - { - return static_cast(createWidgetT(T::getClassTypeName(), _skin, IntCoord(_left, _top, _width, _height), _align, _name)); - } - - /** Same as Widget::createWidgetRealT but return T* instead of Widget* */ - template - T* createWidgetReal(const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _name = "") - { - return static_cast(createWidgetRealT(T::getClassTypeName(), _skin, _coord, _align, _name)); - } - - /** Same as Widget::createWidgetRealT but return T* instead of Widget* */ - template - T* createWidgetReal(const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _name = "") - { - return static_cast(createWidgetRealT(T::getClassTypeName(), _skin, _left, _top, _width, _height, _align, _name)); - } - - /** Create child widget - @param _style Child, Popup or Overlapped widget style - @param _type widget type - @param _skin widget skin - @param _coord int coordinates of widget (_left, _top, _width, _height) - @param _align widget align (possible values can be found in enum Align) - @param _name if needed (you can use it for finding widget by name later) - */ - Widget* createWidgetT(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer = "", const std::string& _name = ""); - - /** Same as Widget::createWidgetT but return T* instead of Widget* */ - template - T* createWidget(WidgetStyle _style, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer = "", const std::string& _name = "") - { - return static_cast(createWidgetT(_style, T::getClassTypeName(), _skin, _coord, _align, _layer, _name)); - } - - //! Get name of widget - const std::string& getName() const { return mName; } - - - /** Set widget position (position of left top corner) */ - virtual void setPosition(const IntPoint& _value); - /** Set widget size */ - virtual void setSize(const IntSize& _value); - /** Set widget position and size */ - virtual void setCoord(const IntCoord& _value); - - /** See Widget::setPosition(const IntPoint& _pos) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** See Widget::setSize(const IntSize& _size) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** See Widget::setCoord(const IntCoord& _coord) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** Set widget position (position of left top corner)*/ - void setRealPosition(const FloatPoint& _value); - /** Set widget size */ - void setRealSize(const FloatSize& _value); - /** Set widget position and size*/ - void setRealCoord(const FloatCoord& _value); - - /** See Widget::setRealPosition(const FloatPoint& _point) */ - void setRealPosition(float _left, float _top) { setRealPosition(FloatPoint(_left, _top)); } - /** See Widget::setRealSize(const FloatSize& _size) */ - void setRealSize(float _width, float _height) { setRealSize(FloatSize(_width, _height)); } - /** See Widget::setRealPosition(const FloatCoord& _coord) */ - void setRealCoord(float _left, float _top, float _width, float _height) { setRealCoord(FloatCoord(_left, _top, _width, _height)); } - - /** Hide or show widget */ - virtual void setVisible(bool _value); - - /** Set align */ - virtual void setAlign(Align _value); - - /** Set widget caption */ - virtual void setCaption(const UString& _value); - /** Get widget caption */ - virtual const UString& getCaption(); - - /** Set widget opacity */ - void setAlpha(float _value); - /** Get widget opacity */ - float getAlpha() { return mAlpha; } - - /** Enable or disable inherits alpha mode */ - void setInheritsAlpha(bool _value); - /** Get inherits alpha mode flag */ - bool isInheritsAlpha() { return mInheritsAlpha; } - - /** Set widget's state */ - bool setState(const std::string& _value); - - void setColour(const Colour& _value); - - // ÑвлÑемÑÑ Ð»Ð¸ мы рутовым виджетом - /** Is this widget is root widget (root == without parents) */ - bool isRootWidget() { return nullptr == mCroppedParent; } - - /** Get parent widget or nullptr if no parent */ - Widget* getParent() { return mParent; } - - /** Get child widgets Enumerator */ - EnumeratorWidgetPtr getEnumerator(); - - /** Get child count */ - size_t getChildCount(); - - /** Get child by index (index from 0 to child_count - 1) */ - Widget* getChildAt(size_t _index); - - /** Find widget by name (search recursively through all childs starting from this widget) */ - Widget* findWidget(const std::string& _name); - - /** Set need key focus flag */ - void setNeedKeyFocus(bool _value) { mNeedKeyFocus = _value; } - /** Is need key focus - If disable this widget won't be reacting on keyboard at all.\n - Enabled (true) by default. - */ - bool isNeedKeyFocus() { return mNeedKeyFocus; } - - /** Set need mouse focus flag */ - void setNeedMouseFocus(bool _value) { mNeedMouseFocus = _value; } - /** Is need mouse focus - If disable this widget won't be reacting on mouse at all.\n - Enabled (true) by default. - */ - bool isNeedMouseFocus() { return mNeedMouseFocus; } - - /** Set inherits mode flag - This mode makes all child widgets pickable even if widget don't - need mouse focus (was set setNeedKeyFocus(false) ).\n - Disabled (false) by default. - */ - void setInheritsPick(bool _value) { mInheritsPick = _value; } - /** Get inherits mode flag */ - bool isInheritsPick() { return mInheritsPick; } - - /** Set picking mask for widget */ - void setMaskPick(const std::string& _filename); - - /** Enable or disable widget */ - virtual void setEnabled(bool _value); - /** Enable or disable widget without changing widget's state */ - void setEnabledSilent(bool _value) { mEnabled = _value; } - /** Is widget enabled */ - bool isEnabled() { return mEnabled; } - - /** Set mouse pointer for this widget */ - void setPointer(const std::string& _value) { mPointer = _value; } - /** Get mouse pointer name for this widget */ - const std::string& getPointer(); - - /** Get widget's layer, return "" if widget is not root widget (root == without parents) */ - const std::string& getLayerName(); - - /** Get rect where child widgets placed */ - IntCoord getClientCoord(); - - /** Get clien area widget or nullptr if widget don't have client */ - Widget* getClientWidget() { return mWidgetClient; } - - /** Get text sub widget or nullptr if no text sub widget */ - ISubWidgetText * getSubWidgetText() { return mText; } - /** Get sub widget of first texture or nullptr if no sub widget with texture */ - ISubWidgetRect * getSubWidgetMain() { return mMainSkin; } - - /** Set need tool tip mode flag. Enable this if you need tool tip events for widget */ - void setNeedToolTip(bool _value); - /** Get need tool tip mode flag */ - bool getNeedToolTip() { return mNeedToolTip; } - - /** Enable or disable tooltip event */ - void setEnableToolTip(bool _value); - /** Get tool tip enabled flag */ - bool getEnableToolTip() { return mEnableToolTip; } - - /** Detach widget from widgets hierarchy - @param _layer Attach to specified layer (if any) - */ - void detachFromWidget(const std::string& _layer = ""); - - /** Attach widget to parent - @param _style Child widget type - @param _layer Attach to specified layer (if any) - @note you might also need to call void Widget::setWidgetStyle(WidgetStyle _style); - to set widget style (widget attached with MyGUI::WidgetStyle::Popup by default) - */ - void attachToWidget(Widget* _parent, WidgetStyle _style = WidgetStyle::Child, const std::string& _layer = ""); - - /** Change widget skin */ - void changeWidgetSkin(const std::string& _skinname); - - /** Set widget style. - @param _layer Attach to specified layer (if any) - @note When choosing WidgetStyle::Popup style you also need attach widget to layer - see LayerManager::attachToLayerNode - */ - void setWidgetStyle(WidgetStyle _style, const std::string& _layer = ""); - /** Get widget style */ - WidgetStyle getWidgetStyle() { return mWidgetStyle; } - - /** Set any widget property - @param _key Property name (for example Widget_Alpha or Edit_MultiLine) - @param _value Value converted to string - */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - - /*internal:*/ - // метод Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа номера айтема и контейнера - virtual void _getContainer(Widget*& _container, size_t& _index); - - // дает приоритет виджету при пиккинге - void _forcePeek(Widget* _widget); - - void _setUVSet(const FloatRect& _rect); - - virtual void _setTextureName(const std::string& _texture); - virtual const std::string& _getTextureName(); - - IWidgetCreator * _getIWidgetCreator() { return mIWidgetCreator; } - - IntCoord _getTextRegion(); - IntSize _getTextSize(); - void _setFontName(const std::string& _font); - const std::string& _getFontName(); - void _setFontHeight(int _height); - int _getFontHeight(); - void _setTextAlign(Align _align); - Align _getTextAlign(); - void _setTextColour(const Colour& _colour); - const Colour& _getTextColour(); - - // уÑтанавливает Ñтроку заменив /n на реальный Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ - void setCaptionWithNewLine(const std::string& _value); - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - - MYGUI_OBSOLETE("use : void Widget::setEnableToolTip") - void enableToolTip(bool _enable) { setEnableToolTip(_enable); } - - MYGUI_OBSOLETE("use : void setInheritsPick(bool _inherits)") - void setInheritsPeek(bool _inherits) { setInheritsPick(_inherits); } - MYGUI_OBSOLETE("use : bool isInheritsPick()") - bool isInheritsPeek() { return isInheritsPick(); } - - MYGUI_OBSOLETE("use : void setMaskPick(const std::string& _filename)") - void setMaskPeek(const std::string& _filename) { setMaskPick(_filename); } - - MYGUI_OBSOLETE("use : const IntCoord& StaticText::getTextRegion()") - IntCoord getTextCoord() { return _getTextRegion(); } - MYGUI_OBSOLETE("use : IntSize StaticText::getTextSize()") - IntSize getTextSize() { return _getTextSize(); } - - MYGUI_OBSOLETE("use : void StaticText::setFontName(const std::string& _font)") - void setFontName(const std::string& _font) { _setFontName(_font); } - MYGUI_OBSOLETE("use : const std::string& StaticText::getFontName()") - const std::string& getFontName() { return _getFontName(); } - - MYGUI_OBSOLETE("use : void StaticText::setFontHeight(int _height)") - void setFontHeight(int _height) { _setFontHeight(_height); } - MYGUI_OBSOLETE("use : int StaticText::getFontHeight()") - int getFontHeight() { return _getFontHeight(); } - - MYGUI_OBSOLETE("use : void StaticText::setTextAlign(Align _align)") - void setTextAlign(Align _align) { _setTextAlign(_align); } - MYGUI_OBSOLETE("use : Align StaticText::getTextAlign()") - Align getTextAlign() { return _getTextAlign(); } - - MYGUI_OBSOLETE("use : void StaticText::setTextColour(const Colour& _colour)") - void setTextColour(const Colour& _colour) { _setTextColour(_colour); } - MYGUI_OBSOLETE("use : const Colour& StaticText::getTextColour()") - const Colour& getTextColour() { return _getTextColour(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - // вÑе Ñоздание только через фабрику - Widget(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - virtual ~Widget(); - - virtual void baseChangeWidgetSkin(ResourceSkin* _info); - - void _updateView(); // Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÐµÐ±Ñ Ð¸ детей - - void _setAlign(const IntSize& _oldsize, bool _update); - void _setAlign(const IntCoord& _oldcoord, bool _update); - - // Ñоздает виджет - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - // удÑлÑет неудачника - virtual void _destroyChildWidget(Widget* _widget); - - // удалÑет вÑех детей - virtual void _destroyAllChildWidget(); - - // запрашиваем у конейтера айтем по позиции мыши - virtual size_t _getContainerIndex(const IntPoint& _point) { return ITEM_NONE; } - - // ÑÐ±Ñ€Ð¾Ñ Ð²Ñех данных контейнера, тултипы и вÑе оÑтальное - virtual void _resetContainer(bool _update); - - virtual void baseUpdateEnable(); - - // наÑледуемÑÑ Ð¾Ð½ LayerInfo - virtual ILayerItem * getLayerItemByPoint(int _left, int _top); - virtual const IntCoord& getLayerItemCoord() { return mCoord; } - - private: - - void frameEntered(float _frame); - - void initialiseWidgetSkin(ResourceSkin* _info, const IntSize& _size); - void shutdownWidgetSkin(bool _deep = false); - - void _updateAlpha(); - void _updateAbsolutePoint(); - - // Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ³Ð¾ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ - void _setInheritsVisible(bool _value); - bool _isInheritsVisible() { return mInheritsVisible; } - - void _setInheritsEnable(bool _value); - bool _isInheritsEnable() { return mInheritsEnabled; } - - // показывает Ñкрывает вÑе ÑабÑкины - void _setSubSkinVisible(bool _visible); - - float _getRealAlpha() { return mRealAlpha; } - - // добавлÑет в ÑпиÑок виджет - virtual void _linkChildWidget(Widget* _widget); - // удалÑет из ÑпиÑка - virtual void _unlinkChildWidget(Widget* _widget); - - protected: - // ÑпиÑок вÑех Ñтейтов - MapWidgetStateInfo mStateInfo; - // Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ маÑке Ð´Ð»Ñ Ð¿Ð¸ÐºÐ¸Ð½Ð³Ð° - MaskPickInfo const * mMaskPickInfo; - MaskPickInfo mOwnMaskPickInfo; - - // вектор вÑех детей виджетов - VectorWidgetPtr mWidgetChild; - // вектор детей Ñкина - VectorWidgetPtr mWidgetChildSkin; - // вектор вÑех детей ÑабÑкинов - VectorSubWidget mSubSkinChild; - - // указатель на окно текÑта - ISubWidgetText * mText; - // указатель на первый не текÑтовой ÑабÑкин - ISubWidgetRect * mMainSkin; - - // доÑтупен ли на виджет - bool mEnabled; - bool mInheritsEnabled; - // Ñкрыты ли вÑе ÑабÑкины при выходе за границу - bool mSubSkinsVisible; - // Ð´Ð»Ñ Ð¸ÐµÑ€Ð°Ñ€Ñ…Ð¸Ñ‡ÐµÑкого ÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ - bool mInheritsVisible; - // прозрачноÑÑ‚ÑŒ и флаг наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð»ÑŒÑ„Ñ‹ нашего Ð¾Ð²ÐµÑ€Ð»ÐµÑ - float mAlpha; - float mRealAlpha; - bool mInheritsAlpha; - // Ð¸Ð¼Ñ Ð²Ð¸Ð´Ð¶ÐµÑ‚Ð° - std::string mName; - // курÑор который будет показан при наведении - std::string mPointer; - std::string mTextureName; - ITexture* mTexture; - - // наш отец в иерархии виджетов - Widget* mParent; - - // Ñто тот кто Ð½Ð°Ñ Ñоздал, и кто Ð½Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ удалÑÑ‚ÑŒ - IWidgetCreator * mIWidgetCreator; - - // нужен ли виджету ввод Ñ ÐºÐ»Ð°Ð²Ñ‹ - bool mNeedKeyFocus; - // нужен ли виджету Ñ„Ð¾ÐºÑƒÑ Ð¼Ñ‹ÑˆÐ¸ - bool mNeedMouseFocus; - bool mInheritsPick; - - // клиентÑÐºÐ°Ñ Ð·Ð¾Ð½Ð° окна - // еÑли виджет имеет пользовательÑкие окна не в Ñебе - // то обÑзательно проинициализировать Client - Widget* mWidgetClient; - - bool mNeedToolTip; - bool mEnableToolTip; - bool mToolTipVisible; - float mToolTipCurrentTime; - IntPoint mToolTipOldPoint; - size_t mToolTipOldIndex; - IntPoint m_oldMousePoint; - - // поведение виджета, перекрывающийÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¹ или вÑплывающий - WidgetStyle mWidgetStyle; - - FloatCoord mRelativeCoord; - bool mDisableUpdateRelative; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetDefines.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetDefines.h deleted file mode 100644 index 98aa9414d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetDefines.h +++ /dev/null @@ -1,41 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_DEFINES_H__ -#define __MYGUI_WIDGET_DEFINES_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Enumerator.h" -#include -#include - -namespace MyGUI -{ - - class Widget; - typedef std::vector VectorWidgetPtr; - typedef std::map MapWidgetPtr; - typedef Enumerator EnumeratorWidgetPtr; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_DEFINES_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetEvent.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetEvent.h deleted file mode 100644 index 0b0a4c15b..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetEvent.h +++ /dev/null @@ -1,335 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_EVENT_H__ -#define __MYGUI_WIDGET_EVENT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Macros.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_WidgetToolTip.h" -#include "MyGUI_InputDefine.h" - -namespace MyGUI -{ - - // делегаты Ð´Ð»Ñ Ñобытий виджета - typedef delegates::CDelegate1 EventHandle_WidgetVoid; - typedef delegates::CDelegate2 EventHandle_WidgetWidget; - typedef delegates::CDelegate2 EventHandle_WidgetBool; - typedef delegates::CDelegate2 EventHandle_WidgetInt; - typedef delegates::CDelegate2 EventHandle_WidgetSizeT; - typedef delegates::CDelegate3 EventHandle_WidgetIntInt; - typedef delegates::CDelegate4 EventHandle_WidgetIntIntButton; - typedef delegates::CDelegate2 EventHandle_WidgetKeyCode; - typedef delegates::CDelegate3 EventHandle_WidgetKeyCodeChar; - typedef delegates::CDelegate3 EventHandle_WidgetStringString; - typedef delegates::CDelegate3 EventHandle_WidgetRefWidgetRefSizeT; - typedef delegates::CDelegate2 EventHandle_WidgetToolTip; - - /** - General information about creating delegate for event : - @example "Delegate usage" - @code - void anyFunc(...) { } // global function - - class AnyClass - { - public: - static void anyStaticMethod(...) { } // static class method - void anyMethod(...) { } // class method - }; - - AnyClass anyObject; // class instance - @endcode - - delegate creating: - @code - eventAny = MyGUI::newDelegate(anyFunc); - eventAny = MyGUI::newDelegate(AnyClass::anyStaticMethod); - eventAny = MyGUI::newDelegate(&anyObject, &AnyClass::anyMethod); - @endcode - */ - - class MYGUI_EXPORT WidgetEvent - { - friend class InputManager; - - public: - virtual ~WidgetEvent() { } - - protected: - WidgetEvent() : - mWidgetEventSender(0), - mRootMouseActive(false), - mRootKeyActive(false) - { - } - - public: - - /** Event : Widget lost mouse focus.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::Widget* _new)\n - @param _sender widget that called this event - @param _new widget with mouse focus or nullptr - */ - EventHandle_WidgetWidget eventMouseLostFocus; - - /** Event : Widget got mouse focus.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::Widget* _old)\n - @param _sender widget that called this event - @param _old widget with mouse focus or nullptr - */ - EventHandle_WidgetWidget eventMouseSetFocus; - - /** Event : Widget mouse move with captured widget.\n - signature : void method(MyGUI::Widget* _sender, int _left, int _top)\n - @param _sender widget that called this event - @param _left - pointer position - @param _top - pointer position - */ - EventHandle_WidgetIntInt eventMouseDrag; - - /** Event : Mouse move over widget.\n - signature : void method(MyGUI::Widget* _sender, int _left, int _top)\n - @param _sender widget that called this event - @param _left - pointer position - @param _top - pointer position - */ - EventHandle_WidgetIntInt eventMouseMove; - - /** Event : Mouse wheel over widget.\n - signature : void method(MyGUI::Widget* _sender, int _rel)\n - @param _sender widget that called this event - @param _rel relative wheel position - */ - EventHandle_WidgetInt eventMouseWheel; - - /** Event : Mouse button pressed.\n - signature : void method(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)\n - @param _sender widget that called this event - @param _left - pointer position - @param _top - pointer position - @param _id Mouse button id - */ - EventHandle_WidgetIntIntButton eventMouseButtonPressed; - - /** Event : Mouse button released.\n - signature : void method(MyGUI::Widget* _sender, int _left, int _top, MyGUI::MouseButton _id)\n - @param _sender widget that called this event - @param _left - pointer position - @param _top - pointer position - @param _id Mouse button id - */ - EventHandle_WidgetIntIntButton eventMouseButtonReleased; - - /** Event : Mouse button pressed and released.\n - signature : void method(MyGUI::Widget* _sender) - @param _sender widget that called this event - */ - EventHandle_WidgetVoid eventMouseButtonClick; - - /** Event : Mouse button double click.\n - signature : void method(MyGUI::Widget* _sender) - @param _sender widget that called this event - */ - EventHandle_WidgetVoid eventMouseButtonDoubleClick; - - /** Event : Widget lost keyboard focus.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::Widget* _new)\n - @param _sender widget that called this event - @param _new widget with keyboard focus or nullptr - */ - EventHandle_WidgetWidget eventKeyLostFocus; - - /** Event : Widget got keyboard focus.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::Widget* _old)\n - @param _sender widget that called this event - @param _old widget with keyboard focus or nullptr - */ - EventHandle_WidgetWidget eventKeySetFocus; - - /** Event : Key pressed.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::KeyCode _key, MyGUI::Char _char)\n - @param _sender widget that called this event - @param _key code - @param _char of pressed symbol (for multilanguage applications) - */ - EventHandle_WidgetKeyCodeChar eventKeyButtonPressed; - - /** Event : Key released.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::KeyCode _key)\n - @param _sender widget that called this event - @param _key code - */ - EventHandle_WidgetKeyCode eventKeyButtonReleased; - - /** Event : Root widget changed mouse focus.\n - info : this event sends only to root widget\n - signature : void method(MyGUI::Widget* _sender, bool _focus); - @param _sender widget that called this event - @param _focus Is widget got mouse focus. - */ - EventHandle_WidgetBool eventRootMouseChangeFocus; - - /** Event : Root widget changed keyboard focus.\n - info : this event sends only to root widget\n - signature : void method(MyGUI::Widget* _sender, bool _focus); - @param _sender widget that called this event - @param _focus Is widget got keyboard focus. - */ - EventHandle_WidgetBool eventRootKeyChangeFocus; - - /** Event : Event about changing tooltip state.\n - signature : void method(MyGUI::Widget* _sender, const MyGUI::ToolTipInfo& _info); - @param _sender widget that called this event - @param _info about tooltip - */ - EventHandle_WidgetToolTip eventToolTip; - - /** Event : Extendeble event for special cases or plugins.\n - signature : void method(MyGUI::Widget* _sender, const std::string& _key, const std::string& _value); - @param _sender widget that called this event - @param _key - @param _value - */ - EventHandle_WidgetStringString eventActionInfo; - - /** Event : Internal request for parent and item index, used for any widget.\n - signature : void method(MyGUI::Widget* _sender, MyGUI::Widget*& _container, size_t& _index); - @param _sender widget that called this event - @param _container parent - @param _index of container - */ - EventHandle_WidgetRefWidgetRefSizeT _requestGetContainer; - - /** Event : Widget property changed through setProperty (in code, or from layout)\n - signature : void method(MyGUI::Widget* _sender, const std::string& _key, const std::string& _value); - @param _sender widget that called this event - @param _key - @param _value - */ - EventHandle_WidgetStringString eventChangeProperty; - - protected: - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseLostFocus(Widget* _new) - { - eventMouseLostFocus(mWidgetEventSender, _new); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseSetFocus(Widget* _old) - { - eventMouseSetFocus(mWidgetEventSender, _old); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseDrag(int _left, int _top) - { - eventMouseDrag(mWidgetEventSender, _left, _top); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseMove(int _left, int _top) - { - eventMouseMove(mWidgetEventSender, _left, _top); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseWheel(int _rel) - { - eventMouseWheel(mWidgetEventSender, _rel); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id) - { - eventMouseButtonPressed(mWidgetEventSender, _left, _top, _id); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id) - { - eventMouseButtonReleased(mWidgetEventSender, _left, _top, _id); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseButtonClick() - { - eventMouseButtonClick(mWidgetEventSender); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseButtonDoubleClick() - { - eventMouseButtonDoubleClick(mWidgetEventSender); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onKeyLostFocus(Widget* _new) - { - eventKeyLostFocus(mWidgetEventSender, _new); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onKeySetFocus(Widget* _old) - { - eventKeySetFocus(mWidgetEventSender, _old); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onKeyButtonPressed(KeyCode _key, Char _char) - { - eventKeyButtonPressed(mWidgetEventSender, _key, _char); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onKeyButtonReleased(KeyCode _key) - { - eventKeyButtonReleased(mWidgetEventSender, _key); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onMouseChangeRootFocus(bool _focus) - { - eventRootMouseChangeFocus(mWidgetEventSender, _focus); - } - - // !!! ОБЯЗÐТЕЛЬÐО в родительÑком клаÑÑе вызывать поÑледним - virtual void onKeyChangeRootFocus(bool _focus) - { - eventRootKeyChangeFocus(mWidgetEventSender, _focus); - } - - // от чьего имени мы поÑылаем ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ - Widget* mWidgetEventSender; - - private: - bool mRootMouseActive; - bool mRootKeyActive; - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_EVENT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetManager.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetManager.h deleted file mode 100644 index dad77b7bb..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetManager.h +++ /dev/null @@ -1,130 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_MANAGER_H__ -#define __MYGUI_WIDGET_MANAGER_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Instance.h" -#include "MyGUI_IWidgetCreator.h" -#include "MyGUI_IUnlinkWidget.h" -#include "MyGUI_ICroppedRectangle.h" -#include "MyGUI_Widget.h" -#include - -namespace MyGUI -{ - - //OBSOLETE - typedef delegates::CDelegate3 ParseDelegate; - - class MYGUI_EXPORT WidgetManager - { - MYGUI_INSTANCE_HEADER( WidgetManager ) - - public: - //OBSOLETE - typedef std::map MapDelegate; - //OBSOLETE - typedef std::set SetWidgetFactory; - - public: - void initialise(); - void shutdown(); - - Widget* createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _cropeedParent, IWidgetCreator * _creator, const std::string& _name); - - /** Destroy _widget */ - void destroyWidget(Widget* _widget); - /** Destroy vector of widgets */ - void destroyWidgets(const VectorWidgetPtr &_widgets); - /** Destroy Enumerator of widgets */ - void destroyWidgets(EnumeratorWidgetPtr _widgets); - - /** Register unlinker (call unlink if for any destroyed widget)*/ - void registerUnlinker(IUnlinkWidget * _unlink); - /** Unregister unlinker (call unlink if for any destroyed widget)*/ - void unregisterUnlinker(IUnlinkWidget * _unlink); - /** Unlink widget */ - void unlinkFromUnlinkers(Widget* _widget); - - // добавлÑет виджет в ÑпиÑок Ð´Ð»Ñ Ð°Ð½Ð»Ð¸Ð½ÐºÐ° - void addWidgetToUnlink(Widget* _widget); - - // проверÑет, и еÑли надо обнулÑет виджет из ÑпиÑка анликнутых - void removeWidgetFromUnlink(Widget*& _widget); - - bool isFactoryExist(const std::string& _type); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void WidgetManager::destroyWidgets(VectorWidgetPtr &_widgets)") - void destroyWidgetsVector(VectorWidgetPtr &_widgets) { destroyWidgets(_widgets); } - MYGUI_OBSOLETE("") - Widget* findWidgetT(const std::string& _name, bool _throw = true); - MYGUI_OBSOLETE("") - Widget* findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw = true); - MYGUI_OBSOLETE("") - void registerFactory(IWidgetFactory * _factory); - MYGUI_OBSOLETE("") - void unregisterFactory(IWidgetFactory * _factory); - MYGUI_OBSOLETE("use : void Widget::setProperty(const std::string &_key, const std::string &_value)") - void parse(Widget* _widget, const std::string &_key, const std::string &_value); - MYGUI_OBSOLETE("") - ParseDelegate& registerDelegate(const std::string& _key); - MYGUI_OBSOLETE("") - void unregisterDelegate(const std::string& _key); - - template - MYGUI_OBSOLETE("") - T* findWidget(const std::string& _name, bool _throw = true) - { - Widget* widget = findWidgetT(_name, _throw); - if (nullptr == widget) return nullptr; - return widget->castType(_throw); - } - - template - MYGUI_OBSOLETE("") - T* findWidget(const std::string& _name, const std::string& _prefix, bool _throw = true) - { - return findWidget(_prefix + _name, _throw); - } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - SetWidgetFactory mFactoryList; - //MapWidgetPtr mWidgets; - MapDelegate mDelegates; - - // ÑпиÑок менеджеров Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ð¸Ñки при удалении - VectorIUnlinkWidget mVectorIUnlinkWidget; - - // ÑпиÑок виджетов Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ð¸Ñки - VectorWidgetPtr mUnlinkWidgets; - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_MANAGER_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetStyle.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetStyle.h deleted file mode 100644 index a0d3998ee..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetStyle.h +++ /dev/null @@ -1,91 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_TYPE_H__ -#define __MYGUI_WIDGET_TYPE_H__ - -#include "MyGUI_Prerequest.h" -#include - -namespace MyGUI -{ - - struct MYGUI_EXPORT WidgetStyle - { - enum Enum - { - Child, /**< child widget, cropped by parent widget borders, no overlapping (used by default for child widgets) */ - Popup, /**< popup widget, have parent widget, but not cropped on its borders */ - Overlapped, /**< child widget, cropped by parent widget borders, can overlap (used by default for root widgets) */ - MAX - }; - - static WidgetStyle parse(const std::string& _value) - { - WidgetStyle type; - int value = 0; - while (true) - { - const char * name = type.getValueName(value); - if (strcmp(name, "") == 0 || name == _value) break; - value++; - } - type.value = (Enum)value; - return type; - } - - WidgetStyle() : value(MAX) { } - WidgetStyle(Enum _value) : value(_value) { } - - friend bool operator == (WidgetStyle const& a, WidgetStyle const& b) { return a.value == b.value; } - friend bool operator != (WidgetStyle const& a, WidgetStyle const& b) { return a.value != b.value; } - - friend std::ostream& operator << ( std::ostream& _stream, const WidgetStyle& _value ) - { - _stream << _value.getValueName(_value.value); - return _stream; - } - - friend std::istream& operator >> ( std::istream& _stream, WidgetStyle& _value ) - { - std::string value; - _stream >> value; - _value = WidgetStyle::parse(value); - return _stream; - } - - std::string print() const { return getValueName(value); } - - private: - const char * getValueName(int _index) const - { - static const char * values[MAX + 1] = { "Child", "Popup", "Overlapped", "" }; - return values[(_index < MAX && _index >= 0) ? _index : MAX]; - } - - private: - Enum value; - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_TYPE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetToolTip.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetToolTip.h deleted file mode 100644 index d2ba7f051..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetToolTip.h +++ /dev/null @@ -1,55 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 07/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_TOOLTIP_H__ -#define __MYGUI_WIDGET_TOOLTIP_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Types.h" -#include "MyGUI_WidgetToolTip.h" - -namespace MyGUI -{ - - /** Info about tootip state */ - struct ToolTipInfo - { - enum ToolTipType - { - Hide, - Show - }; - - ToolTipInfo(ToolTipType _type) : - type(_type), index(ITEM_NONE) { } - - ToolTipInfo(ToolTipType _type, size_t _index, const IntPoint& _point) : - type(_type), index(_index), point(_point) { } - - ToolTipType type; - size_t index; - IntPoint point; - }; - -} // namespace MyGUI - -#endif //__MYGUI_WIDGET_TOOLTIP_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetTranslate.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetTranslate.h deleted file mode 100644 index 3fb930a5c..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetTranslate.h +++ /dev/null @@ -1,72 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 05/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_TRANSLATE_H__ -#define __MYGUI_WIDGET_TRANSLATE_H__ - -#include "MyGUI_Prerequest.h" - -namespace MyGUI -{ - - inline int getWidgetWidth(Widget* _widget, bool _vert) - { - return _vert ? _widget->getWidth() : _widget->getHeight(); - } - - inline int getWidgetHeight(Widget* _widget, bool _vert) - { - return _vert ? _widget->getHeight() : _widget->getWidth(); - } - - inline int getWidgetLeft(Widget* _widget, bool _vert) - { - return _vert ? _widget->getLeft() : _widget->getTop(); - } - - inline int getWidgetTop(Widget* _widget, bool _vert) - { - return _vert ? _widget->getTop() : _widget->getLeft(); - } - - inline void setWidgetSize(Widget* _widget, int _width, int _height, bool _vert) - { - _vert ? _widget->setSize(_width, _height) : _widget->setSize(_height, _width); - } - - inline void setWidgetCoord(Widget* _widget, int _left, int _top, int _width, int _height, bool _vert) - { - _vert ? _widget->setCoord(_left, _top, _width, _height) : _widget->setCoord(_top, _left, _height, _width); - } - - inline void convertWidgetCoord(IntCoord& _coord, bool _vert) - { - if ( ! _vert ) - { - std::swap(_coord.left, _coord.top); - std::swap(_coord.width, _coord.height); - } - } - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_TRANSLATE_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetUserData.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetUserData.h deleted file mode 100644 index fd807d076..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_WidgetUserData.h +++ /dev/null @@ -1,123 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WIDGET_USER_DATA_H__ -#define __MYGUI_WIDGET_USER_DATA_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_WidgetDefines.h" -#include "MyGUI_Any.h" - -namespace MyGUI -{ - /** UserData is parent of Widget class. Used to store any user data and strings inside widget */ - class MYGUI_EXPORT UserData - { - public: - UserData() { } - virtual ~UserData() { } - - /** Set user string */ - void setUserString(const std::string& _key, const std::string& _value) - { - mMapUserString[_key] = _value; - } - - /** Get user string or "" if not found */ - const std::string& getUserString(const std::string& _key) - { - MapString::iterator iter = mMapUserString.find(_key); - if (iter == mMapUserString.end()) - { - static std::string empty; - return empty; - } - return iter->second; - } - - /** Delete user string */ - bool clearUserString(const std::string& _key) - { - MapString::iterator iter = mMapUserString.find(_key); - if (iter != mMapUserString.end()) - { - mMapUserString.erase(iter); - return true; - } - return false; - } - - /** Return true if user string with such key exist */ - bool isUserString(const std::string& _key) - { - return mMapUserString.find(_key) != mMapUserString.end(); - } - - /** Delete all user strings */ - void clearUserStrings() - { - mMapUserString.clear(); - } - - /** Set any user data to store inside widget */ - void setUserData(Any _data) { mUserData = _data; } - - /** Get user data and cast it to ValueType */ - template - ValueType * getUserData(bool _throw = true) - { - return mUserData.castType(_throw); - } - - /*internal:*/ - void _setInternalData(Any _data) { mInternalData = _data; } - - template - ValueType * _getInternalData(bool _throw = true) - { - return mInternalData.castType(_throw); - } - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : template ValueType * UserData::getUserData(bool _throw)") - void * getUserData() - { - return mUserData.castUnsafe(); - } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - // пользовательÑкие данные - MapString mMapUserString; - Any mUserData; - - // Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸ÐµÐ³Ð¾ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ - Any mInternalData; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_WIDGET_USER_DATA_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Window.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Window.h deleted file mode 100644 index 12f4685d7..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_Window.h +++ /dev/null @@ -1,197 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_WINDOW_H__ -#define __MYGUI_WINDOW_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_Widget.h" -#include "MyGUI_EventPair.h" -#include "MyGUI_ControllerFadeAlpha.h" - -namespace MyGUI -{ - - // OBSOLETE - typedef delegates::CDelegate2 EventHandle_WidgetString; - typedef delegates::CDelegate2 EventHandle_WindowPtrCStringRef; - typedef delegates::CDelegate1 EventHandle_WindowPtr; - - class MYGUI_EXPORT Window : - public Widget - { - MYGUI_RTTI_DERIVED( Window ) - - public: - Window(); - - /** @copydoc Widget::setVisible */ - virtual void setVisible(bool _value); - - /** Hide or show window smooth */ - void setVisibleSmooth(bool _value); - /** Hide window smooth and then destroy it */ - void destroySmooth(); - - /** Enable or disable auto alpha mode */ - void setAutoAlpha(bool _value); - /** Get auto alpha mode flag */ - bool getAutoAlpha() { return mIsAutoAlpha; } - - /** Set window caption */ - virtual void setCaption(const UString& _value); - /** Get window caption */ - virtual const UString& getCaption(); - - /** Get window caption widget */ - Widget* getCaptionWidget() { return mWidgetCaption; } - - /** Set minimal possible window size */ - void setMinSize(const IntSize& _value); - /** Set minimal possible window size */ - void setMinSize(int _width, int _height) { setMinSize(IntSize(_width, _height)); } - /** Get minimal possible window size */ - IntSize getMinSize(); - - /** Set maximal possible window size */ - void setMaxSize(const IntSize& _value); - /** Set maximal possible window size */ - void setMaxSize(int _width, int _height) { setMaxSize(IntSize(_width, _height)); } - /** Get maximal possible window size */ - IntSize getMaxSize(); - - //! @copydoc Widget::setPosition(const IntPoint& _value) - virtual void setPosition(const IntPoint& _value); - //! @copydoc Widget::setSize(const IntSize& _value) - virtual void setSize(const IntSize& _value); - //! @copydoc Widget::setCoord(const IntCoord& _value) - virtual void setCoord(const IntCoord& _value); - - /** @copydoc Widget::setPosition(int _left, int _top) */ - void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } - /** @copydoc Widget::setSize(int _width, int _height) */ - void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } - /** @copydoc Widget::setCoord(int _left, int _top, int _width, int _height) */ - void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } - - /** Get snap to borders mode flag */ - bool getSnap() { return mSnap; } - /** Enable or disable snap to borders mode */ - void setSnap(bool _value) { mSnap = _value; } - - /** @copydoc Widget::setProperty(const std::string& _key, const std::string& _value) */ - virtual void setProperty(const std::string& _key, const std::string& _value); - - /*event:*/ - /** Event : Window button pressed.\n - signature : void method(MyGUI::Window* _sender, const std::string& _name) - @param _sender widget that called this event - @param _name of pressed button - */ - EventPair eventWindowButtonPressed; - - /** Event : Window coordinate changed (window was resized or moved).\n - signature : void method(MyGUI::Window* _sender) - @param _sender widget that called this event - */ - EventPair eventWindowChangeCoord; - - /*internal:*/ - virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") - void setPosition(const IntCoord& _coord) { setCoord(_coord); } - MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") - void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } - MYGUI_OBSOLETE("use : void setVisibleSmooth(bool _visible)") - void showSmooth(bool _reset = false) { setVisibleSmooth(true); } - MYGUI_OBSOLETE("use : void setVisibleSmooth(bool _visible)") - void hideSmooth() { setVisibleSmooth(false); } - MYGUI_OBSOLETE("use : void setMinSize(const IntSize& _min) , void setMaxSize(const IntSize& _min)") - void setMinMax(const IntRect& _minmax) { setMinSize(_minmax.left, _minmax.top); setMaxSize(_minmax.right, _minmax.bottom); } - MYGUI_OBSOLETE("use : void setMinSize(const IntSize& _min) , void setMaxSize(const IntSize& _min)") - void setMinMax(int _min_w, int _min_h, int _max_w, int _max_h) { setMinSize(_min_w, _min_h); setMaxSize(_max_w, _max_h); } - MYGUI_OBSOLETE("use : IntSize getMinSize() , IntSize getMaxSize()") - IntRect getMinMax() { return IntRect(getMinSize().width, getMinSize().height, getMaxSize().width, getMaxSize().height); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - protected: - virtual ~Window(); - - void baseChangeWidgetSkin(ResourceSkin* _info); - - // переопределÑем Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñвоению клиенту - virtual Widget* baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name); - - void onMouseChangeRootFocus(bool _focus); - void onKeyChangeRootFocus(bool _focus); - void onMouseDrag(int _left, int _top); - void onMouseButtonPressed(int _left, int _top, MouseButton _id); - - void notifyMousePressed(MyGUI::Widget* _sender, int _left, int _top, MouseButton _id); - void notifyPressedButtonEvent(MyGUI::Widget* _sender); - void notifyMouseDrag(MyGUI::Widget* _sender, int _left, int _top); - - // проÑто обновлÑет альфу взавиÑимоÑти от флагов - void updateAlpha(); - - void animateStop(Widget* _widget); - - private: - void initialiseWidgetSkin(ResourceSkin* _info); - void shutdownWidgetSkin(); - - float getAlphaVisible(); - void getSnappedCoord(IntCoord& _coord); - - ControllerFadeAlpha* createControllerFadeAlpha(float _alpha, float _coef, bool _enable); - - private: - Widget* mWidgetCaption; - - // размеры окна перед началом его изменений - IntCoord mPreActionCoord; - - // наши главные фокуÑÑ‹ - bool mMouseRootFocus; - bool mKeyRootFocus; - - // автоматичеÑкое или ручное управление альфой - bool mIsAutoAlpha; - - // минимальные и макÑимальные размеры окна - IntRect mMinmax; - - bool mSnap; // прилеплÑÑ‚ÑŒ ли к краÑм - - IntCoord mCurrentActionScale; - bool mAnimateSmooth; - - }; - -} // namespace MyGUI - -#endif // __MYGUI_WINDOW_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_XmlDocument.h b/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_XmlDocument.h deleted file mode 100644 index fbcdba788..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/include/MyGUI_XmlDocument.h +++ /dev/null @@ -1,334 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#ifndef __MYGUI_XML_DOCUMENT_H__ -#define __MYGUI_XML_DOCUMENT_H__ - -#include "MyGUI_Prerequest.h" -#include "MyGUI_UString.h" -#include "MyGUI_Diagnostic.h" -#include "MyGUI_DataStream.h" - -#include -#include -#include -#include -#include -#include - -namespace MyGUI -{ - namespace xml - { - - struct ElementType - { - enum Enum - { - Comment, - Declaration, - Normal, - MAX - }; - - ElementType(Enum _value = MAX) : value(_value) { } - friend bool operator == (ElementType const& a, ElementType const& b) { return a.value == b.value; } - friend bool operator != (ElementType const& a, ElementType const& b) { return a.value != b.value; } - - private: - Enum value; - }; - - struct ErrorType - { - enum Enum - { - OpenFileFail, - CreateFileFail, - IncorrectContent, - NotClosedElements, - NoXMLDeclaration, - CloseNotOpenedElement, - InconsistentOpenCloseElements, - MoreThanOneXMLDeclaration, - MoreThanOneRootElement, - IncorrectAttribute, - MAX - }; - - ErrorType(Enum _value = MAX) : value(_value) { } - - std::string print() const { return getValueName(value); } - - private: - const char * getValueName(int _index) const - { - static const char * values[MAX + 1] = - { - "Failed to open XML file", - "Failed to ceate XML file", - "XML file contain incorrect content", - "XML file contain not closed elements", - "XML file without declaration", - "XML file contain closed but not opened element", - "XML file contain inconsistent elements", - "XML file contain more than one declaration", - "XML file contain more than one root element", - "XML file contain incorrect attribute", - "" - }; - return values[(_index < MAX && _index >= 0) ? _index : MAX]; - } - private: - Enum value; - }; - - class Element; - class Document; - - typedef Element * ElementPtr; - typedef std::pair PairAttribute; - typedef std::vector VectorAttributes; - typedef std::vector VectorElement; - - //----------------------------------------------------------------------// - // class ElementEnumerator - //----------------------------------------------------------------------// - class MYGUI_EXPORT ElementEnumerator - { - friend class Element; - - private: - ElementEnumerator(VectorElement::iterator _begin, VectorElement::iterator _end); - - public: - bool next(); - bool next(const std::string& _name); - - ElementPtr operator->() const { assert(m_current != m_end); return (*m_current); } - ElementPtr current() { assert(m_current != m_end); return (*m_current); } - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : bool ElementEnumerator::next()") - bool nextNode() { return next(); } - MYGUI_OBSOLETE("use : bool ElementEnumerator::next(const std::string& _name)") - bool nextNode(const std::string& _name) { return next(_name); } - MYGUI_OBSOLETE("use : ElementPtr ElementEnumerator::current()") - ElementPtr currentNode() { return current(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - bool m_first; - VectorElement::iterator m_current, m_end; - }; - - - //----------------------------------------------------------------------// - // class Element - //----------------------------------------------------------------------// - class MYGUI_EXPORT Element - { - friend class Document; - - public: - ~Element(); - - private: - Element(const std::string &_name, ElementPtr _parent, ElementType _type = ElementType::Normal, const std::string& _content = ""); - void save(std::ostream& _stream, size_t _level); - - public: - ElementPtr createChild(const std::string& _name, const std::string& _content = ""); - - template - void addAttribute(const std::string &_key, const T& _value) - { - mAttributes.push_back(PairAttribute(_key, utility::toString(_value))); - } - - void addAttribute(const std::string& _key, const std::string& _value); - - void removeAttribute(const std::string& _key); - - void setAttribute(const std::string& _key, const std::string& _value); - - template - void addContent(const T& _content) - { - mContent.empty() ? mContent = utility::toString(_content) : mContent += utility::toString(" ", _content); - } - - void addContent(const std::string& _content); - - template - void setContent(const T& _content) - { - mContent = utility::toString(_content); - } - - void setContent(const std::string& _content) { mContent = _content; } - - void clear(); - - bool findAttribute(const std::string& _name, std::string& _value); - std::string findAttribute(const std::string& _name); - - const std::string& getName() const { return mName; } - const std::string& getContent() const { return mContent; } - const VectorAttributes& getAttributes() const { return mAttributes; } - ElementPtr getParent() const { return mParent; } - - ElementEnumerator getElementEnumerator() { return ElementEnumerator(mChilds.begin(), mChilds.end()); } - - ElementType getType() const { return mType; } - - ElementPtr createCopy(); - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - template - MYGUI_OBSOLETE("use : template void Element::addAttribute(const std::string &_key, const T& _value)") - void addAttributes(const std::string &_key, const T& _value) { addAttribute(_key, _value); } - MYGUI_OBSOLETE("use : void Element::addAttribute(const std::string& _key, const std::string& _value)") - void addAttributes(const std::string& _key, const std::string& _value) { addAttribute(_key, _value); } - - template - MYGUI_OBSOLETE("use : template void Element::addContent(const T& _content)") - void addBody(const T& _content) { addContent(_content); } - MYGUI_OBSOLETE("use : void Element::addContent(const std::string& _content)") - void addBody(const std::string& _content) { addContent(_content); } - template - MYGUI_OBSOLETE("use : template void Element::setContent(const T& _content)") - void setBody(const T& _content) { setContent(_content); } - MYGUI_OBSOLETE("use : void Element::setContent(const std::string& _content)") - void setBody(const std::string& _content) { setContent(_content); } - - MYGUI_OBSOLETE("use : const std::string& Element::getContent()") - const std::string& getBody() { return getContent(); } - MYGUI_OBSOLETE("use : ElementEnumerator Element::getElementEnumerator()") - ElementEnumerator getNodeIterator() { return getElementEnumerator(); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - std::string mName; - std::string mContent; - VectorAttributes mAttributes; - VectorElement mChilds; - ElementPtr mParent; - ElementType mType; - }; - - //----------------------------------------------------------------------// - // class Document - //----------------------------------------------------------------------// - class MYGUI_EXPORT Document - { - public: - Document(); - ~Document(); - - // открывает обычным файлом, Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° в utf8 - bool open(const std::string& _filename); - - // открывает обычным файлом, Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° в utf16 или utf32 - bool open(const std::wstring& _filename); - - // открывает обычным потоком - bool open(std::istream& _stream); - - bool open(const UString& _filename) { return open(_filename.asWStr()); } - - bool open(IDataStream* _data); - - // ÑохранÑет файл - bool save(const std::string& _filename); - - // ÑохранÑет файл - bool save(const std::wstring& _filename); - - bool save(std::ostream& _stream); - - bool save(const UString& _filename) { return save(_filename.asWStr()); } - - void clear(); - - std::string getLastError(); - - void clearLastError() { mLastError = ErrorType::MAX; } - - ElementPtr createDeclaration(const std::string& _version = "1.0", const std::string& _encoding = "UTF-8"); - ElementPtr createRoot(const std::string& _name); - - ElementPtr getRoot() const { return mRoot; } - - /*obsolete:*/ -#ifndef MYGUI_DONT_USE_OBSOLETE - - MYGUI_OBSOLETE("use : ElementPtr Document::createDeclaration(const std::string& _version, const std::string& _encoding)") - ElementPtr createInfo(const std::string& _version = "1.0", const std::string& _encoding = "UTF-8") { return createDeclaration(_version, _encoding); } - -#endif // MYGUI_DONT_USE_OBSOLETE - - private: - void setLastFileError(const std::string& _filename) { mLastErrorFile = _filename; } - - void setLastFileError(const std::wstring& _filename) { mLastErrorFile = UString(_filename).asUTF8(); } - - bool parseTag(ElementPtr &_currentNode, std::string _content); - - bool checkPair(std::string &_key, std::string &_value); - - bool parseLine(std::string& _line, ElementPtr& _element); - - // ищет Ñимвол без учета ковычек - size_t find(const std::string& _text, char _char, size_t _start = 0); - - void clearDeclaration(); - void clearRoot(); - - private: - ElementPtr mRoot; - ElementPtr mDeclaration; - ErrorType mLastError; - std::string mLastErrorFile; - size_t mLine; - size_t mCol; - - }; // class Document - - MYGUI_OBSOLETE("use : class MyGUI::xml::ElementEnumerator") - typedef ElementEnumerator xmlNodeIterator; - MYGUI_OBSOLETE("use : class MyGUI::xml::ElementPtr") - typedef ElementPtr xmlNodePtr; - MYGUI_OBSOLETE("use : class MyGUI::xml::Document") - typedef Document xmlDocument; - - } // namespace xml - -} // namespace MyGUI - -#endif // __MYGUI_XML_DOCUMENT_H__ diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ActionController.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ActionController.cpp deleted file mode 100644 index 86904bd6f..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ActionController.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 03/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -#include "MyGUI_Precompiled.h" -#include "MyGUI_ActionController.h" -#include "MyGUI_Widget.h" -#include "MyGUI_WidgetManager.h" - -namespace MyGUI -{ - - namespace action - { - - void actionWidgetHide(Widget* _widget) - { - _widget->setVisible(false); - } - - void actionWidgetShow(Widget* _widget) - { - _widget->setVisible(true); - } - - void actionWidgetDestroy(Widget* _widget) - { - WidgetManager::getInstance().destroyWidget(_widget); - } - - void linearMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _k) - { - _result.set(_startRect.left - int( float(_startRect.left - _destRect.left) * _k ), - _startRect.top - int( float(_startRect.top - _destRect.top) * _k ), - _startRect.width - int( float(_startRect.width - _destRect.width) * _k ), - _startRect.height - int( float(_startRect.height - _destRect.height) * _k ) - ); - } - - void inertionalMoveFunction(const IntCoord& _startRect, const IntCoord& _destRect, IntCoord& _result, float _current_time) - { -#ifndef M_PI - const float M_PI = 3.141593f; -#endif - float k = sin(M_PI * _current_time - M_PI/2.0f); - if (k<0) k = (-pow(-k, 0.7f) + 1)/2; - else k = (pow(k, 0.7f) + 1)/2; - linearMoveFunction(_startRect, _destRect, _result, k); - } - - } // namespace action - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Any.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Any.cpp deleted file mode 100644 index 09a5f9544..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Any.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 10/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ - -#include "MyGUI_Precompiled.h" -#include "MyGUI_Any.h" - -namespace MyGUI -{ - - Any::AnyEmpty Any::Null; - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Button.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Button.cpp deleted file mode 100644 index 771402030..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Button.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#include "MyGUI_Precompiled.h" -#include "MyGUI_Button.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_StaticImage.h" -#include "MyGUI_InputManager.h" - -namespace MyGUI -{ - - Button::Button() : - mIsMousePressed(false), - mIsMouseFocus(false), - mIsStateCheck(false), - mImage(nullptr), - mModeImage(false) - { - } - - void Button::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) - { - Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name); - - initialiseWidgetSkin(_info); - } - - Button::~Button() - { - shutdownWidgetSkin(); - } - - void Button::baseChangeWidgetSkin(ResourceSkin* _info) - { - shutdownWidgetSkin(); - Base::baseChangeWidgetSkin(_info); - initialiseWidgetSkin(_info); - } - - void Button::initialiseWidgetSkin(ResourceSkin* _info) - { - // парÑим ÑвойÑтва - const MapString& properties = _info->getProperties(); - if (!properties.empty()) - { - MapString::const_iterator iter = properties.find("ButtonPressed"); - if (iter != properties.end()) setButtonPressed(utility::parseValue(iter->second)); - iter = properties.find("StateCheck"); - if (iter != properties.end()) setStateCheck(utility::parseValue(iter->second)); - iter = properties.find("ModeImage"); - if (iter != properties.end()) setModeImage(utility::parseValue(iter->second)); - } - - for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter) - { - if (*(*iter)->_getInternalData() == "Image") - { - MYGUI_DEBUG_ASSERT( ! mImage, "widget already assigned"); - mImage = (*iter)->castType(); - } - } - } - - void Button::shutdownWidgetSkin() - { - mImage = nullptr; - } - - void Button::onMouseSetFocus(Widget* _old) - { - _setMouseFocus(true); - - Base::onMouseSetFocus(_old); - } - - void Button::onMouseLostFocus(Widget* _new) - { - _setMouseFocus(false); - - Base::onMouseLostFocus(_new); - } - - void Button::onMouseButtonPressed(int _left, int _top, MouseButton _id) - { - if (_id == MouseButton::Left) - { - mIsMousePressed = true; - updateButtonState(); - } - - Base::onMouseButtonPressed(_left, _top, _id); - } - - void Button::onMouseButtonReleased(int _left, int _top, MouseButton _id) - { - if (_id == MouseButton::Left) - { - mIsMousePressed = false; - updateButtonState(); - } - - Base::onMouseButtonReleased(_left, _top, _id); - } - - void Button::setImageIndex(size_t _index) - { - if (mImage) mImage->setImageIndex(_index); - } - - size_t Button::getImageIndex() - { - if (mImage) return mImage->getImageIndex(); - return ITEM_NONE; - } - - void Button::updateButtonState() - { - if (mIsStateCheck) - { - if (!mEnabled) { if (!_setState("disabled_checked")) _setState("disabled"); } - else if (mIsMousePressed) { if (!_setState("pushed_checked")) _setState("pushed"); } - else if (mIsMouseFocus) { if (!_setState("highlighted_checked")) _setState("pushed"); } - else _setState("normal_checked"); - } - else - { - if (!mEnabled) _setState("disabled"); - else if (mIsMousePressed) _setState("pushed"); - else if (mIsMouseFocus) _setState("highlighted"); - else _setState("normal"); - } - } - - void Button::setStateCheck(bool _check) - { - if (mIsStateCheck == _check) return; - mIsStateCheck = _check; - updateButtonState(); - } - - void Button::_setMouseFocus(bool _focus) - { - mIsMouseFocus = _focus; - updateButtonState(); - } - - void Button::setProperty(const std::string& _key, const std::string& _value) - { - /// @wproperty{Button, Button_Pressed, bool} Set pressed state. - if (_key == "Button_Pressed") setButtonPressed(utility::parseValue(_value)); - else if (_key == "Button_ModeImage") setModeImage(utility::parseValue(_value)); - else if (_key == "Button_ImageResource") setImageResource(_value); - else - { - Base::setProperty(_key, _value); - return; - } - eventChangeProperty(this, _key, _value); - } - - void Button::baseUpdateEnable() - { - updateButtonState(); - if (!mEnabled) - { - mIsMouseFocus = false; - } - } - - void Button::setModeImage(bool _value) - { - mModeImage = _value; - updateButtonState(); - } - - bool Button::_setState(const std::string& _value) - { - if (mModeImage) - { - if (mImage) - mImage->setItemName(_value); - - setState(_value); - return true; - } - - return setState(_value); - } - - void Button::setImageResource(const std::string& _name) - { - if (mImage) - mImage->setItemResource(_name); - updateButtonState(); - } - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Canvas.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Canvas.cpp deleted file mode 100644 index 34948bfe4..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Canvas.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/*! - @file - @author Alexander Ptakhin - @date 01/2009 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#include "MyGUI_Precompiled.h" -#include "MyGUI_Canvas.h" -#include "MyGUI_ResourceManager.h" -#include "MyGUI_Gui.h" -#include "MyGUI_RenderManager.h" -#include "MyGUI_Bitwise.h" - -namespace MyGUI -{ - - Canvas::Canvas() : - mTexture( nullptr ), - mTexResizeMode( TRM_PT_CONST_SIZE ), - mTexData( 0 ), - mTexManaged( true ), - mFrameAdvise( false ) - { - mGenTexName = utility::toString( this, "_Canvas" ); - } - - void Canvas::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) - { - Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name); - } - - Canvas::~Canvas() - { - _destroyTexture( false ); - } - - void Canvas::createTexture( TextureResizeMode _resizeMode, TextureUsage _usage, PixelFormat _format ) - { - createTexture( getSize(), _resizeMode, _usage, _format ); - } - - void Canvas::createTexture( const IntSize& _size, TextureResizeMode _resizeMode, TextureUsage _usage, PixelFormat _format ) - { - if ( _size.width <= 0 || _size.height <= 0 ) - { - MYGUI_ASSERT( 0, "At least one of dimensions isn't positive!" ); - return; - } - - createTexture( _size.width, _size.height, _resizeMode, _usage, _format ); - } - - void Canvas::createExactTexture( int _width, int _height, TextureUsage _usage, PixelFormat _format ) - { - MYGUI_ASSERT( _width >= 0 && _height >= 0, "negative size" ); - - destroyTexture(); - - mTexture = RenderManager::getInstance().createTexture(mGenTexName); - mTexture->setInvalidateListener(this); - mTexture->createManual( _width, _height, _usage, _format ); - - mTexManaged = true; - - _setTextureName( mGenTexName ); - correctUV(); - requestUpdateCanvas( this, Event( true, true, false ) ); - } - - void Canvas::resize( const IntSize& _size ) - { - if ( _size.width <= 0 || _size.height <= 0 || ! mTexManaged ) - return; - - mReqTexSize = _size; - - frameAdvise( true ); - } - - void Canvas::createTexture( int _width, int _height, TextureResizeMode _resizeMode, TextureUsage _usage, PixelFormat _format ) - { - MYGUI_ASSERT( _width >= 0 && _height >= 0, "negative size" ); - - if ( mReqTexSize.empty() ) - mReqTexSize = IntSize( _width, _height ); - - mTexResizeMode = _resizeMode; - - bool create = checkCreate( _width, _height ); - - _width = Bitwise::firstPO2From(_width); - _height = Bitwise::firstPO2From(_height); - - if ( create ) - createExactTexture( _width, _height, _usage, _format ); - } - - void Canvas::setSize( const IntSize& _size ) - { - resize( _size ); - - Base::setSize( _size ); - } - - void Canvas::setCoord( const IntCoord& _coord ) - { - resize( _coord.size() ); - - Base::setCoord( _coord ); - } - - void Canvas::updateTexture() - { - requestUpdateCanvas( this, Event( false, false, true ) ); - } - - bool Canvas::checkCreate( int _width, int _height ) const - { - if ( mTexture == nullptr ) - return true; - - if ( mTexture->getWidth() >= _width && mTexture->getHeight() >= _height ) - return false; - - return true; - } - - void Canvas::validate( int& _width, int& _height, TextureUsage& _usage, PixelFormat& _format ) const - { - _width = Bitwise::firstPO2From(_width); - _height = Bitwise::firstPO2From(_height); - - // restore usage and format - if ( mTexture != nullptr ) - { - if ( _usage == getDefaultTextureUsage() ) - _usage = mTexture->getUsage(); - - if ( _format == getDefaultTextureFormat() ) - _format = mTexture->getFormat(); - } - } - - void Canvas::destroyTexture() - { - _destroyTexture( true ); - } - - void Canvas::_destroyTexture( bool _sendEvent ) - { - if ( mTexture != nullptr ) - { - if ( _sendEvent ) - { - eventPreTextureChanges( this ); - } - - RenderManager::getInstance().destroyTexture( mTexture ); - mTexture = nullptr; - } - - } - - void Canvas::correctUV() - { - if ( mTexResizeMode == TRM_PT_VIEW_REQUESTED ) - { - _setUVSet( FloatRect( 0, 0, - (float) mReqTexSize.width / (float) getTextureRealWidth(), - (float) mReqTexSize.height / (float) getTextureRealHeight() - ) ); - } - - if ( mTexResizeMode == TRM_PT_CONST_SIZE || mTexResizeMode == TRM_PT_VIEW_ALL ) - { - _setUVSet( FloatRect( 0, 0, 1, 1 ) ); - } - } - - void* Canvas::lock(TextureUsage _usage) - { - void* data = mTexture->lock(_usage); - - mTexData = reinterpret_cast< uint8* >( data ); - - return data; - } - - void Canvas::unlock() - { - mTexture->unlock(); - } - - void Canvas::baseChangeWidgetSkin( ResourceSkin* _info ) - { - Base::baseChangeWidgetSkin( _info ); - } - - void Canvas::initialiseWidgetSkin( ResourceSkin* _info ) - { - } - - void Canvas::shutdownWidgetSkin() - { - } - - bool Canvas::isTextureSrcSize() const - { - return getTextureSrcSize() == getTextureRealSize(); - } - - void Canvas::frameAdvise( bool _advise ) - { - if ( _advise ) - { - if ( ! mFrameAdvise ) - { - MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate( this, &Canvas::frameEntered ); - mFrameAdvise = true; - } - } - else - { - if ( mFrameAdvise ) - { - MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate( this, &Canvas::frameEntered ); - mFrameAdvise = false; - } - } - } - - void Canvas::frameEntered( float _time ) - { - int width = mReqTexSize.width; - int height = mReqTexSize.height; - TextureUsage usage = getDefaultTextureUsage(); - PixelFormat format = getDefaultTextureFormat(); - - validate( width, height, usage, format ); - - bool create = checkCreate( width, height ); - - if ( mTexResizeMode == TRM_PT_CONST_SIZE ) - create = false; - - if ( create ) - { - createExactTexture( width, height, usage, format ); - correctUV(); - } - else // I thought order is important - { - correctUV(); - requestUpdateCanvas( this, Event( false, true, false ) ); - } - - frameAdvise( false ); - } - - void Canvas::textureInvalidate(ITexture* _texture) - { - updateTexture(); - } - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ClipboardManager.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ClipboardManager.cpp deleted file mode 100644 index 0de57f43d..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ClipboardManager.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 11/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#include "MyGUI_Precompiled.h" -#include "MyGUI_ClipboardManager.h" -#include "MyGUI_Gui.h" -#include "MyGUI_TextIterator.h" - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 -#include -#endif - -namespace MyGUI -{ - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 - - HWND g_hWnd = NULL; - - BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam) - { - DWORD dwProcessID = 0; - ::GetWindowThreadProcessId(hWnd, &dwProcessID); - - if (dwProcessID != (DWORD)lParam) - return TRUE; - - if (::GetParent(hWnd) == NULL) - { - // Ðашли. hWnd - то что надо - g_hWnd = hWnd; - return FALSE; - } - - return TRUE; - } - - BOOL CALLBACK EnumChildWindowProc(HWND hWnd, LPARAM lParam) - { - DWORD dwProcessID = 0; - ::GetWindowThreadProcessId(hWnd, &dwProcessID); - - if (dwProcessID != ::GetCurrentProcessId()) - return TRUE; - -#ifdef _M_X64 - if (::GetWindowLongPtr(hWnd, GWLP_HINSTANCE) == lParam) -#else - if (::GetWindowLong(hWnd, GWL_HINSTANCE) == lParam) -#endif - { - // Ðашли. hWnd - то что надо - g_hWnd = hWnd; - return FALSE; - } - - return TRUE; - } - -#endif - - MYGUI_INSTANCE_IMPLEMENT( ClipboardManager ) - - void ClipboardManager::initialise() - { - MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice"); - MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME); - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 - // берем Ð¸Ð¼Ñ Ð½Ð°ÑˆÐµÐ³Ð¾ Ñкзешника - char buf[MAX_PATH]; - ::GetModuleFileName(0, (LPCH)&buf, MAX_PATH); - // берем инÑÑ‚Ð°Ð½Ñ Ð½Ð°ÑˆÐµÐ³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ - HINSTANCE instance = ::GetModuleHandle(buf); - - ::EnumChildWindows(::GetDesktopWindow(), (WNDENUMPROC)EnumWindowProc, (LPARAM)instance); - mHwnd = (size_t)g_hWnd; - -#endif - - MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized"); - mIsInitialise = true; - } - - void ClipboardManager::shutdown() - { - if (!mIsInitialise) return; - MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME); - - MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown"); - mIsInitialise = false; - } - - void ClipboardManager::setClipboardData(const std::string& _type, const std::string& _data) - { - mClipboardData[_type] = _data; - -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 - if (_type == "Text") - { - mPutTextInClipboard = TextIterator::getOnlyText(UString(_data)); - size_t size = (mPutTextInClipboard.size() + 1) * 2; - //открываем буфер обмена - if (::OpenClipboard((HWND)mHwnd)) - { - ::EmptyClipboard(); //очищаем буфер - HGLOBAL hgBuffer = ::GlobalAlloc(GMEM_DDESHARE, size);//выделÑем памÑÑ‚ÑŒ - wchar_t * chBuffer = NULL; - if ((hgBuffer) && (chBuffer = (wchar_t*)GlobalLock(hgBuffer))) - { - ::memcpy(chBuffer, mPutTextInClipboard.asWStr_c_str(), size); - ::GlobalUnlock(hgBuffer);//разблокируем памÑÑ‚ÑŒ - ::SetClipboardData(CF_UNICODETEXT, hgBuffer);//помещаем текÑÑ‚ в буфер обмена - } - ::CloseClipboard(); //закрываем буфер обмена - } - } -#endif - } - - void ClipboardManager::clearClipboardData(const std::string& _type) - { - MapString::iterator iter = mClipboardData.find(_type); - if (iter != mClipboardData.end()) mClipboardData.erase(iter); - } - - std::string ClipboardManager::getClipboardData(const std::string& _type) - { -#if MYGUI_PLATFORM == MYGUI_PLATFORM_WIN32 - if (_type == "Text") - { - UString buff; - //открываем буфер обмена - if ( ::OpenClipboard((HWND)mHwnd) ) - { - HANDLE hData = ::GetClipboardData(CF_UNICODETEXT);//извлекаем текÑÑ‚ из буфера обмена - wchar_t * chBuffer = NULL; - if ((hData) && (chBuffer = (wchar_t*)::GlobalLock(hData))) - { - buff = chBuffer; - ::GlobalUnlock(hData);//разблокируем памÑÑ‚ÑŒ - } - ::CloseClipboard();//закрываем буфер обмена - } - // еÑли в буфере не то что мы ложили, то берем из буфера - if (mPutTextInClipboard != buff) - { - // вÑтавлÑем теги, еÑли нуно - const UString& text = TextIterator::toTagsString(buff); - return text.asUTF8(); - } - - MapString::iterator iter = mClipboardData.find(_type); - if (iter != mClipboardData.end()) return (*iter).second; - return ""; - } -#endif - - MapString::iterator iter = mClipboardData.find(_type); - if (iter != mClipboardData.end()) return (*iter).second; - return ""; - } - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Colour.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Colour.cpp deleted file mode 100644 index 804736cd8..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_Colour.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2008 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#include "MyGUI_Precompiled.h" -#include "MyGUI_Colour.h" - -namespace MyGUI -{ - - const Colour Colour::Zero = Colour(0, 0, 0, 0); - const Colour Colour::Black = Colour(0, 0, 0, 1); - const Colour Colour::White = Colour(1, 1, 1, 1); - const Colour Colour::Red = Colour(1, 0, 0, 1); - const Colour Colour::Green = Colour(0, 1, 0, 1); - const Colour Colour::Blue = Colour(0, 0, 1, 1); - -} // namespace MyGUI diff --git a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ComboBox.cpp b/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ComboBox.cpp deleted file mode 100644 index 3fde498e8..000000000 --- a/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ComboBox.cpp +++ /dev/null @@ -1,438 +0,0 @@ -/*! - @file - @author Albert Semenov - @date 12/2007 - @module -*/ -/* - This file is part of MyGUI. - - MyGUI is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MyGUI 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with MyGUI. If not, see . -*/ -#include "MyGUI_Precompiled.h" -#include "MyGUI_ComboBox.h" -#include "MyGUI_ControllerManager.h" -#include "MyGUI_InputManager.h" -#include "MyGUI_WidgetManager.h" -#include "MyGUI_Gui.h" -#include "MyGUI_List.h" -#include "MyGUI_Button.h" -#include "MyGUI_ResourceSkin.h" -#include "MyGUI_LayerManager.h" - -namespace MyGUI -{ - - const float COMBO_ALPHA_MAX = ALPHA_MAX; - const float COMBO_ALPHA_MIN = ALPHA_MIN; - const float COMBO_ALPHA_COEF = 4.0f; - - ComboBox::ComboBox() : - mButton(nullptr), - mList(nullptr), - mListShow(false), - mMaxHeight(0), - mItemIndex(ITEM_NONE), - mModeDrop(false), - mDropMouse(false), - mShowSmooth(false), - mManualList(true) - { - } - - void ComboBox::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name) - { - Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name); - - initialiseWidgetSkin(_info); - } - - ComboBox::~ComboBox() - { - shutdownWidgetSkin(); - } - - void ComboBox::baseChangeWidgetSkin(ResourceSkin* _info) - { - shutdownWidgetSkin(); - Base::baseChangeWidgetSkin(_info); - initialiseWidgetSkin(_info); - } - - void ComboBox::initialiseWidgetSkin(ResourceSkin* _info) - { - // парÑим ÑвойÑтва - const MapString& properties = _info->getProperties(); - if (!properties.empty()) - { - MapString::const_iterator iter = properties.find("HeightList"); - if (iter != properties.end()) mMaxHeight = utility::parseValue(iter->second); - - iter = properties.find("ListSmoothShow"); - if (iter != properties.end()) setSmoothShow(utility::parseBool(iter->second)); - } - - // парÑим кнопку - for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter) - { - if (*(*iter)->_getInternalData() == "Button") - { - MYGUI_DEBUG_ASSERT( ! mButton, "widget already assigned"); - mButton = (*iter)->castType