mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-31 14:36:39 +00:00
Merge branch 'master' into fix_quickkey_segfalt
This commit is contained in:
commit
cac6d59140
18 changed files with 83 additions and 55 deletions
|
@ -1,26 +1,26 @@
|
||||||
# use the official gcc image, based on debian
|
stages:
|
||||||
# can use verions as well, like gcc:5.2
|
- build
|
||||||
# see https://hub.docker.com/_/gcc/
|
|
||||||
image: gcc
|
|
||||||
|
|
||||||
cache:
|
Debian:
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- linux
|
||||||
|
image: gcc
|
||||||
|
cache:
|
||||||
key: apt-cache
|
key: apt-cache
|
||||||
paths:
|
paths:
|
||||||
- apt-cache/
|
- apt-cache/
|
||||||
|
before_script:
|
||||||
before_script:
|
|
||||||
- export APT_CACHE_DIR=`pwd`/apt-cache && mkdir -pv $APT_CACHE_DIR
|
- export APT_CACHE_DIR=`pwd`/apt-cache && mkdir -pv $APT_CACHE_DIR
|
||||||
- apt-get update -yq
|
- apt-get update -yq
|
||||||
- apt-get -o dir::cache::archives="$APT_CACHE_DIR" install -y cmake libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsdl2-dev libqt4-dev libopenal-dev libopenscenegraph-3.4-dev libunshield-dev libtinyxml-dev
|
- apt-get -o dir::cache::archives="$APT_CACHE_DIR" install -y cmake libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsdl2-dev libqt4-dev libopenal-dev libopenscenegraph-3.4-dev libunshield-dev libtinyxml-dev
|
||||||
# - apt-get install -y libmygui-dev libbullet-dev # to be updated to latest below because stretch is too old
|
# - apt-get install -y libmygui-dev libbullet-dev # to be updated to latest below because stretch is too old
|
||||||
- curl http://ftp.us.debian.org/debian/pool/main/b/bullet/libbullet-dev_2.87+dfsg-2_amd64.deb -o libbullet-dev_2.87+dfsg-2_amd64.deb
|
- curl http://ftp.us.debian.org/debian/pool/main/b/bullet/libbullet-dev_2.87+dfsg-2_amd64.deb -o libbullet-dev_2.87+dfsg-2_amd64.deb
|
||||||
- curl http://ftp.us.debian.org/debian/pool/main/b/bullet/libbullet2.87_2.87+dfsg-2_amd64.deb -o libbullet2.87_2.87+dfsg-2_amd64.deb
|
- curl http://ftp.us.debian.org/debian/pool/main/b/bullet/libbullet2.87_2.87+dfsg-2_amd64.deb -o libbullet2.87_2.87+dfsg-2_amd64.deb
|
||||||
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmygui.openglplatform0debian1v5_3.2.2+dfsg-1_amd64.deb -o libmygui.openglplatform0debian1v5_3.2.2+dfsg-1_amd64.deb
|
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmygui.openglplatform0debian1v5_3.2.2+dfsg-1_amd64.deb -o libmygui.openglplatform0debian1v5_3.2.2+dfsg-1_amd64.deb
|
||||||
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmyguiengine3debian1v5_3.2.2+dfsg-1_amd64.deb -o libmyguiengine3debian1v5_3.2.2+dfsg-1_amd64.deb
|
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmyguiengine3debian1v5_3.2.2+dfsg-1_amd64.deb -o libmyguiengine3debian1v5_3.2.2+dfsg-1_amd64.deb
|
||||||
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmygui-dev_3.2.2+dfsg-1_amd64.deb -o libmygui-dev_3.2.2+dfsg-1_amd64.deb
|
- curl http://ftp.us.debian.org/debian/pool/main/m/mygui/libmygui-dev_3.2.2+dfsg-1_amd64.deb -o libmygui-dev_3.2.2+dfsg-1_amd64.deb
|
||||||
- dpkg --ignore-depends=libmygui.ogreplatform0debian1v5 -i *.deb
|
- dpkg --ignore-depends=libmygui.ogreplatform0debian1v5 -i *.deb
|
||||||
|
|
||||||
build:
|
|
||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
- cores_to_use=$((`nproc`-2)); if (( $cores_to_use < 1 )); then cores_to_use=1; fi
|
- cores_to_use=$((`nproc`-2)); if (( $cores_to_use < 1 )); then cores_to_use=1; fi
|
||||||
|
@ -30,13 +30,17 @@ build:
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- build/artifacts/
|
- build/artifacts/
|
||||||
# depending on your build setup it's most likely a good idea to cache outputs to reduce the build time
|
MacOS:
|
||||||
cache:
|
tags:
|
||||||
|
- macos
|
||||||
|
- xcode
|
||||||
|
stage: build
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
- rm -fr build/* # remove anything in the build directory
|
||||||
|
- CI/before_install.osx.sh
|
||||||
|
- CI/before_script.osx.sh
|
||||||
|
- cd build; make -j2 package
|
||||||
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- "*.o"
|
- build/OpenMW-*.dmg
|
||||||
|
|
||||||
# TODO: run tests using the binary built before
|
|
||||||
#test:
|
|
||||||
# stage: test
|
|
||||||
# script:
|
|
||||||
# - ls
|
|
|
@ -15,7 +15,6 @@ env:
|
||||||
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
||||||
# via the "travis encrypt" command using the project repo's public key
|
# via the "travis encrypt" command using the project repo's public key
|
||||||
- secure: "jybGzAdUbqt9vWR/GEnRd96BgAi/7Zd1+2HK68j/i/8+/1YH2XxLOy4Jv/DUBhBlJIkxs/Xv8dRcUlFOclZDHX1d/9Qnsqd3oUVkD7k1y7cTOWy9TBQaE/v/kZo3LpzA3xPwwthrb0BvqIbOfIELi5fS5s8ba85WFRg3AX70wWE="
|
- secure: "jybGzAdUbqt9vWR/GEnRd96BgAi/7Zd1+2HK68j/i/8+/1YH2XxLOy4Jv/DUBhBlJIkxs/Xv8dRcUlFOclZDHX1d/9Qnsqd3oUVkD7k1y7cTOWy9TBQaE/v/kZo3LpzA3xPwwthrb0BvqIbOfIELi5fS5s8ba85WFRg3AX70wWE="
|
||||||
- macos_qt_formula=qt
|
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
Bug #4036: Weird behaviour of AI packages if package target has non-unique ID
|
Bug #4036: Weird behaviour of AI packages if package target has non-unique ID
|
||||||
Bug #4047: OpenMW not reporting its version number in MacOS; OpenMW-CS not doing it fully
|
Bug #4047: OpenMW not reporting its version number in MacOS; OpenMW-CS not doing it fully
|
||||||
Bug #4125: OpenMW logo cropped on bugtracker
|
Bug #4125: OpenMW logo cropped on bugtracker
|
||||||
Bug #4215: OpenMW shows book text after last <BR> tag
|
Bug #4215: OpenMW shows book text after last EOL tag
|
||||||
Bug #4221: Characters get stuck in V-shaped terrain
|
Bug #4221: Characters get stuck in V-shaped terrain
|
||||||
Bug #4251: Stationary NPCs do not return to their position after combat
|
Bug #4251: Stationary NPCs do not return to their position after combat
|
||||||
Bug #4286: Scripted animations can be interrupted
|
Bug #4286: Scripted animations can be interrupted
|
||||||
|
@ -49,6 +49,7 @@
|
||||||
Bug #4461: "Open" spell from non-player caster isn't a crime
|
Bug #4461: "Open" spell from non-player caster isn't a crime
|
||||||
Bug #4469: Abot Silt Striders – Model turn 90 degrees on horizontal
|
Bug #4469: Abot Silt Striders – Model turn 90 degrees on horizontal
|
||||||
Bug #4471: Retrieve SDL window settings instead of using magic numbers
|
Bug #4471: Retrieve SDL window settings instead of using magic numbers
|
||||||
|
Bug #4474: No fallback when getVampireHead fails
|
||||||
Feature #3276: Editor: Search- Show number of (remaining) search results and indicate a search without any results
|
Feature #3276: Editor: Search- Show number of (remaining) search results and indicate a search without any results
|
||||||
Feature #4222: 360° screenshots
|
Feature #4222: 360° screenshots
|
||||||
Feature #4256: Implement ToggleBorders (TB) console command
|
Feature #4256: Implement ToggleBorders (TB) console command
|
||||||
|
|
|
@ -4,7 +4,7 @@ brew update
|
||||||
|
|
||||||
brew outdated cmake || brew upgrade cmake
|
brew outdated cmake || brew upgrade cmake
|
||||||
brew outdated pkgconfig || brew upgrade pkgconfig
|
brew outdated pkgconfig || brew upgrade pkgconfig
|
||||||
brew install $macos_qt_formula
|
brew install qt
|
||||||
|
|
||||||
curl https://downloads.openmw.org/osx/dependencies/openmw-deps-100d2e0.zip -o ~/openmw-deps.zip
|
curl -fSL -R -J https://downloads.openmw.org/osx/dependencies/openmw-deps-100d2e0.zip -o ~/openmw-deps.zip
|
||||||
unzip ~/openmw-deps.zip -d /private/tmp/openmw-deps > /dev/null
|
unzip -o ~/openmw-deps.zip -d /private/tmp/openmw-deps > /dev/null
|
||||||
|
|
|
@ -4,7 +4,7 @@ export CXX=clang++
|
||||||
export CC=clang
|
export CC=clang
|
||||||
|
|
||||||
DEPENDENCIES_ROOT="/private/tmp/openmw-deps/openmw-deps"
|
DEPENDENCIES_ROOT="/private/tmp/openmw-deps/openmw-deps"
|
||||||
QT_PATH=`brew --prefix $macos_qt_formula`
|
QT_PATH=`brew --prefix qt`
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|
||||||
|
|
|
@ -31,13 +31,16 @@ namespace MWGui
|
||||||
|
|
||||||
boost::algorithm::replace_all(mText, "\r", "");
|
boost::algorithm::replace_all(mText, "\r", "");
|
||||||
|
|
||||||
// vanilla game does not show any text after last <BR> tag.
|
// vanilla game does not show any text after the last EOL tag.
|
||||||
const std::string lowerText = Misc::StringUtils::lowerCase(mText);
|
const std::string lowerText = Misc::StringUtils::lowerCase(mText);
|
||||||
int index = lowerText.rfind("<br>");
|
int brIndex = lowerText.rfind("<br>");
|
||||||
if (index == -1)
|
int pIndex = lowerText.rfind("<p>");
|
||||||
|
if (brIndex == pIndex)
|
||||||
mText = "";
|
mText = "";
|
||||||
|
else if (brIndex > pIndex)
|
||||||
|
mText = mText.substr(0, brIndex+4);
|
||||||
else
|
else
|
||||||
mText = mText.substr(0, index+4);
|
mText = mText.substr(0, pIndex+3);
|
||||||
|
|
||||||
registerTag("br", Event_BrTag);
|
registerTag("br", Event_BrTag);
|
||||||
registerTag("p", Event_PTag);
|
registerTag("p", Event_PTag);
|
||||||
|
|
|
@ -158,7 +158,9 @@ namespace MWGui
|
||||||
|
|
||||||
getWidget(mCrosshair, "Crosshair");
|
getWidget(mCrosshair, "Crosshair");
|
||||||
|
|
||||||
LocalMapBase::init(mMinimap, mCompass, Settings::Manager::getInt("local map hud widget size", "Map"), Settings::Manager::getInt("local map cell distance", "Map"));
|
int mapSize = std::max(1, Settings::Manager::getInt("local map hud widget size", "Map"));
|
||||||
|
int cellDistance = std::max(1, Settings::Manager::getInt("local map cell distance", "Map"));
|
||||||
|
LocalMapBase::init(mMinimap, mCompass, mapSize, cellDistance);
|
||||||
|
|
||||||
mMainWidget->eventMouseButtonClick += MyGUI::newDelegate(this, &HUD::onWorldClicked);
|
mMainWidget->eventMouseButtonClick += MyGUI::newDelegate(this, &HUD::onWorldClicked);
|
||||||
mMainWidget->eventMouseMove += MyGUI::newDelegate(this, &HUD::onWorldMouseOver);
|
mMainWidget->eventMouseMove += MyGUI::newDelegate(this, &HUD::onWorldMouseOver);
|
||||||
|
|
|
@ -679,7 +679,9 @@ namespace MWGui
|
||||||
mEventBoxLocal->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
mEventBoxLocal->eventMouseButtonPressed += MyGUI::newDelegate(this, &MapWindow::onDragStart);
|
||||||
mEventBoxLocal->eventMouseButtonDoubleClick += MyGUI::newDelegate(this, &MapWindow::onMapDoubleClicked);
|
mEventBoxLocal->eventMouseButtonDoubleClick += MyGUI::newDelegate(this, &MapWindow::onMapDoubleClicked);
|
||||||
|
|
||||||
LocalMapBase::init(mLocalMap, mPlayerArrowLocal, Settings::Manager::getInt("local map widget size", "Map"), Settings::Manager::getInt("local map cell distance", "Map"));
|
int mapSize = std::max(1, Settings::Manager::getInt("local map widget size", "Map"));
|
||||||
|
int cellDistance = std::max(1, Settings::Manager::getInt("local map cell distance", "Map"));
|
||||||
|
LocalMapBase::init(mLocalMap, mPlayerArrowLocal, mapSize, cellDistance);
|
||||||
|
|
||||||
mGlobalMap->setVisible(mGlobal);
|
mGlobalMap->setVisible(mGlobal);
|
||||||
mLocalMap->setVisible(!mGlobal);
|
mLocalMap->setVisible(!mGlobal);
|
||||||
|
|
|
@ -416,6 +416,7 @@ void NpcAnimation::updateNpcBase()
|
||||||
const ESM::Race *race = store.get<ESM::Race>().find(mNpc->mRace);
|
const ESM::Race *race = store.get<ESM::Race>().find(mNpc->mRace);
|
||||||
bool isWerewolf = (mNpcType == Type_Werewolf);
|
bool isWerewolf = (mNpcType == Type_Werewolf);
|
||||||
bool isVampire = (mNpcType == Type_Vampire);
|
bool isVampire = (mNpcType == Type_Vampire);
|
||||||
|
bool isFemale = !mNpc->isMale();
|
||||||
|
|
||||||
if (isWerewolf)
|
if (isWerewolf)
|
||||||
{
|
{
|
||||||
|
@ -425,8 +426,9 @@ void NpcAnimation::updateNpcBase()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mHeadModel = "";
|
mHeadModel = "";
|
||||||
if (isVampire) // FIXME: fall back to regular head when getVampireHead fails?
|
const std::string& vampireHead = getVampireHead(mNpc->mRace, isFemale);
|
||||||
mHeadModel = getVampireHead(mNpc->mRace, mNpc->mFlags & ESM::NPC::Female);
|
if (isVampire && !vampireHead.empty())
|
||||||
|
mHeadModel = vampireHead;
|
||||||
else if (!mNpc->mHead.empty())
|
else if (!mNpc->mHead.empty())
|
||||||
{
|
{
|
||||||
const ESM::BodyPart* bp = store.get<ESM::BodyPart>().search(mNpc->mHead);
|
const ESM::BodyPart* bp = store.get<ESM::BodyPart>().search(mNpc->mHead);
|
||||||
|
@ -448,7 +450,6 @@ void NpcAnimation::updateNpcBase()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBeast = (race->mData.mFlags & ESM::Race::Beast) != 0;
|
bool isBeast = (race->mData.mFlags & ESM::Race::Beast) != 0;
|
||||||
bool isFemale = !mNpc->isMale();
|
|
||||||
|
|
||||||
std::string smodel;
|
std::string smodel;
|
||||||
if (mViewMode != VM_FirstPerson)
|
if (mViewMode != VM_FirstPerson)
|
||||||
|
|
|
@ -240,6 +240,10 @@ namespace MWScript
|
||||||
char type = declarations.getType (iter->first);
|
char type = declarations.getType (iter->first);
|
||||||
int index2 = declarations.getIndex (iter->first);
|
int index2 = declarations.getIndex (iter->first);
|
||||||
|
|
||||||
|
// silently ignore locals that don't exist anymore
|
||||||
|
if (type == ' ' || index2 == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -247,8 +251,6 @@ namespace MWScript
|
||||||
case 's': mShorts.at (index2) = iter->second.getInteger(); break;
|
case 's': mShorts.at (index2) = iter->second.getInteger(); break;
|
||||||
case 'l': mLongs.at (index2) = iter->second.getInteger(); break;
|
case 'l': mLongs.at (index2) = iter->second.getInteger(); break;
|
||||||
case 'f': mFloats.at (index2) = iter->second.getFloat(); break;
|
case 'f': mFloats.at (index2) = iter->second.getFloat(); break;
|
||||||
|
|
||||||
// silently ignore locals that don't exist anymore
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
|
|
|
@ -387,7 +387,7 @@ private:
|
||||||
OpenAL_SoundStream::OpenAL_SoundStream(ALuint src, DecoderPtr decoder)
|
OpenAL_SoundStream::OpenAL_SoundStream(ALuint src, DecoderPtr decoder)
|
||||||
: mSource(src), mCurrentBufIdx(0), mFormat(AL_NONE), mSampleRate(0)
|
: mSource(src), mCurrentBufIdx(0), mFormat(AL_NONE), mSampleRate(0)
|
||||||
, mBufferSize(0), mFrameSize(0), mSilence(0), mDecoder(std::move(decoder))
|
, mBufferSize(0), mFrameSize(0), mSilence(0), mDecoder(std::move(decoder))
|
||||||
, mLoudnessAnalyzer(nullptr)
|
, mLoudnessAnalyzer(nullptr), mIsFinished(true)
|
||||||
{
|
{
|
||||||
mBuffers.fill(0);
|
mBuffers.fill(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1179,8 +1179,8 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool currCellActive = mWorldScene->isCellActive(*currCell);
|
bool currCellActive = currCell && mWorldScene->isCellActive(*currCell);
|
||||||
bool newCellActive = mWorldScene->isCellActive(*newCell);
|
bool newCellActive = newCell && mWorldScene->isCellActive(*newCell);
|
||||||
if (!currCellActive && newCellActive)
|
if (!currCellActive && newCellActive)
|
||||||
{
|
{
|
||||||
newPtr = currCell->moveTo(ptr, newCell);
|
newPtr = currCell->moveTo(ptr, newCell);
|
||||||
|
|
|
@ -83,7 +83,12 @@ struct Land
|
||||||
struct LandData
|
struct LandData
|
||||||
{
|
{
|
||||||
LandData()
|
LandData()
|
||||||
: mDataLoaded(0)
|
: mHeightOffset(0)
|
||||||
|
, mMinHeight(0)
|
||||||
|
, mMaxHeight(0)
|
||||||
|
, mUnk1(0)
|
||||||
|
, mUnk2(0)
|
||||||
|
, mDataLoaded(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,10 @@ struct Pathgrid
|
||||||
Point& operator=(const float[3]);
|
Point& operator=(const float[3]);
|
||||||
Point(const float[3]);
|
Point(const float[3]);
|
||||||
Point();
|
Point();
|
||||||
Point(int x, int y, int z) : mX(x), mY(y), mZ(z) {}
|
Point(int x, int y, int z)
|
||||||
|
: mX(x), mY(y), mZ(z)
|
||||||
|
, mAutogenerated(0), mConnectionNum(0), mUnknown(0)
|
||||||
|
{}
|
||||||
}; // 16 bytes
|
}; // 16 bytes
|
||||||
|
|
||||||
struct Edge // path grid edge
|
struct Edge // path grid edge
|
||||||
|
|
|
@ -34,7 +34,9 @@ namespace ESM
|
||||||
|
|
||||||
ESM::AnimationState mAnimationState;
|
ESM::AnimationState mAnimationState;
|
||||||
|
|
||||||
ObjectState() : mHasCustomState(true), mVersion(0)
|
ObjectState()
|
||||||
|
: mHasLocals(0), mEnabled(0), mCount(0)
|
||||||
|
, mFlags(0), mHasCustomState(true), mVersion(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
/// @note Does not load the CellRef ID, it should already be loaded before calling this method
|
/// @note Does not load the CellRef ID, it should already be loaded before calling this method
|
||||||
|
|
|
@ -24,6 +24,8 @@ namespace ESMTerrain
|
||||||
};
|
};
|
||||||
|
|
||||||
LandObject::LandObject()
|
LandObject::LandObject()
|
||||||
|
: mLand(nullptr)
|
||||||
|
, mLoadFlags(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,7 @@ QuadTreeNode::QuadTreeNode(QuadTreeNode* parent, ChildDirection direction, float
|
||||||
, mValidBounds(false)
|
, mValidBounds(false)
|
||||||
, mSize(size)
|
, mSize(size)
|
||||||
, mCenter(center)
|
, mCenter(center)
|
||||||
|
, mViewDataMap(nullptr)
|
||||||
{
|
{
|
||||||
for (unsigned int i=0; i<4; ++i)
|
for (unsigned int i=0; i<4; ++i)
|
||||||
mNeighbours[i] = 0;
|
mNeighbours[i] = 0;
|
||||||
|
|
|
@ -8,6 +8,7 @@ namespace Gui
|
||||||
WindowCaption::WindowCaption()
|
WindowCaption::WindowCaption()
|
||||||
: mLeft(NULL)
|
: mLeft(NULL)
|
||||||
, mRight(NULL)
|
, mRight(NULL)
|
||||||
|
, mClient(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue