mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-09-09 20:35:48 -04:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
563f44b823
@ -1363,6 +1363,7 @@ namespace MWRender
|
|||||||
foundKeyframeCtrl = true;
|
foundKeyframeCtrl = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
cb = cb->getNestedCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foundKeyframeCtrl)
|
if (foundKeyframeCtrl)
|
||||||
|
@ -182,23 +182,30 @@ void WeaponAnimation::deleteControllers()
|
|||||||
|
|
||||||
void WeaponAnimation::configureControllers(float characterPitchRadians)
|
void WeaponAnimation::configureControllers(float characterPitchRadians)
|
||||||
{
|
{
|
||||||
if (!mSpineControllers[0])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mPitchFactor == 0.f || characterPitchRadians == 0.f)
|
if (mPitchFactor == 0.f || characterPitchRadians == 0.f)
|
||||||
{
|
{
|
||||||
for (int i=0; i<2; ++i)
|
setControllerEnabled(false);
|
||||||
mSpineControllers[i]->setEnabled(false);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float pitch = characterPitchRadians * mPitchFactor;
|
float pitch = characterPitchRadians * mPitchFactor;
|
||||||
osg::Quat rotate (pitch/2, osg::Vec3f(-1,0,0));
|
osg::Quat rotate (pitch/2, osg::Vec3f(-1,0,0));
|
||||||
|
setControllerRotate(rotate);
|
||||||
|
setControllerEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WeaponAnimation::setControllerRotate(const osg::Quat& rotate)
|
||||||
|
{
|
||||||
for (int i=0; i<2; ++i)
|
for (int i=0; i<2; ++i)
|
||||||
{
|
if (mSpineControllers[i])
|
||||||
mSpineControllers[i]->setRotate(rotate);
|
mSpineControllers[i]->setRotate(rotate);
|
||||||
mSpineControllers[i]->setEnabled(true);
|
}
|
||||||
}
|
|
||||||
|
void WeaponAnimation::setControllerEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
for (int i=0; i<2; ++i)
|
||||||
|
if (mSpineControllers[i])
|
||||||
|
mSpineControllers[i]->setEnabled(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,9 @@ namespace MWRender
|
|||||||
|
|
||||||
osg::ref_ptr<RotateController> mSpineControllers[2];
|
osg::ref_ptr<RotateController> mSpineControllers[2];
|
||||||
|
|
||||||
|
void setControllerRotate(const osg::Quat& rotate);
|
||||||
|
void setControllerEnabled(bool enabled);
|
||||||
|
|
||||||
virtual osg::Group* getArrowBone() = 0;
|
virtual osg::Group* getArrowBone() = 0;
|
||||||
virtual osg::Node* getWeaponNode() = 0;
|
virtual osg::Node* getWeaponNode() = 0;
|
||||||
virtual Resource::ResourceSystem* getResourceSystem() = 0;
|
virtual Resource::ResourceSystem* getResourceSystem() = 0;
|
||||||
|
@ -2039,7 +2039,7 @@ namespace MWWorld
|
|||||||
|
|
||||||
bool World::isUnderwater(const MWWorld::CellStore* cell, const osg::Vec3f &pos) const
|
bool World::isUnderwater(const MWWorld::CellStore* cell, const osg::Vec3f &pos) const
|
||||||
{
|
{
|
||||||
if (!(cell->getCell()->mData.mFlags & ESM::Cell::HasWater)) {
|
if (!(cell->getCell()->hasWater())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return pos.z() < cell->getWaterLevel();
|
return pos.z() < cell->getWaterLevel();
|
||||||
|
@ -141,7 +141,7 @@ struct Cell
|
|||||||
|
|
||||||
bool hasWater() const
|
bool hasWater() const
|
||||||
{
|
{
|
||||||
return (mData.mFlags&HasWater) != 0;
|
return ((mData.mFlags&HasWater) != 0) || isExterior();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore the given reader to the stored position. Will try to open
|
// Restore the given reader to the stored position. Will try to open
|
||||||
|
@ -470,7 +470,7 @@ namespace NifOsg
|
|||||||
const Nif::NiTextureEffect* textureEffect = static_cast<const Nif::NiTextureEffect*>(nifNode);
|
const Nif::NiTextureEffect* textureEffect = static_cast<const Nif::NiTextureEffect*>(nifNode);
|
||||||
if (textureEffect->textureType != Nif::NiTextureEffect::Environment_Map)
|
if (textureEffect->textureType != Nif::NiTextureEffect::Environment_Map)
|
||||||
{
|
{
|
||||||
std::cerr << "Unhandled NiTextureEffect type " << textureEffect->textureType << std::endl;
|
std::cerr << "Unhandled NiTextureEffect type " << textureEffect->textureType << " in " << mFilename << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,7 +487,7 @@ namespace NifOsg
|
|||||||
texGen->setMode(osg::TexGen::SPHERE_MAP);
|
texGen->setMode(osg::TexGen::SPHERE_MAP);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
std::cerr << "Unhandled NiTextureEffect coordGenType " << textureEffect->coordGenType << std::endl;
|
std::cerr << "Unhandled NiTextureEffect coordGenType " << textureEffect->coordGenType << " in " << mFilename << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1374,17 +1374,15 @@ namespace NifOsg
|
|||||||
case Nif::NiTexturingProperty::DarkTexture:
|
case Nif::NiTexturingProperty::DarkTexture:
|
||||||
case Nif::NiTexturingProperty::BumpTexture:
|
case Nif::NiTexturingProperty::BumpTexture:
|
||||||
case Nif::NiTexturingProperty::DetailTexture:
|
case Nif::NiTexturingProperty::DetailTexture:
|
||||||
|
case Nif::NiTexturingProperty::DecalTexture:
|
||||||
break;
|
break;
|
||||||
case Nif::NiTexturingProperty::GlossTexture:
|
case Nif::NiTexturingProperty::GlossTexture:
|
||||||
{
|
{
|
||||||
|
// Not used by the vanilla engine. MCP (Morrowind Code Patch) adds an option to use Gloss maps:
|
||||||
|
// "- Gloss map fix. Morrowind removed gloss map entries from model files after loading them. This stops Morrowind from removing them."
|
||||||
std::cerr << "NiTexturingProperty::GlossTexture in " << mFilename << " not currently used." << std::endl;
|
std::cerr << "NiTexturingProperty::GlossTexture in " << mFilename << " not currently used." << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case Nif::NiTexturingProperty::DecalTexture:
|
|
||||||
{
|
|
||||||
std::cerr << "NiTexturingProperty::DecalTexture in " << mFilename << " not currently used." << std::endl;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
std::cerr << "Warning: unhandled texture stage " << i << " in " << mFilename << std::endl;
|
std::cerr << "Warning: unhandled texture stage " << i << " in " << mFilename << std::endl;
|
||||||
@ -1435,16 +1433,16 @@ namespace NifOsg
|
|||||||
{
|
{
|
||||||
osg::TexEnvCombine* texEnv = new osg::TexEnvCombine;
|
osg::TexEnvCombine* texEnv = new osg::TexEnvCombine;
|
||||||
texEnv->setScale_RGB(2.f);
|
texEnv->setScale_RGB(2.f);
|
||||||
texEnv->setCombine_Alpha(GL_MODULATE);
|
texEnv->setCombine_Alpha(osg::TexEnvCombine::MODULATE);
|
||||||
texEnv->setOperand0_Alpha(GL_SRC_ALPHA);
|
texEnv->setOperand0_Alpha(osg::TexEnvCombine::SRC_ALPHA);
|
||||||
texEnv->setOperand1_Alpha(GL_SRC_ALPHA);
|
texEnv->setOperand1_Alpha(osg::TexEnvCombine::SRC_ALPHA);
|
||||||
texEnv->setSource0_Alpha(GL_PREVIOUS_ARB);
|
texEnv->setSource0_Alpha(osg::TexEnvCombine::PREVIOUS);
|
||||||
texEnv->setSource1_Alpha(GL_TEXTURE);
|
texEnv->setSource1_Alpha(osg::TexEnvCombine::TEXTURE);
|
||||||
texEnv->setCombine_RGB(GL_MODULATE);
|
texEnv->setCombine_RGB(osg::TexEnvCombine::MODULATE);
|
||||||
texEnv->setOperand0_RGB(GL_SRC_COLOR);
|
texEnv->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
texEnv->setOperand1_RGB(GL_SRC_COLOR);
|
texEnv->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
texEnv->setSource0_RGB(GL_PREVIOUS_ARB);
|
texEnv->setSource0_RGB(osg::TexEnvCombine::PREVIOUS);
|
||||||
texEnv->setSource1_RGB(GL_TEXTURE);
|
texEnv->setSource1_RGB(osg::TexEnvCombine::TEXTURE);
|
||||||
stateset->setTextureAttributeAndModes(texUnit, texEnv, osg::StateAttribute::ON);
|
stateset->setTextureAttributeAndModes(texUnit, texEnv, osg::StateAttribute::ON);
|
||||||
}
|
}
|
||||||
else if (i == Nif::NiTexturingProperty::BumpTexture)
|
else if (i == Nif::NiTexturingProperty::BumpTexture)
|
||||||
@ -1452,6 +1450,21 @@ namespace NifOsg
|
|||||||
// Set this texture to Off by default since we can't render it with the fixed-function pipeline
|
// Set this texture to Off by default since we can't render it with the fixed-function pipeline
|
||||||
stateset->setTextureMode(texUnit, GL_TEXTURE_2D, osg::StateAttribute::OFF);
|
stateset->setTextureMode(texUnit, GL_TEXTURE_2D, osg::StateAttribute::OFF);
|
||||||
}
|
}
|
||||||
|
else if (i == Nif::NiTexturingProperty::DecalTexture)
|
||||||
|
{
|
||||||
|
osg::TexEnvCombine* texEnv = new osg::TexEnvCombine;
|
||||||
|
texEnv->setCombine_RGB(osg::TexEnvCombine::INTERPOLATE);
|
||||||
|
texEnv->setSource0_RGB(osg::TexEnvCombine::TEXTURE);
|
||||||
|
texEnv->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
|
texEnv->setSource1_RGB(osg::TexEnvCombine::PREVIOUS);
|
||||||
|
texEnv->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
|
texEnv->setSource2_RGB(osg::TexEnvCombine::TEXTURE);
|
||||||
|
texEnv->setOperand2_RGB(osg::TexEnvCombine::SRC_ALPHA);
|
||||||
|
texEnv->setCombine_Alpha(osg::TexEnvCombine::REPLACE);
|
||||||
|
texEnv->setSource0_Alpha(osg::TexEnvCombine::PREVIOUS);
|
||||||
|
texEnv->setOperand0_Alpha(osg::TexEnvCombine::SRC_ALPHA);
|
||||||
|
stateset->setTextureAttributeAndModes(texUnit, texEnv, osg::StateAttribute::ON);
|
||||||
|
}
|
||||||
|
|
||||||
switch (i)
|
switch (i)
|
||||||
{
|
{
|
||||||
@ -1470,6 +1483,9 @@ namespace NifOsg
|
|||||||
case Nif::NiTexturingProperty::DetailTexture:
|
case Nif::NiTexturingProperty::DetailTexture:
|
||||||
texture2d->setName("detailMap");
|
texture2d->setName("detailMap");
|
||||||
break;
|
break;
|
||||||
|
case Nif::NiTexturingProperty::DecalTexture:
|
||||||
|
texture2d->setName("decalMap");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,10 @@ namespace Resource
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResourceManager::~ResourceManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void ResourceManager::updateCache(double referenceTime)
|
void ResourceManager::updateCache(double referenceTime)
|
||||||
{
|
{
|
||||||
mCache->updateTimeStampOfObjectsInCacheWithExternalReferences(referenceTime);
|
mCache->updateTimeStampOfObjectsInCacheWithExternalReferences(referenceTime);
|
||||||
|
@ -18,6 +18,7 @@ namespace Resource
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ResourceManager(const VFS::Manager* vfs);
|
ResourceManager(const VFS::Manager* vfs);
|
||||||
|
virtual ~ResourceManager();
|
||||||
|
|
||||||
/// Clear cache entries that have not been referenced for longer than expiryDelay.
|
/// Clear cache entries that have not been referenced for longer than expiryDelay.
|
||||||
virtual void updateCache(double referenceTime);
|
virtual void updateCache(double referenceTime);
|
||||||
|
@ -102,9 +102,15 @@ namespace SceneUtil
|
|||||||
// Need to invert culling because of the negative scale
|
// Need to invert culling because of the negative scale
|
||||||
// Note: for absolute correctness we would need to check the current front face for every mesh then invert it
|
// Note: for absolute correctness we would need to check the current front face for every mesh then invert it
|
||||||
// However MW isn't doing this either, so don't. Assuming all meshes are using backface culling is more efficient.
|
// However MW isn't doing this either, so don't. Assuming all meshes are using backface culling is more efficient.
|
||||||
osg::FrontFace* frontFace = new osg::FrontFace;
|
static osg::ref_ptr<osg::StateSet> frontFaceStateSet;
|
||||||
frontFace->setMode(osg::FrontFace::CLOCKWISE);
|
if (!frontFaceStateSet)
|
||||||
trans->getOrCreateStateSet()->setAttributeAndModes(frontFace, osg::StateAttribute::ON);
|
{
|
||||||
|
frontFaceStateSet = new osg::StateSet;
|
||||||
|
osg::FrontFace* frontFace = new osg::FrontFace;
|
||||||
|
frontFace->setMode(osg::FrontFace::CLOCKWISE);
|
||||||
|
frontFaceStateSet->setAttributeAndModes(frontFace, osg::StateAttribute::ON);
|
||||||
|
}
|
||||||
|
trans->setStateSet(frontFaceStateSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trans)
|
if (trans)
|
||||||
|
@ -88,11 +88,11 @@ namespace Shader
|
|||||||
return newStateSet.get();
|
return newStateSet.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* defaultTextures[] = { "diffuseMap", "normalMap", "emissiveMap", "darkMap", "detailMap", "envMap", "specularMap" };
|
const char* defaultTextures[] = { "diffuseMap", "normalMap", "emissiveMap", "darkMap", "detailMap", "envMap", "specularMap", "decalMap" };
|
||||||
bool isTextureNameRecognized(const std::string& name)
|
bool isTextureNameRecognized(const std::string& name)
|
||||||
{
|
{
|
||||||
for (unsigned int i=0; i<sizeof(defaultTextures)/sizeof(defaultTextures[0]); ++i)
|
for (unsigned int i=0; i<sizeof(defaultTextures)/sizeof(defaultTextures[0]); ++i)
|
||||||
if (name.c_str() == defaultTextures[i])
|
if (name == defaultTextures[i])
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,11 @@ uniform sampler2D detailMap;
|
|||||||
varying vec2 detailMapUV;
|
varying vec2 detailMapUV;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @decalMap
|
||||||
|
uniform sampler2D decalMap;
|
||||||
|
varying vec2 decalMapUV;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @emissiveMap
|
#if @emissiveMap
|
||||||
uniform sampler2D emissiveMap;
|
uniform sampler2D emissiveMap;
|
||||||
varying vec2 emissiveMapUV;
|
varying vec2 emissiveMapUV;
|
||||||
@ -67,6 +72,11 @@ void main()
|
|||||||
gl_FragData[0].xyz *= texture2D(darkMap, darkMapUV).xyz;
|
gl_FragData[0].xyz *= texture2D(darkMap, darkMapUV).xyz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @decalMap
|
||||||
|
vec4 decalTex = texture2D(decalMap, decalMapUV);
|
||||||
|
gl_FragData[0].xyz = mix(gl_FragData[0].xyz, decalTex.xyz, decalTex.a);
|
||||||
|
#endif
|
||||||
|
|
||||||
vec3 viewNormal = passViewNormal;
|
vec3 viewNormal = passViewNormal;
|
||||||
|
|
||||||
#if @normalMap
|
#if @normalMap
|
||||||
|
@ -12,6 +12,10 @@ varying vec2 darkMapUV;
|
|||||||
varying vec2 detailMapUV;
|
varying vec2 detailMapUV;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @decalMap
|
||||||
|
varying vec2 decalMapUV;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @emissiveMap
|
#if @emissiveMap
|
||||||
varying vec2 emissiveMapUV;
|
varying vec2 emissiveMapUV;
|
||||||
#endif
|
#endif
|
||||||
@ -68,7 +72,11 @@ void main(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @detailMap
|
#if @detailMap
|
||||||
detailMapUV = (gl_TextureMatrix[@detailMap] * gl_MultiTexCoord@detailMap).xy;
|
detailMapUV = (gl_TextureMatrix[@detailMapUV] * gl_MultiTexCoord@detailMapUV).xy;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @decalMap
|
||||||
|
decalMapUV = (gl_TextureMatrix[@decalMapUV] * gl_MultiTexCoord@decalMapUV).xy;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @emissiveMap
|
#if @emissiveMap
|
||||||
|
Loading…
x
Reference in New Issue
Block a user