1
0
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:
psi29a 2023-02-11 10:33:08 +00:00
commit 83894bae8a
5 changed files with 76 additions and 39 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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: