mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-25 17:56:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			184 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "property.hpp"
 | |
| 
 | |
| #include "data.hpp"
 | |
| #include "controlled.hpp"
 | |
| 
 | |
| namespace Nif
 | |
| {
 | |
| 
 | |
| void NiTexturingProperty::Texture::read(NIFStream *nif)
 | |
| {
 | |
|     inUse = nif->getBoolean();
 | |
|     if(!inUse) return;
 | |
| 
 | |
|     texture.read(nif);
 | |
|     if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | |
|     {
 | |
|         clamp = nif->getInt();
 | |
|         nif->skip(4); // Filter mode. Ignoring because global filtering settings are more sensible
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         clamp = nif->getUShort() & 0xF;
 | |
|     }
 | |
|     // Max anisotropy. I assume we'll always only use the global anisotropy setting.
 | |
|     if (nif->getVersion() >= NIFStream::generateVersion(20,5,0,4))
 | |
|         nif->getUShort();
 | |
| 
 | |
|     if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | |
|         uvSet = nif->getUInt();
 | |
| 
 | |
|     // Two PS2-specific shorts.
 | |
|     if (nif->getVersion() < NIFStream::generateVersion(10,4,0,2))
 | |
|         nif->skip(4);
 | |
|     if (nif->getVersion() <= NIFStream::generateVersion(4,1,0,18))
 | |
|         nif->skip(2); // Unknown short
 | |
|     else if (nif->getVersion() >= NIFStream::generateVersion(10,1,0,0))
 | |
|     {
 | |
|         if (nif->getBoolean()) // Has texture transform
 | |
|         {
 | |
|             nif->getVector2(); // UV translation
 | |
|             nif->getVector2(); // UV scale
 | |
|             nif->getFloat(); // W axis rotation
 | |
|             nif->getUInt(); // Transform method
 | |
|             nif->getVector2(); // Texture rotation origin
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| void NiTexturingProperty::Texture::post(NIFFile *nif)
 | |
| {
 | |
|     texture.post(nif);
 | |
| }
 | |
| 
 | |
| void NiTexturingProperty::read(NIFStream *nif)
 | |
| {
 | |
|     Property::read(nif);
 | |
|     if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD || nif->getVersion() >= NIFStream::generateVersion(20,1,0,2))
 | |
|         flags = nif->getUShort();
 | |
|     if (nif->getVersion() <= NIFStream::generateVersion(20,1,0,1))
 | |
|         apply = nif->getUInt();
 | |
| 
 | |
|     unsigned int numTextures = nif->getUInt();
 | |
| 
 | |
|     if (!numTextures)
 | |
|         return;
 | |
| 
 | |
|     textures.resize(numTextures);
 | |
|     for (unsigned int i = 0; i < numTextures; i++)
 | |
|     {
 | |
|         textures[i].read(nif);
 | |
|         if (i == 5 && textures[5].inUse) // Bump map settings
 | |
|         {
 | |
|             envMapLumaBias = nif->getVector2();
 | |
|             bumpMapMatrix = nif->getVector4();
 | |
|         }
 | |
|         else if (i == 7 && textures[7].inUse && nif->getVersion() >= NIFStream::generateVersion(20,2,0,5))
 | |
|             /*float parallaxOffset = */nif->getFloat();
 | |
|     }
 | |
| 
 | |
|     if (nif->getVersion() >= NIFStream::generateVersion(10,0,1,0))
 | |
|     {
 | |
|         unsigned int numShaderTextures = nif->getUInt();
 | |
|         shaderTextures.resize(numShaderTextures);
 | |
|         for (unsigned int i = 0; i < numShaderTextures; i++)
 | |
|         {
 | |
|             shaderTextures[i].read(nif);
 | |
|             if (shaderTextures[i].inUse)
 | |
|                 nif->getUInt(); // Unique identifier
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| void NiTexturingProperty::post(NIFFile *nif)
 | |
| {
 | |
|     Property::post(nif);
 | |
|     for (size_t i = 0; i < textures.size(); i++)
 | |
|         textures[i].post(nif);
 | |
|     for (size_t i = 0; i < shaderTextures.size(); i++)
 | |
|         shaderTextures[i].post(nif);
 | |
| }
 | |
| 
 | |
| void BSShaderProperty::read(NIFStream *nif)
 | |
| {
 | |
|     NiShadeProperty::read(nif);
 | |
|     if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3)
 | |
|     {
 | |
|         type = nif->getUInt();
 | |
|         flags1 = nif->getUInt();
 | |
|         flags2 = nif->getUInt();
 | |
|         envMapIntensity = nif->getFloat();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void BSShaderLightingProperty::read(NIFStream *nif)
 | |
| {
 | |
|     BSShaderProperty::read(nif);
 | |
|     if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3)
 | |
|         clamp = nif->getUInt();
 | |
| }
 | |
| 
 | |
| void NiFogProperty::read(NIFStream *nif)
 | |
| {
 | |
|     Property::read(nif);
 | |
|     mFlags = nif->getUShort();
 | |
|     mFogDepth = nif->getFloat();
 | |
|     mColour = nif->getVector3();
 | |
| }
 | |
| 
 | |
| void S_MaterialProperty::read(NIFStream *nif)
 | |
| {
 | |
|     if (nif->getBethVersion() < 26)
 | |
|     {
 | |
|         ambient = nif->getVector3();
 | |
|         diffuse = nif->getVector3();
 | |
|     }
 | |
|     specular = nif->getVector3();
 | |
|     emissive = nif->getVector3();
 | |
|     glossiness = nif->getFloat();
 | |
|     alpha = nif->getFloat();
 | |
|     if (nif->getBethVersion() > 21)
 | |
|         emissive *= nif->getFloat();
 | |
| }
 | |
| 
 | |
| void S_VertexColorProperty::read(NIFStream *nif)
 | |
| {
 | |
|     vertmode = nif->getInt();
 | |
|     lightmode = nif->getInt();
 | |
| }
 | |
| 
 | |
| void S_AlphaProperty::read(NIFStream *nif)
 | |
| {
 | |
|     threshold = nif->getChar();
 | |
| }
 | |
| 
 | |
| void S_StencilProperty::read(NIFStream *nif)
 | |
| {
 | |
|     if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | |
|     {
 | |
|         enabled = nif->getChar();
 | |
|         compareFunc = nif->getInt();
 | |
|         stencilRef = nif->getUInt();
 | |
|         stencilMask = nif->getUInt();
 | |
|         failAction = nif->getInt();
 | |
|         zFailAction = nif->getInt();
 | |
|         zPassAction = nif->getInt();
 | |
|         drawMode = nif->getInt();
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         unsigned short flags = nif->getUShort();
 | |
|         enabled = flags & 0x1;
 | |
|         failAction = (flags >> 1) & 0x7;
 | |
|         zFailAction = (flags >> 4) & 0x7;
 | |
|         zPassAction = (flags >> 7) & 0x7;
 | |
|         drawMode = (flags >> 10) & 0x3;
 | |
|         compareFunc = (flags >> 12) & 0x7;
 | |
|         stencilRef = nif->getUInt();
 | |
|         stencilMask = nif->getUInt();
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| }
 |