forked from mirror/openmw-tes3mp
Merge remote-tracking branch 'upstream/master' into settingsparser
This commit is contained in:
commit
0e143b1926
22 changed files with 313 additions and 193 deletions
|
@ -15,7 +15,7 @@ include (OpenMWMacros)
|
||||||
# Version
|
# Version
|
||||||
|
|
||||||
set (OPENMW_VERSION_MAJOR 0)
|
set (OPENMW_VERSION_MAJOR 0)
|
||||||
set (OPENMW_VERSION_MINOR 20)
|
set (OPENMW_VERSION_MINOR 21)
|
||||||
set (OPENMW_VERSION_RELEASE 0)
|
set (OPENMW_VERSION_RELEASE 0)
|
||||||
|
|
||||||
set (OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VERSION_RELEASE}")
|
set (OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VERSION_RELEASE}")
|
||||||
|
@ -306,7 +306,7 @@ endif()
|
||||||
|
|
||||||
# Compiler settings
|
# Compiler settings
|
||||||
if (CMAKE_COMPILER_IS_GNUCC)
|
if (CMAKE_COMPILER_IS_GNUCC)
|
||||||
add_definitions (-Wall -Wextra -Wno-unused-parameter -Wno-reorder -std=c++0x -pedantic)
|
add_definitions (-Wall -Wextra -Wno-unused-parameter -Wno-reorder -std=c++98 -pedantic -Wno-long-long)
|
||||||
|
|
||||||
# Silence warnings in OGRE headers. Remove once OGRE got fixed!
|
# Silence warnings in OGRE headers. Remove once OGRE got fixed!
|
||||||
add_definitions (-Wno-ignored-qualifiers)
|
add_definitions (-Wno-ignored-qualifiers)
|
||||||
|
@ -496,7 +496,7 @@ if (WIN32)
|
||||||
# Warnings that aren't enabled normally and don't need to be enabled
|
# Warnings that aren't enabled normally and don't need to be enabled
|
||||||
# They're unneeded and sometimes completely retarded warnings that /Wall enables
|
# They're unneeded and sometimes completely retarded warnings that /Wall enables
|
||||||
# Not going to bother commenting them as they tend to warn on every standard library files
|
# Not going to bother commenting them as they tend to warn on every standard library files
|
||||||
4061 4263 4264 4266 4350 4514 4548 4571 4610 4619 4623 4625 4626 4628 4640 4668 4710 4711 4820 4826 4917 4946
|
4061 4263 4264 4266 4350 4371 4514 4548 4571 4610 4619 4623 4625 4626 4628 4640 4668 4710 4711 4820 4826 4917 4946
|
||||||
|
|
||||||
# Warnings that are thrown on standard libraries and not OpenMW
|
# Warnings that are thrown on standard libraries and not OpenMW
|
||||||
4347 # Non-template function with same name and parameter count as template function
|
4347 # Non-template function with same name and parameter count as template function
|
||||||
|
@ -507,6 +507,11 @@ if (WIN32)
|
||||||
4986 # Undocumented warning that occurs in the crtdbg.h file
|
4986 # Undocumented warning that occurs in the crtdbg.h file
|
||||||
4996 # Function was declared deprecated
|
4996 # Function was declared deprecated
|
||||||
|
|
||||||
|
# cause by ogre extensivly
|
||||||
|
4193 # #pragma warning(pop) : no matching '#pragma warning(push)'
|
||||||
|
4251 # class 'XXXX' needs to have dll-interface to be used by clients of class 'YYYY'
|
||||||
|
4275 # non dll-interface struct 'XXXX' used as base for dll-interface class 'YYYY'
|
||||||
|
|
||||||
# OpenMW specific warnings
|
# OpenMW specific warnings
|
||||||
4099 # Type mismatch, declared class or struct is defined with other type
|
4099 # Type mismatch, declared class or struct is defined with other type
|
||||||
4100 # Unreferenced formal parameter (-Wunused-parameter)
|
4100 # Unreferenced formal parameter (-Wunused-parameter)
|
||||||
|
|
|
@ -1,46 +1,75 @@
|
||||||
|
|
||||||
set (OPENCS_SRC
|
set (OPENCS_SRC main.cpp)
|
||||||
main.cpp editor.cpp
|
|
||||||
|
|
||||||
model/doc/documentmanager.cpp model/doc/document.cpp
|
opencs_units (. editor)
|
||||||
|
|
||||||
model/world/universalid.cpp model/world/idcollection.cpp model/world/data.cpp model/world/idtable.cpp
|
|
||||||
model/world/commands.cpp model/world/idtableproxymodel.cpp model/world/record.cpp
|
|
||||||
model/world/columnbase.cpp
|
|
||||||
|
|
||||||
model/tools/tools.cpp model/tools/operation.cpp model/tools/stage.cpp model/tools/verifier.cpp
|
opencs_units (model/doc
|
||||||
model/tools/mandatoryid.cpp model/tools/reportmodel.cpp
|
document
|
||||||
|
|
||||||
view/doc/viewmanager.cpp view/doc/view.cpp view/doc/operations.cpp view/doc/operation.cpp view/doc/subviewfactory.cpp
|
|
||||||
view/doc/subview.cpp
|
|
||||||
|
|
||||||
view/world/table.cpp view/world/tablesubview.cpp view/world/subviews.cpp view/world/util.cpp
|
|
||||||
view/world/dialoguesubview.cpp
|
|
||||||
|
|
||||||
view/tools/reportsubview.cpp view/tools/subviews.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set (OPENCS_HDR
|
opencs_units_noqt (model/doc
|
||||||
editor.hpp
|
documentmanager
|
||||||
|
|
||||||
model/doc/documentmanager.hpp model/doc/document.hpp model/doc/state.hpp
|
|
||||||
|
|
||||||
model/world/universalid.hpp model/world/record.hpp model/world/idcollection.hpp model/world/data.hpp
|
|
||||||
model/world/idtable.hpp model/world/columns.hpp model/world/idtableproxymodel.hpp
|
|
||||||
model/world/commands.hpp model/world/columnbase.hpp
|
|
||||||
|
|
||||||
model/tools/tools.hpp model/tools/operation.hpp model/tools/stage.hpp model/tools/verifier.hpp
|
|
||||||
model/tools/mandatoryid.hpp model/tools/reportmodel.hpp
|
|
||||||
|
|
||||||
view/doc/viewmanager.hpp view/doc/view.hpp view/doc/operations.hpp view/doc/operation.hpp view/doc/subviewfactory.hpp
|
|
||||||
view/doc/subview.hpp view/doc/subviewfactoryimp.hpp
|
|
||||||
|
|
||||||
view/world/table.hpp view/world/tablesubview.hpp view/world/subviews.hpp view/world/util.hpp
|
|
||||||
view/world/dialoguesubview.hpp
|
|
||||||
|
|
||||||
view/tools/reportsubview.hpp view/tools/subviews.hpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
opencs_hdrs_noqt (model/doc
|
||||||
|
state
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
opencs_units (model/world
|
||||||
|
idtable idtableproxymodel
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_units_noqt (model/world
|
||||||
|
universalid data record idcollection commands columnbase
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_hdrs_noqt (model/world
|
||||||
|
columns
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
opencs_units (model/tools
|
||||||
|
tools operation reportmodel
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_units_noqt (model/tools
|
||||||
|
stage verifier mandatoryid
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
opencs_units (view/doc
|
||||||
|
viewmanager view operations operation subview
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_units_noqt (view/doc
|
||||||
|
subviewfactory
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_hdrs_noqt (view/doc
|
||||||
|
subviewfactoryimp
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
opencs_units (view/world
|
||||||
|
table tablesubview
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_units_noqt (view/world
|
||||||
|
dialoguesubview util subviews
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
opencs_units (view/tools
|
||||||
|
reportsubview
|
||||||
|
)
|
||||||
|
|
||||||
|
opencs_units_noqt (view/tools
|
||||||
|
subviews
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
set (OPENCS_US
|
set (OPENCS_US
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -57,7 +86,7 @@ find_package(Qt4 COMPONENTS QtCore QtGui QtXml QtXmlPatterns REQUIRED)
|
||||||
include(${QT_USE_FILE})
|
include(${QT_USE_FILE})
|
||||||
|
|
||||||
qt4_wrap_ui(OPENCS_UI_HDR ${OPENCS_UI})
|
qt4_wrap_ui(OPENCS_UI_HDR ${OPENCS_UI})
|
||||||
qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR})
|
qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR_QT})
|
||||||
qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES})
|
qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES})
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
|
@ -72,15 +72,20 @@ add_openmw_dir (mwbase
|
||||||
)
|
)
|
||||||
|
|
||||||
# Main executable
|
# Main executable
|
||||||
|
|
||||||
IF(OGRE_STATIC)
|
IF(OGRE_STATIC)
|
||||||
|
ADD_DEFINITIONS(-DENABLE_PLUGIN_OctreeSceneManager -DENABLE_PLUGIN_ParticleFX -DENABLE_PLUGIN_GL)
|
||||||
|
set(OGRE_STATIC_PLUGINS ${OGRE_Plugin_OctreeSceneManager_LIBRARIES} ${OGRE_Plugin_ParticleFX_LIBRARIES} ${OGRE_RenderSystem_GL_LIBRARIES})
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
ADD_DEFINITIONS(-DENABLE_PLUGIN_CgProgramManager -DENABLE_PLUGIN_OctreeSceneManager -DENABLE_PLUGIN_ParticleFX -DENABLE_PLUGIN_-DENABLE_PLUGIN_Direct3D9 -DENABLE_PLUGIN_GL)
|
ADD_DEFINITIONS(-DENABLE_PLUGIN_Direct3D9)
|
||||||
set(OGRE_STATIC_PLUGINS ${OGRE_Plugin_CgProgramManager_LIBRARIES} ${OGRE_Plugin_OctreeSceneManager_LIBRARIES} ${OGRE_Plugin_ParticleFX_LIBRARIES} ${OGRE_RenderSystem_Direct3D9_LIBRARIES} ${OGRE_RenderSystem_GL_LIBRARIES})
|
list (APPEND OGRE_STATIC_PLUGINS ${OGRE_RenderSystem_Direct3D9_LIBRARIES})
|
||||||
ELSE(WIN32)
|
|
||||||
ADD_DEFINITIONS(-DENABLE_PLUGIN_CgProgramManager -DENABLE_PLUGIN_OctreeSceneManager -DENABLE_PLUGIN_ParticleFX -DENABLE_PLUGIN_GL)
|
|
||||||
set(OGRE_STATIC_PLUGINS ${OGRE_Plugin_CgProgramManager_LIBRARIES} ${Cg_LIBRARIES} ${OGRE_Plugin_OctreeSceneManager_LIBRARIES} ${OGRE_Plugin_ParticleFX_LIBRARIES} ${OGRE_RenderSystem_GL_LIBRARIES})
|
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
|
IF (Cg_FOUND)
|
||||||
|
ADD_DEFINITIONS(-DENABLE_PLUGIN_CgProgramManager)
|
||||||
|
list (APPEND OGRE_STATIC_PLUGINS ${OGRE_Plugin_CgProgramManager_LIBRARIES} ${Cg_LIBRARIES})
|
||||||
|
ENDIF (Cg_FOUND)
|
||||||
ENDIF(OGRE_STATIC)
|
ENDIF(OGRE_STATIC)
|
||||||
|
|
||||||
add_executable(openmw
|
add_executable(openmw
|
||||||
${OPENMW_LIBS} ${OPENMW_LIBS_HEADER}
|
${OPENMW_LIBS} ${OPENMW_LIBS_HEADER}
|
||||||
${OPENMW_FILES}
|
${OPENMW_FILES}
|
||||||
|
@ -120,6 +125,12 @@ if(APPLE)
|
||||||
find_library(COCOA_FRAMEWORK Cocoa)
|
find_library(COCOA_FRAMEWORK Cocoa)
|
||||||
find_library(IOKIT_FRAMEWORK IOKit)
|
find_library(IOKIT_FRAMEWORK IOKit)
|
||||||
target_link_libraries(openmw ${CARBON_FRAMEWORK} ${COCOA_FRAMEWORK} ${IOKIT_FRAMEWORK})
|
target_link_libraries(openmw ${CARBON_FRAMEWORK} ${COCOA_FRAMEWORK} ${IOKIT_FRAMEWORK})
|
||||||
|
|
||||||
|
if (FFMPEG_FOUND)
|
||||||
|
find_library(COREVIDEO_FRAMEWORK CoreVideo)
|
||||||
|
find_library(VDA_FRAMEWORK VideoDecodeAcceleration)
|
||||||
|
target_link_libraries(openmw ${COREVIDEO_FRAMEWORK} ${VDA_FRAMEWORK})
|
||||||
|
endif()
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
if(DPKG_PROGRAM)
|
if(DPKG_PROGRAM)
|
||||||
|
|
|
@ -123,6 +123,11 @@ bool MWDialogue::Filter::testSelectStructs (const ESM::DialInfo& info) const
|
||||||
|
|
||||||
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info) const
|
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info) const
|
||||||
{
|
{
|
||||||
|
bool isCreature = (mActor.getTypeName() != typeid (ESM::NPC).name());
|
||||||
|
|
||||||
|
if (isCreature)
|
||||||
|
return true;
|
||||||
|
|
||||||
int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor);
|
int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor);
|
||||||
|
|
||||||
return actorDisposition >= info.mData.mDisposition;
|
return actorDisposition >= info.mData.mDisposition;
|
||||||
|
@ -169,7 +174,7 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for (; i<static_cast<int> (script->mVarNames.size()); ++i)
|
for (; i<static_cast<int> (script->mVarNames.size()); ++i)
|
||||||
if (script->mVarNames[i]==name)
|
if (Misc::StringUtils::lowerCase(script->mVarNames[i]) == name)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (i>=static_cast<int> (script->mVarNames.size()))
|
if (i>=static_cast<int> (script->mVarNames.size()))
|
||||||
|
|
|
@ -203,48 +203,6 @@ unsigned int Moon::getPhaseInt() const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType)
|
|
||||||
{
|
|
||||||
// Get the vertex colour buffer of this mesh
|
|
||||||
const Ogre::VertexElement* ves_diffuse = ent->getMesh()->getSubMesh(0)->vertexData->vertexDeclaration->findElementBySemantic( Ogre::VES_DIFFUSE );
|
|
||||||
HardwareVertexBufferSharedPtr colourBuffer = ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource());
|
|
||||||
|
|
||||||
// Lock
|
|
||||||
void* pData = colourBuffer->lock(HardwareBuffer::HBL_NORMAL);
|
|
||||||
|
|
||||||
// Iterate over all vertices
|
|
||||||
int vertex_size = colourBuffer->getVertexSize();
|
|
||||||
float * currentVertex = NULL;
|
|
||||||
for (unsigned int i=0; i<colourBuffer->getNumVertices(); ++i)
|
|
||||||
{
|
|
||||||
// Get a pointer to the vertex colour
|
|
||||||
ves_diffuse->baseVertexPointerToElement( pData, ¤tVertex );
|
|
||||||
|
|
||||||
unsigned char alpha=0;
|
|
||||||
if (meshType == 0) alpha = i%2 ? 0 : 255; // this is a cylinder, so every second vertex belongs to the bottom-most row
|
|
||||||
else if (meshType == 1)
|
|
||||||
{
|
|
||||||
if (i>= 49 && i <= 64) alpha = 0; // bottom-most row
|
|
||||||
else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row
|
|
||||||
else alpha = 255;
|
|
||||||
}
|
|
||||||
// NB we would have to swap R and B depending on rendersystem specific VertexElementType, but doesn't matter since they are both 1
|
|
||||||
uint8 tmpR = static_cast<uint8>(255);
|
|
||||||
uint8 tmpG = static_cast<uint8>(255);
|
|
||||||
uint8 tmpB = static_cast<uint8>(255);
|
|
||||||
uint8 tmpA = static_cast<uint8>(alpha);
|
|
||||||
|
|
||||||
// Modify
|
|
||||||
*((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24);
|
|
||||||
|
|
||||||
// Move to the next vertex
|
|
||||||
pData = static_cast<unsigned char *> (pData) + vertex_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unlock
|
|
||||||
ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource())->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
|
SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
|
||||||
: mHour(0.0f)
|
: mHour(0.0f)
|
||||||
, mDay(0)
|
, mDay(0)
|
||||||
|
@ -357,7 +315,6 @@ void SkyManager::create()
|
||||||
atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly);
|
atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly);
|
||||||
atmosphere_ent->setVisibilityFlags(RV_Sky);
|
atmosphere_ent->setVisibilityFlags(RV_Sky);
|
||||||
atmosphere_ent->getSubEntity (0)->setMaterialName ("openmw_atmosphere");
|
atmosphere_ent->getSubEntity (0)->setMaterialName ("openmw_atmosphere");
|
||||||
ModVertexAlpha(atmosphere_ent, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -371,8 +328,6 @@ void SkyManager::create()
|
||||||
clouds_ent->setRenderQueueGroup(RQG_SkiesEarly+5);
|
clouds_ent->setRenderQueueGroup(RQG_SkiesEarly+5);
|
||||||
clouds_ent->getSubEntity(0)->setMaterialName ("openmw_clouds");
|
clouds_ent->getSubEntity(0)->setMaterialName ("openmw_clouds");
|
||||||
clouds_ent->setCastShadows(false);
|
clouds_ent->setCastShadows(false);
|
||||||
|
|
||||||
ModVertexAlpha(clouds_ent, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mCreated = true;
|
mCreated = true;
|
||||||
|
|
|
@ -218,8 +218,6 @@ namespace MWRender
|
||||||
float mGlare; // target
|
float mGlare; // target
|
||||||
float mGlareFade; // actual
|
float mGlareFade; // actual
|
||||||
|
|
||||||
void ModVertexAlpha(Ogre::Entity* ent, unsigned int meshType);
|
|
||||||
|
|
||||||
bool mEnabled;
|
bool mEnabled;
|
||||||
bool mSunEnabled;
|
bool mSunEnabled;
|
||||||
bool mMasserEnabled;
|
bool mMasserEnabled;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <OgreTerrain.h>
|
#include <OgreTerrain.h>
|
||||||
#include <OgreTerrainGroup.h>
|
#include <OgreTerrainGroup.h>
|
||||||
#include <OgreHardwarePixelBuffer.h>
|
#include <OgreHardwarePixelBuffer.h>
|
||||||
|
#include <OgreRoot.h>
|
||||||
|
|
||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
|
|
||||||
|
@ -178,6 +179,16 @@ namespace MWRender
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// when loading from a heightmap, Ogre::Terrain does not update the derived data (normal map, LOD)
|
||||||
|
// synchronously, even if we supply synchronous = true parameter to loadTerrain.
|
||||||
|
// the following to be the only way to make sure derived data is ready when rendering the next frame.
|
||||||
|
while (mTerrainGroup.isDerivedDataUpdateInProgress())
|
||||||
|
{
|
||||||
|
// we need to wait for this to finish
|
||||||
|
OGRE_THREAD_SLEEP(5);
|
||||||
|
Root::getSingleton().getWorkQueue()->processResponses();
|
||||||
|
}
|
||||||
|
|
||||||
mTerrainGroup.freeTemporaryResources();
|
mTerrainGroup.freeTemporaryResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,7 @@ void FFmpeg_Decoder::open(const std::string &fname)
|
||||||
{
|
{
|
||||||
if(mFormatCtx->streams[j]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
|
if(mFormatCtx->streams[j]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||||
{
|
{
|
||||||
|
mFormatCtx->streams[j]->codec->request_sample_fmt = AV_SAMPLE_FMT_S16;
|
||||||
mStream = &mFormatCtx->streams[j];
|
mStream = &mFormatCtx->streams[j];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace MWWorld
|
||||||
bool allow = true;
|
bool allow = true;
|
||||||
for(std::vector<ESM::PartReference>::iterator itr = parts.begin(); itr != parts.end(); ++itr)
|
for(std::vector<ESM::PartReference>::iterator itr = parts.begin(); itr != parts.end(); ++itr)
|
||||||
{
|
{
|
||||||
if((*itr).mPart == ESM::PartReferenceType::PRT_Head)
|
if((*itr).mPart == ESM::PRT_Head)
|
||||||
{
|
{
|
||||||
if(actor == MWBase::Environment::get().getWorld()->getPlayer().getPlayer() )
|
if(actor == MWBase::Environment::get().getWorld()->getPlayer().getPlayer() )
|
||||||
MWBase::Environment::get().getWindowManager()->messageBox ("#{sNotifyMessage13}", std::vector<std::string>());
|
MWBase::Environment::get().getWindowManager()->messageBox ("#{sNotifyMessage13}", std::vector<std::string>());
|
||||||
|
|
|
@ -687,15 +687,15 @@ namespace MWWorld
|
||||||
void World::moveObject(const Ptr &ptr, CellStore &newCell, float x, float y, float z)
|
void World::moveObject(const Ptr &ptr, CellStore &newCell, float x, float y, float z)
|
||||||
{
|
{
|
||||||
ESM::Position &pos = ptr.getRefData().getPosition();
|
ESM::Position &pos = ptr.getRefData().getPosition();
|
||||||
pos.pos[0] = x, pos.pos[1] = y, pos.pos[2] = z;
|
pos.pos[0] = x;
|
||||||
|
pos.pos[1] = y;
|
||||||
|
pos.pos[2] = z;
|
||||||
Ogre::Vector3 vec(x, y, z);
|
Ogre::Vector3 vec(x, y, z);
|
||||||
|
|
||||||
CellStore *currCell = ptr.getCell();
|
CellStore *currCell = ptr.getCell();
|
||||||
bool isPlayer = ptr == mPlayer->getPlayer();
|
bool isPlayer = ptr == mPlayer->getPlayer();
|
||||||
bool haveToMove = mWorldScene->isCellActive(*currCell) || isPlayer;
|
bool haveToMove = mWorldScene->isCellActive(*currCell) || isPlayer;
|
||||||
|
|
||||||
removeContainerScripts(ptr);
|
|
||||||
|
|
||||||
if (*currCell != newCell)
|
if (*currCell != newCell)
|
||||||
{
|
{
|
||||||
if (isPlayer)
|
if (isPlayer)
|
||||||
|
@ -707,7 +707,8 @@ namespace MWWorld
|
||||||
int cellY = newCell.mCell->getGridY();
|
int cellY = newCell.mCell->getGridY();
|
||||||
mWorldScene->changeCell(cellX, cellY, pos, false);
|
mWorldScene->changeCell(cellX, cellY, pos, false);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
if (!mWorldScene->isCellActive(*currCell))
|
if (!mWorldScene->isCellActive(*currCell))
|
||||||
copyObjectToCell(ptr, newCell, pos);
|
copyObjectToCell(ptr, newCell, pos);
|
||||||
else if (!mWorldScene->isCellActive(newCell))
|
else if (!mWorldScene->isCellActive(newCell))
|
||||||
|
@ -715,6 +716,7 @@ namespace MWWorld
|
||||||
MWWorld::Class::get(ptr).copyToCell(ptr, newCell);
|
MWWorld::Class::get(ptr).copyToCell(ptr, newCell);
|
||||||
mWorldScene->removeObjectFromScene(ptr);
|
mWorldScene->removeObjectFromScene(ptr);
|
||||||
mLocalScripts.remove(ptr);
|
mLocalScripts.remove(ptr);
|
||||||
|
removeContainerScripts (ptr);
|
||||||
haveToMove = false;
|
haveToMove = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -722,10 +724,18 @@ namespace MWWorld
|
||||||
MWWorld::Ptr copy =
|
MWWorld::Ptr copy =
|
||||||
MWWorld::Class::get(ptr).copyToCell(ptr, newCell);
|
MWWorld::Class::get(ptr).copyToCell(ptr, newCell);
|
||||||
|
|
||||||
addContainerScripts(copy, &newCell);
|
|
||||||
|
|
||||||
mRendering->moveObjectToCell(copy, vec, currCell);
|
mRendering->moveObjectToCell(copy, vec, currCell);
|
||||||
|
|
||||||
|
std::string script =
|
||||||
|
MWWorld::Class::get(ptr).getScript(ptr);
|
||||||
|
if (!script.empty())
|
||||||
|
{
|
||||||
|
mLocalScripts.remove(ptr);
|
||||||
|
removeContainerScripts (ptr);
|
||||||
|
mLocalScripts.add(script, copy);
|
||||||
|
addContainerScripts (copy, &newCell);
|
||||||
|
}
|
||||||
|
|
||||||
if (MWWorld::Class::get(ptr).isActor())
|
if (MWWorld::Class::get(ptr).isActor())
|
||||||
{
|
{
|
||||||
MWBase::MechanicsManager *mechMgr =
|
MWBase::MechanicsManager *mechMgr =
|
||||||
|
@ -734,16 +744,6 @@ namespace MWWorld
|
||||||
mechMgr->removeActor(ptr);
|
mechMgr->removeActor(ptr);
|
||||||
mechMgr->addActor(copy);
|
mechMgr->addActor(copy);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
std::string script =
|
|
||||||
MWWorld::Class::get(ptr).getScript(ptr);
|
|
||||||
if (!script.empty())
|
|
||||||
{
|
|
||||||
mLocalScripts.remove(ptr);
|
|
||||||
mLocalScripts.add(script, copy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ptr.getRefData().setCount(0);
|
ptr.getRefData().setCount(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,3 +29,51 @@ get_filename_component(filename ${f} NAME)
|
||||||
configure_file(${source_dir}/${f} ${destination_dir}/${filename} COPYONLY)
|
configure_file(${source_dir}/${f} ${destination_dir}/${filename} COPYONLY)
|
||||||
endforeach (f)
|
endforeach (f)
|
||||||
endmacro (copy_all_files)
|
endmacro (copy_all_files)
|
||||||
|
|
||||||
|
macro (add_file project type file)
|
||||||
|
list (APPEND ${project}${type} ${file})
|
||||||
|
endmacro (add_file)
|
||||||
|
|
||||||
|
macro (add_unit project dir unit)
|
||||||
|
add_file (${project} _HDR ${comp} "${dir}/${unit}.hpp")
|
||||||
|
add_file (${project} _SRC ${comp} "${dir}/${unit}.cpp")
|
||||||
|
endmacro (add_unit)
|
||||||
|
|
||||||
|
macro (add_qt_unit project dir unit)
|
||||||
|
add_file (${project} _HDR ${comp} "${dir}/${unit}.hpp")
|
||||||
|
add_file (${project} _HDR_QT ${comp} "${dir}/${unit}.hpp")
|
||||||
|
add_file (${project} _SRC ${comp} "${dir}/${unit}.cpp")
|
||||||
|
endmacro (add_qt_unit)
|
||||||
|
|
||||||
|
macro (add_hdr project dir unit)
|
||||||
|
add_file (${project} _HDR ${comp} "${dir}/${unit}.hpp")
|
||||||
|
endmacro (add_hdr)
|
||||||
|
|
||||||
|
macro (add_qt_hdr project dir unit)
|
||||||
|
add_file (${project} _HDR ${comp} "${dir}/${unit}.hpp")
|
||||||
|
add_file (${project} _HDR_QT ${comp} "${dir}/${unit}.hpp")
|
||||||
|
endmacro (add_qt_hdr)
|
||||||
|
|
||||||
|
macro (opencs_units dir)
|
||||||
|
foreach (u ${ARGN})
|
||||||
|
add_qt_unit (OPENCS ${dir} ${u})
|
||||||
|
endforeach (u)
|
||||||
|
endmacro (opencs_units)
|
||||||
|
|
||||||
|
macro (opencs_units_noqt dir)
|
||||||
|
foreach (u ${ARGN})
|
||||||
|
add_unit (OPENCS ${dir} ${u})
|
||||||
|
endforeach (u)
|
||||||
|
endmacro (opencs_units_noqt)
|
||||||
|
|
||||||
|
macro (opencs_hdrs dir)
|
||||||
|
foreach (u ${ARGN})
|
||||||
|
add_qt_hdr (OPENCS ${dir} ${u})
|
||||||
|
endforeach (u)
|
||||||
|
endmacro (opencs_hdrs)
|
||||||
|
|
||||||
|
macro (opencs_hdrs_noqt dir)
|
||||||
|
foreach (u ${ARGN})
|
||||||
|
add_hdr (OPENCS ${dir} ${u})
|
||||||
|
endforeach (u)
|
||||||
|
endmacro (opencs_hdrs_noqt)
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
|
|
||||||
std::string searchable = normalize_path (proper.begin () + prefix, proper.end ());
|
std::string searchable = normalize_path (proper.begin () + prefix, proper.end ());
|
||||||
|
|
||||||
mIndex.insert (std::make_pair (std::move (searchable), std::move (proper)));
|
mIndex.insert (std::make_pair (searchable, proper));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,8 @@
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#ifndef __clang__
|
|
||||||
#include <cstdint>
|
#include <libs/platform/stdint.h>
|
||||||
#else
|
|
||||||
#include <tr1/cstdint>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
|
7
extern/shiny/CMakeLists.txt
vendored
7
extern/shiny/CMakeLists.txt
vendored
|
@ -24,13 +24,6 @@ set(SOURCE_FILES
|
||||||
Main/ShaderSet.cpp
|
Main/ShaderSet.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# In Debug mode, write the shader sources to the current directory
|
|
||||||
if (DEFINED CMAKE_BUILD_TYPE)
|
|
||||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
||||||
add_definitions(-DSHINY_WRITE_SHADER_DEBUG)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (DEFINED SHINY_USE_WAVE_SYSTEM_INSTALL)
|
if (DEFINED SHINY_USE_WAVE_SYSTEM_INSTALL)
|
||||||
# use system install
|
# use system install
|
||||||
else()
|
else()
|
||||||
|
|
82
extern/shiny/Main/Factory.cpp
vendored
82
extern/shiny/Main/Factory.cpp
vendored
|
@ -15,6 +15,7 @@
|
||||||
namespace sh
|
namespace sh
|
||||||
{
|
{
|
||||||
Factory* Factory::sThis = 0;
|
Factory* Factory::sThis = 0;
|
||||||
|
const std::string Factory::mBinaryCacheName = "binaryCache";
|
||||||
|
|
||||||
Factory& Factory::getInstance()
|
Factory& Factory::getInstance()
|
||||||
{
|
{
|
||||||
|
@ -50,7 +51,7 @@ namespace sh
|
||||||
{
|
{
|
||||||
assert(mCurrentLanguage != Language_None);
|
assert(mCurrentLanguage != Language_None);
|
||||||
|
|
||||||
bool anyShaderDirty = false;
|
bool removeBinaryCache = false;
|
||||||
|
|
||||||
if (boost::filesystem::exists (mPlatform->getCacheFolder () + "/lastModified.txt"))
|
if (boost::filesystem::exists (mPlatform->getCacheFolder () + "/lastModified.txt"))
|
||||||
{
|
{
|
||||||
|
@ -182,24 +183,33 @@ namespace sh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sourceFile = mPlatform->getBasePath() + "/" + it->second->findChild("source")->getValue();
|
std::string sourceAbsolute = mPlatform->getBasePath() + "/" + it->second->findChild("source")->getValue();
|
||||||
|
std::string sourceRelative = it->second->findChild("source")->getValue();
|
||||||
|
|
||||||
ShaderSet newSet (it->second->findChild("type")->getValue(), cg_profile, hlsl_profile,
|
ShaderSet newSet (it->second->findChild("type")->getValue(), cg_profile, hlsl_profile,
|
||||||
sourceFile,
|
sourceAbsolute,
|
||||||
mPlatform->getBasePath(),
|
mPlatform->getBasePath(),
|
||||||
it->first,
|
it->first,
|
||||||
&mGlobalSettings);
|
&mGlobalSettings);
|
||||||
|
|
||||||
int lastModified = boost::filesystem::last_write_time (boost::filesystem::path(sourceFile));
|
int lastModified = boost::filesystem::last_write_time (boost::filesystem::path(sourceAbsolute));
|
||||||
if (mShadersLastModified.find(sourceFile) != mShadersLastModified.end()
|
mShadersLastModifiedNew[sourceRelative] = lastModified;
|
||||||
&& mShadersLastModified[sourceFile] != lastModified)
|
if (mShadersLastModified.find(sourceRelative) != mShadersLastModified.end())
|
||||||
{
|
{
|
||||||
newSet.markDirty ();
|
if (mShadersLastModified[sourceRelative] != lastModified)
|
||||||
anyShaderDirty = true;
|
{
|
||||||
|
// delete any outdated shaders based on this shader set
|
||||||
|
if (removeCache (it->first))
|
||||||
|
removeBinaryCache = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if we get here, this is either the first run or a new shader file was added
|
||||||
|
// in both cases we can safely delete
|
||||||
|
if (removeCache (it->first))
|
||||||
|
removeBinaryCache = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mShadersLastModified[sourceFile] = lastModified;
|
|
||||||
|
|
||||||
mShaderSets.insert(std::make_pair(it->first, newSet));
|
mShaderSets.insert(std::make_pair(it->first, newSet));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -293,9 +303,9 @@ namespace sh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mPlatform->supportsShaderSerialization () && mReadMicrocodeCache && !anyShaderDirty)
|
if (mPlatform->supportsShaderSerialization () && mReadMicrocodeCache && !removeBinaryCache)
|
||||||
{
|
{
|
||||||
std::string file = mPlatform->getCacheFolder () + "/shShaderCache.txt";
|
std::string file = mPlatform->getCacheFolder () + "/" + mBinaryCacheName;
|
||||||
if (boost::filesystem::exists(file))
|
if (boost::filesystem::exists(file))
|
||||||
{
|
{
|
||||||
mPlatform->deserializeShaders (file);
|
mPlatform->deserializeShaders (file);
|
||||||
|
@ -307,17 +317,17 @@ namespace sh
|
||||||
{
|
{
|
||||||
if (mPlatform->supportsShaderSerialization () && mWriteMicrocodeCache)
|
if (mPlatform->supportsShaderSerialization () && mWriteMicrocodeCache)
|
||||||
{
|
{
|
||||||
std::string file = mPlatform->getCacheFolder () + "/shShaderCache.txt";
|
std::string file = mPlatform->getCacheFolder () + "/" + mBinaryCacheName;
|
||||||
mPlatform->serializeShaders (file);
|
mPlatform->serializeShaders (file);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mReadSourceCache)
|
if (mReadSourceCache)
|
||||||
{
|
{
|
||||||
// save the last modified time of shader sources
|
// save the last modified time of shader sources (as of when they were loaded)
|
||||||
std::ofstream file;
|
std::ofstream file;
|
||||||
file.open(std::string(mPlatform->getCacheFolder () + "/lastModified.txt").c_str());
|
file.open(std::string(mPlatform->getCacheFolder () + "/lastModified.txt").c_str());
|
||||||
|
|
||||||
for (LastModifiedMap::const_iterator it = mShadersLastModified.begin(); it != mShadersLastModified.end(); ++it)
|
for (LastModifiedMap::const_iterator it = mShadersLastModifiedNew.begin(); it != mShadersLastModifiedNew.end(); ++it)
|
||||||
{
|
{
|
||||||
file << it->first << "\n" << it->second << std::endl;
|
file << it->first << "\n" << it->second << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -580,4 +590,44 @@ namespace sh
|
||||||
assert(m);
|
assert(m);
|
||||||
m->createForConfiguration (configuration, 0);
|
m->createForConfiguration (configuration, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Factory::removeCache(const std::string& pattern)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
if ( boost::filesystem::exists(mPlatform->getCacheFolder())
|
||||||
|
&& boost::filesystem::is_directory(mPlatform->getCacheFolder()))
|
||||||
|
{
|
||||||
|
boost::filesystem::directory_iterator end_iter;
|
||||||
|
for( boost::filesystem::directory_iterator dir_iter(mPlatform->getCacheFolder()) ; dir_iter != end_iter ; ++dir_iter)
|
||||||
|
{
|
||||||
|
if (boost::filesystem::is_regular_file(dir_iter->status()) )
|
||||||
|
{
|
||||||
|
boost::filesystem::path file = dir_iter->path();
|
||||||
|
|
||||||
|
std::string pathname = file.filename().string();
|
||||||
|
|
||||||
|
// get first part of filename, e.g. main_fragment_546457654 -> main_fragment
|
||||||
|
// there is probably a better method for this...
|
||||||
|
std::vector<std::string> tokens;
|
||||||
|
boost::split(tokens, pathname, boost::is_any_of("_"));
|
||||||
|
tokens.erase(--tokens.end());
|
||||||
|
std::string shaderName;
|
||||||
|
for (std::vector<std::string>::const_iterator vector_iter = tokens.begin(); vector_iter != tokens.end();)
|
||||||
|
{
|
||||||
|
shaderName += *(vector_iter++);
|
||||||
|
if (vector_iter != tokens.end())
|
||||||
|
shaderName += "_";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shaderName == pattern)
|
||||||
|
{
|
||||||
|
boost::filesystem::remove(file);
|
||||||
|
ret = true;
|
||||||
|
std::cout << "Removing outdated shader: " << file << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
6
extern/shiny/Main/Factory.hpp
vendored
6
extern/shiny/Main/Factory.hpp
vendored
|
@ -185,6 +185,7 @@ namespace sh
|
||||||
ConfigurationMap mConfigurations;
|
ConfigurationMap mConfigurations;
|
||||||
LodConfigurationMap mLodConfigurations;
|
LodConfigurationMap mLodConfigurations;
|
||||||
LastModifiedMap mShadersLastModified;
|
LastModifiedMap mShadersLastModified;
|
||||||
|
LastModifiedMap mShadersLastModifiedNew;
|
||||||
|
|
||||||
PropertySetGet mGlobalSettings;
|
PropertySetGet mGlobalSettings;
|
||||||
|
|
||||||
|
@ -201,6 +202,11 @@ namespace sh
|
||||||
|
|
||||||
MaterialInstance* findInstance (const std::string& name);
|
MaterialInstance* findInstance (const std::string& name);
|
||||||
MaterialInstance* searchInstance (const std::string& name);
|
MaterialInstance* searchInstance (const std::string& name);
|
||||||
|
|
||||||
|
/// @return was anything removed?
|
||||||
|
bool removeCache (const std::string& pattern);
|
||||||
|
|
||||||
|
static const std::string mBinaryCacheName;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
extern/shiny/Main/ShaderInstance.cpp
vendored
15
extern/shiny/Main/ShaderInstance.cpp
vendored
|
@ -337,8 +337,7 @@ namespace sh
|
||||||
size_t pos;
|
size_t pos;
|
||||||
|
|
||||||
bool readCache = Factory::getInstance ().getReadSourceCache () && boost::filesystem::exists(
|
bool readCache = Factory::getInstance ().getReadSourceCache () && boost::filesystem::exists(
|
||||||
Factory::getInstance ().getCacheFolder () + "/" + mName)
|
Factory::getInstance ().getCacheFolder () + "/" + mName);
|
||||||
&& !mParent->isDirty ();
|
|
||||||
bool writeCache = Factory::getInstance ().getWriteSourceCache ();
|
bool writeCache = Factory::getInstance ().getWriteSourceCache ();
|
||||||
|
|
||||||
|
|
||||||
|
@ -363,12 +362,6 @@ namespace sh
|
||||||
|
|
||||||
if (Factory::getInstance ().getShaderDebugOutputEnabled ())
|
if (Factory::getInstance ().getShaderDebugOutputEnabled ())
|
||||||
writeDebugFile(source, name + ".pre");
|
writeDebugFile(source, name + ".pre");
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef SHINY_WRITE_SHADER_DEBUG
|
|
||||||
writeDebugFile(source, name + ".pre");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// why do we need our own preprocessor? there are several custom commands available in the shader files
|
// why do we need our own preprocessor? there are several custom commands available in the shader files
|
||||||
// (for example for binding uniforms to properties or auto constants) - more below. it is important that these
|
// (for example for binding uniforms to properties or auto constants) - more below. it is important that these
|
||||||
|
@ -648,12 +641,6 @@ namespace sh
|
||||||
|
|
||||||
if (Factory::getInstance ().getShaderDebugOutputEnabled ())
|
if (Factory::getInstance ().getShaderDebugOutputEnabled ())
|
||||||
writeDebugFile(source, name);
|
writeDebugFile(source, name);
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef SHINY_WRITE_SHADER_DEBUG
|
|
||||||
writeDebugFile(source, name);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mProgram->getSupported())
|
if (!mProgram->getSupported())
|
||||||
{
|
{
|
||||||
|
|
1
extern/shiny/Main/ShaderSet.cpp
vendored
1
extern/shiny/Main/ShaderSet.cpp
vendored
|
@ -17,7 +17,6 @@ namespace sh
|
||||||
, mName(name)
|
, mName(name)
|
||||||
, mCgProfile(cgProfile)
|
, mCgProfile(cgProfile)
|
||||||
, mHlslProfile(hlslProfile)
|
, mHlslProfile(hlslProfile)
|
||||||
, mIsDirty(false)
|
|
||||||
{
|
{
|
||||||
if (type == "vertex")
|
if (type == "vertex")
|
||||||
mType = GPT_Vertex;
|
mType = GPT_Vertex;
|
||||||
|
|
7
extern/shiny/Main/ShaderSet.hpp
vendored
7
extern/shiny/Main/ShaderSet.hpp
vendored
|
@ -30,9 +30,6 @@ namespace sh
|
||||||
/// so it does not matter if you pass any extra properties that the shader does not care about.
|
/// so it does not matter if you pass any extra properties that the shader does not care about.
|
||||||
ShaderInstance* getInstance (PropertySetGet* properties);
|
ShaderInstance* getInstance (PropertySetGet* properties);
|
||||||
|
|
||||||
void markDirty() { mIsDirty = true; }
|
|
||||||
///< Signals that the cache is out of date, and thus should not be used this time
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PropertySetGet* getCurrentGlobalSettings() const;
|
PropertySetGet* getCurrentGlobalSettings() const;
|
||||||
std::string getBasePath() const;
|
std::string getBasePath() const;
|
||||||
|
@ -41,12 +38,8 @@ namespace sh
|
||||||
std::string getHlslProfile() const;
|
std::string getHlslProfile() const;
|
||||||
int getType() const;
|
int getType() const;
|
||||||
|
|
||||||
bool isDirty() { return mIsDirty; }
|
|
||||||
|
|
||||||
friend class ShaderInstance;
|
friend class ShaderInstance;
|
||||||
|
|
||||||
bool mIsDirty;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GpuProgramType mType;
|
GpuProgramType mType;
|
||||||
std::string mSource;
|
std::string mSource;
|
||||||
|
|
|
@ -7,19 +7,18 @@
|
||||||
SH_BEGIN_PROGRAM
|
SH_BEGIN_PROGRAM
|
||||||
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
||||||
|
|
||||||
shColourInput(float4)
|
shOutput(float, alphaFade)
|
||||||
shOutput(float4, colourPassthrough)
|
|
||||||
|
|
||||||
SH_START_PROGRAM
|
SH_START_PROGRAM
|
||||||
{
|
{
|
||||||
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
||||||
colourPassthrough = colour;
|
alphaFade = shInputPosition.z < 150.0 ? 0.0 : 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
SH_BEGIN_PROGRAM
|
SH_BEGIN_PROGRAM
|
||||||
shInput(float4, colourPassthrough)
|
shInput(float, alphaFade)
|
||||||
#if MRT
|
#if MRT
|
||||||
shDeclareMrtOutput(1)
|
shDeclareMrtOutput(1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,7 +26,7 @@
|
||||||
|
|
||||||
SH_START_PROGRAM
|
SH_START_PROGRAM
|
||||||
{
|
{
|
||||||
shOutputColour(0) = colourPassthrough * atmosphereColour;
|
shOutputColour(0) = atmosphereColour * float4(1,1,1,alphaFade);
|
||||||
|
|
||||||
#if MRT
|
#if MRT
|
||||||
shOutputColour(1) = float4(1,1,1,1);
|
shOutputColour(1) = float4(1,1,1,1);
|
||||||
|
|
|
@ -8,21 +8,20 @@
|
||||||
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
||||||
shVertexInput(float2, uv0)
|
shVertexInput(float2, uv0)
|
||||||
shOutput(float2, UV)
|
shOutput(float2, UV)
|
||||||
shColourInput(float4)
|
shOutput(float, alphaFade)
|
||||||
shOutput(float4, colourPassthrough)
|
|
||||||
|
|
||||||
SH_START_PROGRAM
|
SH_START_PROGRAM
|
||||||
{
|
{
|
||||||
colourPassthrough = colour;
|
|
||||||
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
||||||
UV = uv0;
|
UV = uv0;
|
||||||
|
alphaFade = (shInputPosition.z <= 200.f) ? ((shInputPosition.z <= 100.f) ? 0.0 : 0.25) : 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
SH_BEGIN_PROGRAM
|
SH_BEGIN_PROGRAM
|
||||||
shInput(float2, UV)
|
shInput(float2, UV)
|
||||||
shInput(float4, colourPassthrough)
|
shInput(float, alphaFade)
|
||||||
#if MRT
|
#if MRT
|
||||||
shDeclareMrtOutput(1)
|
shDeclareMrtOutput(1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -42,7 +41,7 @@
|
||||||
|
|
||||||
float4 albedo = shSample(diffuseMap1, scrolledUV) * (1-cloudBlendFactor) + shSample(diffuseMap2, scrolledUV) * cloudBlendFactor;
|
float4 albedo = shSample(diffuseMap1, scrolledUV) * (1-cloudBlendFactor) + shSample(diffuseMap2, scrolledUV) * cloudBlendFactor;
|
||||||
|
|
||||||
shOutputColour(0) = colourPassthrough * float4(cloudColour, 1) * albedo * float4(1,1,1, cloudOpacity);
|
shOutputColour(0) = float4(cloudColour, 1) * albedo * float4(1,1,1, cloudOpacity * alphaFade);
|
||||||
|
|
||||||
#if MRT
|
#if MRT
|
||||||
shOutputColour(1) = float4(1,1,1,1);
|
shOutputColour(1) = float4(1,1,1,1);
|
||||||
|
|
36
readme.txt
36
readme.txt
|
@ -3,7 +3,7 @@ OpenMW: A reimplementation of The Elder Scrolls III: Morrowind
|
||||||
OpenMW is an attempt at recreating the engine for the popular role-playing game
|
OpenMW is an attempt at recreating the engine for the popular role-playing game
|
||||||
Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.
|
Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.
|
||||||
|
|
||||||
Version: 0.20.0
|
Version: 0.21.0
|
||||||
License: GPL (see GPL3.txt for more information)
|
License: GPL (see GPL3.txt for more information)
|
||||||
Website: http://www.openmw.org
|
Website: http://www.openmw.org
|
||||||
|
|
||||||
|
@ -94,6 +94,40 @@ Allowed options:
|
||||||
|
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
|
|
||||||
|
0.21.0
|
||||||
|
|
||||||
|
Bug #253: Dialogs don't work for Russian version of Morrowind
|
||||||
|
Bug #267: Activating creatures without dialogue can still activate the dialogue GUI
|
||||||
|
Bug #354: True flickering lights
|
||||||
|
Bug #386: The main menu's first entry is wrong (in french)
|
||||||
|
Bug #479: Adding the spell "Ash Woe Blight" to the player causes strange attribute oscillations
|
||||||
|
Bug #495: Activation Range
|
||||||
|
Bug #497: Failed Disposition check doesn't stop a dialogue entry from being returned
|
||||||
|
Bug #498: Failing a disposition check shouldn't eliminate topics from the the list of those available
|
||||||
|
Bug #500: Disposition for most NPCs is 0/100
|
||||||
|
Bug #501: Getdisposition command wrongly returns base disposition
|
||||||
|
Bug #506: Journal UI doesn't update anymore
|
||||||
|
Bug #507: EnableRestMenu is not a valid command - change it to EnableRest
|
||||||
|
Bug #508: Crash in Ald Daedroth Shrine
|
||||||
|
Bug #517: Wrong price calculation when untrading an item
|
||||||
|
Bug #521: MWGui::InventoryWindow creates a duplicate player actor at the origin
|
||||||
|
Bug #524: Beast races are able to wear shoes
|
||||||
|
Bug #527: Background music fails to play
|
||||||
|
Bug #533: The arch at Gnisis entrance is not displayed
|
||||||
|
Bug #534: Terrain gets its correct shape only some time after the cell is loaded
|
||||||
|
Bug #536: The same entry can be added multiple times to the journal
|
||||||
|
Bug #539: Race selection is broken
|
||||||
|
Bug #544: Terrain normal map corrupt when the map is rendered
|
||||||
|
Feature #39: Video Playback
|
||||||
|
Feature #151: ^-escape sequences in text output
|
||||||
|
Feature #392: Add AI related script functions
|
||||||
|
Feature #456: Determine required ini fallback values and adjust the ini importer accordingly
|
||||||
|
Feature #460: Experimental DirArchives improvements
|
||||||
|
Feature #540: Execute scripts of objects in containers/inventories in active cells
|
||||||
|
Task #401: Review GMST fixing
|
||||||
|
Task #453: Unify case smashing/folding
|
||||||
|
Task #512: Rewrite utf8 component
|
||||||
|
|
||||||
0.20.0
|
0.20.0
|
||||||
|
|
||||||
Bug #366: Changing the player's race during character creation does not change the look of the player character
|
Bug #366: Changing the player's race during character creation does not change the look of the player character
|
||||||
|
|
Loading…
Reference in a new issue