mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-24 18:39:59 +00:00
Merge branch 'nif' into 'master'
Add NiTriBasedGeomData abstraction, bring NiVertexColorProperty to modern standards See merge request OpenMW/openmw!2714
This commit is contained in:
commit
83894bae8a
@ -118,14 +118,18 @@ namespace Nif
|
|||||||
nif->skip(4); // Additional data
|
nif->skip(4); // Additional data
|
||||||
}
|
}
|
||||||
|
|
||||||
void NiTriShapeData::read(NIFStream* nif)
|
void NiTriBasedGeomData::read(NIFStream* nif)
|
||||||
{
|
{
|
||||||
NiGeometryData::read(nif);
|
NiGeometryData::read(nif);
|
||||||
|
mNumTriangles = nif->getUShort();
|
||||||
|
}
|
||||||
|
|
||||||
/*int tris =*/nif->getUShort();
|
void NiTriShapeData::read(NIFStream* nif)
|
||||||
|
{
|
||||||
|
NiTriBasedGeomData::read(nif);
|
||||||
|
|
||||||
// We have three times as many vertices as triangles, so this
|
// We have three times as many vertices as triangles, so this
|
||||||
// is always equal to tris*3.
|
// is always equal to mNumTriangles * 3.
|
||||||
int cnt = nif->getInt();
|
int cnt = nif->getInt();
|
||||||
bool hasTriangles = true;
|
bool hasTriangles = true;
|
||||||
if (nif->getVersion() > NIFFile::NIFVersion::VER_OB_OLD)
|
if (nif->getVersion() > NIFFile::NIFVersion::VER_OB_OLD)
|
||||||
@ -147,9 +151,7 @@ namespace Nif
|
|||||||
|
|
||||||
void NiTriStripsData::read(NIFStream* nif)
|
void NiTriStripsData::read(NIFStream* nif)
|
||||||
{
|
{
|
||||||
NiGeometryData::read(nif);
|
NiTriBasedGeomData::read(nif);
|
||||||
|
|
||||||
mNumTriangles = nif->getUShort();
|
|
||||||
|
|
||||||
// Number of triangle strips
|
// Number of triangle strips
|
||||||
int numStrips = nif->getUShort();
|
int numStrips = nif->getUShort();
|
||||||
|
@ -43,7 +43,15 @@ namespace Nif
|
|||||||
void read(NIFStream* nif) override;
|
void read(NIFStream* nif) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiTriShapeData : public NiGeometryData
|
// Abstract
|
||||||
|
struct NiTriBasedGeomData : public NiGeometryData
|
||||||
|
{
|
||||||
|
size_t mNumTriangles;
|
||||||
|
|
||||||
|
void read(NIFStream* nif) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct NiTriShapeData : public NiTriBasedGeomData
|
||||||
{
|
{
|
||||||
// Triangles, three vertex indices per triangle
|
// Triangles, three vertex indices per triangle
|
||||||
std::vector<unsigned short> triangles;
|
std::vector<unsigned short> triangles;
|
||||||
@ -51,10 +59,8 @@ namespace Nif
|
|||||||
void read(NIFStream* nif) override;
|
void read(NIFStream* nif) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiTriStripsData : public NiGeometryData
|
struct NiTriStripsData : public NiTriBasedGeomData
|
||||||
{
|
{
|
||||||
size_t mNumTriangles;
|
|
||||||
|
|
||||||
// Triangle strips, series of vertex indices.
|
// Triangle strips, series of vertex indices.
|
||||||
std::vector<std::vector<unsigned short>> strips;
|
std::vector<std::vector<unsigned short>> strips;
|
||||||
|
|
||||||
|
@ -227,10 +227,20 @@ namespace Nif
|
|||||||
emissiveMult = nif->getFloat();
|
emissiveMult = nif->getFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
void S_VertexColorProperty::read(NIFStream* nif)
|
void NiVertexColorProperty::read(NIFStream* nif)
|
||||||
{
|
{
|
||||||
vertmode = nif->getInt();
|
Property::read(nif);
|
||||||
lightmode = nif->getInt();
|
mFlags = nif->getUShort();
|
||||||
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
|
||||||
|
{
|
||||||
|
mVertexMode = static_cast<VertexMode>(nif->getUInt());
|
||||||
|
mLightingMode = static_cast<LightMode>(nif->getUInt());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mVertexMode = static_cast<VertexMode>((mFlags >> 4) & 0x3);
|
||||||
|
mLightingMode = static_cast<LightMode>((mFlags >> 3) & 0x1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void S_AlphaProperty::read(NIFStream* nif)
|
void S_AlphaProperty::read(NIFStream* nif)
|
||||||
|
@ -293,22 +293,6 @@ namespace Nif
|
|||||||
void read(NIFStream* nif);
|
void read(NIFStream* nif);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct S_VertexColorProperty
|
|
||||||
{
|
|
||||||
/* Vertex mode:
|
|
||||||
0 - source ignore
|
|
||||||
1 - source emmisive
|
|
||||||
2 - source amb diff
|
|
||||||
|
|
||||||
Lighting mode
|
|
||||||
0 - lighting emmisive
|
|
||||||
1 - lighting emmisive ambient/diffuse
|
|
||||||
*/
|
|
||||||
int vertmode, lightmode;
|
|
||||||
|
|
||||||
void read(NIFStream* nif);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct S_AlphaProperty
|
struct S_AlphaProperty
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -402,9 +386,28 @@ namespace Nif
|
|||||||
int alphaTestMode() const { return (flags >> 10) & 0x7; }
|
int alphaTestMode() const { return (flags >> 10) & 0x7; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiVertexColorProperty : public StructPropT<S_VertexColorProperty>
|
struct NiVertexColorProperty : public Property
|
||||||
{
|
{
|
||||||
|
enum class VertexMode : unsigned int
|
||||||
|
{
|
||||||
|
VertMode_SrcIgnore = 0,
|
||||||
|
VertMode_SrcEmissive = 1,
|
||||||
|
VertMode_SrcAmbDif = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class LightMode : unsigned int
|
||||||
|
{
|
||||||
|
LightMode_Emissive = 0,
|
||||||
|
LightMode_EmiAmbDif = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned short mFlags;
|
||||||
|
VertexMode mVertexMode;
|
||||||
|
LightMode mLightingMode;
|
||||||
|
|
||||||
|
void read(NIFStream* nif) override;
|
||||||
|
};
|
||||||
|
|
||||||
struct NiStencilProperty : public Property
|
struct NiStencilProperty : public Property
|
||||||
{
|
{
|
||||||
S_StencilProperty data;
|
S_StencilProperty data;
|
||||||
|
@ -2300,23 +2300,39 @@ namespace NifOsg
|
|||||||
{
|
{
|
||||||
const Nif::NiVertexColorProperty* vertprop
|
const Nif::NiVertexColorProperty* vertprop
|
||||||
= static_cast<const Nif::NiVertexColorProperty*>(property);
|
= static_cast<const Nif::NiVertexColorProperty*>(property);
|
||||||
lightmode = vertprop->data.lightmode;
|
|
||||||
|
|
||||||
switch (vertprop->data.vertmode)
|
switch (vertprop->mVertexMode)
|
||||||
|
{
|
||||||
|
case Nif::NiVertexColorProperty::VertexMode::VertMode_SrcIgnore:
|
||||||
{
|
{
|
||||||
case 0:
|
|
||||||
mat->setColorMode(osg::Material::OFF);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
mat->setColorMode(osg::Material::EMISSION);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (lightmode != 0)
|
|
||||||
mat->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
|
|
||||||
else
|
|
||||||
mat->setColorMode(osg::Material::OFF);
|
mat->setColorMode(osg::Material::OFF);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Nif::NiVertexColorProperty::VertexMode::VertMode_SrcEmissive:
|
||||||
|
{
|
||||||
|
mat->setColorMode(osg::Material::EMISSION);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Nif::NiVertexColorProperty::VertexMode::VertMode_SrcAmbDif:
|
||||||
|
{
|
||||||
|
switch (vertprop->mLightingMode)
|
||||||
|
{
|
||||||
|
case Nif::NiVertexColorProperty::LightMode::LightMode_Emissive:
|
||||||
|
{
|
||||||
|
mat->setColorMode(osg::Material::OFF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Nif::NiVertexColorProperty::LightMode::LightMode_EmiAmbDif:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
mat->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Nif::RC_NiAlphaProperty:
|
case Nif::RC_NiAlphaProperty:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user