Commit 59ab9c52 authored by hybrid's avatar hybrid

Changed API to per texture-layer filtering.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@731 dfc29bdd-3216-0410-991c-e03cc46cb475
parent cd36b187
...@@ -322,7 +322,6 @@ namespace video ...@@ -322,7 +322,6 @@ namespace video
Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f), Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
Wireframe(false), PointCloud(false), GouraudShading(true), Lighting(true), Wireframe(false), PointCloud(false), GouraudShading(true), Lighting(true),
ZBuffer(true), ZWriteEnable(true), BackfaceCulling(true), ZBuffer(true), ZWriteEnable(true), BackfaceCulling(true),
BilinearFilter(true), TrilinearFilter(false), AnisotropicFilter(false),
FogEnable(false), NormalizeNormals(false) FogEnable(false), NormalizeNormals(false)
{ {
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
...@@ -330,6 +329,9 @@ namespace video ...@@ -330,6 +329,9 @@ namespace video
Textures[i] = 0; Textures[i] = 0;
TextureMatrix[i] = 0; TextureMatrix[i] = 0;
TextureWrap[i] = ETC_REPEAT; TextureWrap[i] = ETC_REPEAT;
BilinearFilter[i] = true;
TrilinearFilter[i] = false;
AnisotropicFilter[i] = false;
} }
} }
...@@ -383,6 +385,9 @@ namespace video ...@@ -383,6 +385,9 @@ namespace video
TextureMatrix[i] = 0; TextureMatrix[i] = 0;
} }
TextureWrap[i] = other.TextureWrap[i]; TextureWrap[i] = other.TextureWrap[i];
BilinearFilter[i] = other.BilinearFilter[i];
TrilinearFilter[i] = other.TrilinearFilter[i];
AnisotropicFilter[i] = other.AnisotropicFilter[i];
} }
Wireframe = other.Wireframe; Wireframe = other.Wireframe;
...@@ -392,9 +397,6 @@ namespace video ...@@ -392,9 +397,6 @@ namespace video
ZBuffer = other.ZBuffer; ZBuffer = other.ZBuffer;
ZWriteEnable = other.ZWriteEnable; ZWriteEnable = other.ZWriteEnable;
BackfaceCulling = other.BackfaceCulling; BackfaceCulling = other.BackfaceCulling;
BilinearFilter = other.BilinearFilter;
TrilinearFilter = other.TrilinearFilter;
AnisotropicFilter = other.AnisotropicFilter;
FogEnable = other.FogEnable; FogEnable = other.FogEnable;
NormalizeNormals = other.NormalizeNormals; NormalizeNormals = other.NormalizeNormals;
...@@ -504,19 +506,19 @@ namespace video ...@@ -504,19 +506,19 @@ namespace video
bool BackfaceCulling; bool BackfaceCulling;
//! Is bilinear filtering enabled? Default: true //! Is bilinear filtering enabled? Default: true
bool BilinearFilter; bool BilinearFilter[MATERIAL_MAX_TEXTURES];
//! Is trilinear filtering enabled? Default: false //! Is trilinear filtering enabled? Default: false
/** If the trilinear filter flag is enabled, /** If the trilinear filter flag is enabled,
the bilinear filtering flag is ignored. */ the bilinear filtering flag is ignored. */
bool TrilinearFilter; bool TrilinearFilter[MATERIAL_MAX_TEXTURES];
//! Is anisotropic filtering enabled? Default: false //! Is anisotropic filtering enabled? Default: false
/** In Irrlicht you can use anisotropic texture filtering /** In Irrlicht you can use anisotropic texture filtering
in conjunction with bilinear or trilinear texture in conjunction with bilinear or trilinear texture
filtering to improve rendering results. Primitives filtering to improve rendering results. Primitives
will look less blurry with this flag switched on. */ will look less blurry with this flag switched on. */
bool AnisotropicFilter; bool AnisotropicFilter[MATERIAL_MAX_TEXTURES];
//! Is fog enabled? Default: false //! Is fog enabled? Default: false
bool FogEnable; bool FogEnable;
...@@ -572,18 +574,33 @@ namespace video ...@@ -572,18 +574,33 @@ namespace video
case EMF_BACK_FACE_CULLING: case EMF_BACK_FACE_CULLING:
BackfaceCulling = value; break; BackfaceCulling = value; break;
case EMF_BILINEAR_FILTER: case EMF_BILINEAR_FILTER:
BilinearFilter = value; break; {
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
BilinearFilter[i] = value;
}
break;
case EMF_TRILINEAR_FILTER: case EMF_TRILINEAR_FILTER:
TrilinearFilter = value; break; {
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
TrilinearFilter[i] = value;
}
break;
case EMF_ANISOTROPIC_FILTER: case EMF_ANISOTROPIC_FILTER:
AnisotropicFilter = value; break; {
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
AnisotropicFilter[i] = value;
}
break;
case EMF_FOG_ENABLE: case EMF_FOG_ENABLE:
FogEnable = value; break; FogEnable = value; break;
case EMF_NORMALIZE_NORMALS: case EMF_NORMALIZE_NORMALS:
NormalizeNormals = value; break; NormalizeNormals = value; break;
case EMF_TEXTURE_WRAP: case EMF_TEXTURE_WRAP:
TextureWrap[0] = TextureWrap[1] = TextureWrap[2] = TextureWrap[3] = (E_TEXTURE_CLAMP)value; {
break; for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
TextureWrap[i] = (E_TEXTURE_CLAMP)value;
}
break;
default: default:
break; break;
} }
...@@ -609,11 +626,11 @@ namespace video ...@@ -609,11 +626,11 @@ namespace video
case EMF_BACK_FACE_CULLING: case EMF_BACK_FACE_CULLING:
return BackfaceCulling; return BackfaceCulling;
case EMF_BILINEAR_FILTER: case EMF_BILINEAR_FILTER:
return BilinearFilter; return BilinearFilter[0];
case EMF_TRILINEAR_FILTER: case EMF_TRILINEAR_FILTER:
return TrilinearFilter; return TrilinearFilter[0];
case EMF_ANISOTROPIC_FILTER: case EMF_ANISOTROPIC_FILTER:
return AnisotropicFilter; return AnisotropicFilter[0];
case EMF_FOG_ENABLE: case EMF_FOG_ENABLE:
return FogEnable; return FogEnable;
case EMF_NORMALIZE_NORMALS: case EMF_NORMALIZE_NORMALS:
...@@ -630,11 +647,7 @@ namespace video ...@@ -630,11 +647,7 @@ namespace video
//! Inequality operator //! Inequality operator
inline bool operator!=(const SMaterial& b) const inline bool operator!=(const SMaterial& b) const
{ {
return bool different =
Textures[0] != b.Textures[0] ||
Textures[1] != b.Textures[1] ||
Textures[2] != b.Textures[2] ||
Textures[3] != b.Textures[3] ||
MaterialType != b.MaterialType || MaterialType != b.MaterialType ||
AmbientColor != b.AmbientColor || AmbientColor != b.AmbientColor ||
DiffuseColor != b.DiffuseColor || DiffuseColor != b.DiffuseColor ||
...@@ -651,19 +664,22 @@ namespace video ...@@ -651,19 +664,22 @@ namespace video
ZBuffer != b.ZBuffer || ZBuffer != b.ZBuffer ||
ZWriteEnable != b.ZWriteEnable || ZWriteEnable != b.ZWriteEnable ||
BackfaceCulling != b.BackfaceCulling || BackfaceCulling != b.BackfaceCulling ||
BilinearFilter != b.BilinearFilter ||
TrilinearFilter != b.TrilinearFilter ||
AnisotropicFilter != b.AnisotropicFilter ||
FogEnable != b.FogEnable || FogEnable != b.FogEnable ||
NormalizeNormals != b.NormalizeNormals || NormalizeNormals != b.NormalizeNormals;
TextureWrap[0] != b.TextureWrap[0] || for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
TextureWrap[1] != b.TextureWrap[1] || {
TextureWrap[2] != b.TextureWrap[2] || different |= (Textures[i] != b.Textures[i]);
TextureWrap[3] != b.TextureWrap[3] || different |= (TextureWrap[i] != b.TextureWrap[i]);
TextureMatrix[0] != b.TextureMatrix[0] || different |= (BilinearFilter[i] != b.BilinearFilter[i]);
TextureMatrix[1] != b.TextureMatrix[1] || different |= (TrilinearFilter[i] != b.TrilinearFilter[i]);
TextureMatrix[2] != b.TextureMatrix[2] || different |= (AnisotropicFilter[i] != b.AnisotropicFilter[i]);
TextureMatrix[3] != b.TextureMatrix[3]; }
if (different)
return true;
else
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
different |= (TextureMatrix[i] != b.TextureMatrix[i]);
return different;
} }
//! Equality operator //! Equality operator
......
...@@ -178,8 +178,7 @@ namespace core ...@@ -178,8 +178,7 @@ namespace core
//! false if it is backfacing. //! false if it is backfacing.
bool isFrontFacing(const vector3d<T>& lookDirection) const bool isFrontFacing(const vector3d<T>& lookDirection) const
{ {
vector3d<T> n = getNormal(); vector3d<T> n = getNormal().normalize();
n.normalize();
return F32_LOWER_EQUAL_0(n.dotProduct(lookDirection)); return F32_LOWER_EQUAL_0(n.dotProduct(lookDirection));
} }
......
...@@ -1246,36 +1246,6 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1246,36 +1246,6 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetMaterial(&mat); pID3DDevice->SetMaterial(&mat);
} }
// Bilinear and/or trilinear
if (resetAllRenderstates ||
lastmaterial.BilinearFilter != material.BilinearFilter ||
lastmaterial.TrilinearFilter != material.TrilinearFilter ||
lastmaterial.AnisotropicFilter != material.AnisotropicFilter )
{
if (material.BilinearFilter || material.TrilinearFilter || material.AnisotropicFilter)
{
D3DTEXTUREFILTERTYPE tftMag = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && material.AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMin = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) && material.AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMip = material.TrilinearFilter ? D3DTEXF_LINEAR : D3DTEXF_POINT;
for (u32 st=0; st<MaxTextureUnits; ++st)
{
pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, tftMag);
pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, tftMin);
pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, tftMip);
}
}
else
{
for (u32 st=0; st<MaxTextureUnits; ++st)
{
pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, D3DTEXF_POINT);
pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, D3DTEXF_NONE);
pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, D3DTEXF_POINT);
}
}
}
// fillmode // fillmode
if (resetAllRenderstates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud) if (resetAllRenderstates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud)
{ {
...@@ -1398,9 +1368,30 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1398,9 +1368,30 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetTextureStageState(st, D3DTSS_ADDRESSV, mode ); pID3DDevice->SetTextureStageState(st, D3DTSS_ADDRESSV, mode );
} }
} // Bilinear and/or trilinear
if (resetAllRenderstates ||
lastmaterial.BilinearFilter[st] != material.BilinearFilter[st] ||
lastmaterial.TrilinearFilter[st] != material.TrilinearFilter[st] ||
lastmaterial.AnisotropicFilter[st] != material.AnisotropicFilter[st] )
{
if (material.BilinearFilter[st] || material.TrilinearFilter[st] || material.AnisotropicFilter[st])
{
D3DTEXTUREFILTERTYPE tftMag = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && material.AnisotropicFilter[st]) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMin = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) && material.AnisotropicFilter[st]) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMip = material.TrilinearFilter[st] ? D3DTEXF_LINEAR : D3DTEXF_POINT;
pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, tftMag);
pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, tftMin);
pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, tftMip);
}
else
{
pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, D3DTEXF_POINT);
pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, D3DTEXF_NONE);
pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, D3DTEXF_POINT);
}
}
}
} }
......
...@@ -1243,39 +1243,6 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1243,39 +1243,6 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetMaterial(&mat); pID3DDevice->SetMaterial(&mat);
} }
// Bilinear and/or trilinear
if (resetAllRenderstates ||
lastmaterial.BilinearFilter != material.BilinearFilter ||
lastmaterial.TrilinearFilter != material.TrilinearFilter ||
lastmaterial.AnisotropicFilter != material.AnisotropicFilter
//|| !LastTextureMipMapsAvailable[0]
//|| !LastTextureMipMapsAvailable[1]
)
{
if (material.BilinearFilter || material.TrilinearFilter || material.AnisotropicFilter)
{
D3DTEXTUREFILTERTYPE tftMag = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && material.AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMin = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) && material.AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMip = material.TrilinearFilter ? D3DTEXF_LINEAR : D3DTEXF_POINT;
for (u32 st=0; st<MaxTextureUnits; ++st)
{
pID3DDevice->SetSamplerState(st, D3DSAMP_MAGFILTER, tftMag);
pID3DDevice->SetSamplerState(st, D3DSAMP_MINFILTER, tftMin);
pID3DDevice->SetSamplerState(st, D3DSAMP_MIPFILTER, tftMip);
}
}
else
{
for (u32 st=0; st<MaxTextureUnits; ++st)
{
pID3DDevice->SetSamplerState(st, D3DSAMP_MINFILTER, D3DTEXF_POINT);
pID3DDevice->SetSamplerState(st, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
pID3DDevice->SetSamplerState(st, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
}
}
}
// fillmode // fillmode
if (resetAllRenderstates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud) if (resetAllRenderstates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud)
{ {
...@@ -1394,9 +1361,31 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1394,9 +1361,31 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSU, mode ); pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSU, mode );
pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSV, mode ); pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSV, mode );
} }
}
// Bilinear and/or trilinear
if (resetAllRenderstates ||
lastmaterial.BilinearFilter[st] != material.BilinearFilter[st] ||
lastmaterial.TrilinearFilter[st] != material.TrilinearFilter[st] ||
lastmaterial.AnisotropicFilter[st] != material.AnisotropicFilter[st])
{
if (material.BilinearFilter[st] || material.TrilinearFilter[st] || material.AnisotropicFilter[st])
{
D3DTEXTUREFILTERTYPE tftMag = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && material.AnisotropicFilter[st]) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMin = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) && material.AnisotropicFilter[st]) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;
D3DTEXTUREFILTERTYPE tftMip = material.TrilinearFilter[st] ? D3DTEXF_LINEAR : D3DTEXF_POINT;
pID3DDevice->SetSamplerState(st, D3DSAMP_MAGFILTER, tftMag);
pID3DDevice->SetSamplerState(st, D3DSAMP_MINFILTER, tftMin);
pID3DDevice->SetSamplerState(st, D3DSAMP_MIPFILTER, tftMip);
}
else
{
pID3DDevice->SetSamplerState(st, D3DSAMP_MINFILTER, D3DTEXF_POINT);
pID3DDevice->SetSamplerState(st, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
pID3DDevice->SetSamplerState(st, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
}
}
}
} }
......
...@@ -167,7 +167,6 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file) ...@@ -167,7 +167,6 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file)
buffer->Material.MaterialType = video::EMT_LIGHTMAP_LIGHTING ; buffer->Material.MaterialType = video::EMT_LIGHTMAP_LIGHTING ;
buffer->Material.Wireframe = false; buffer->Material.Wireframe = false;
buffer->Material.Lighting = true; buffer->Material.Lighting = true;
buffer->Material.BilinearFilter = true;
Mesh->addMeshBuffer(buffer); Mesh->addMeshBuffer(buffer);
buffer->drop(); buffer->drop();
} }
......
...@@ -248,7 +248,6 @@ void CLMTSMeshFileLoader::constructMesh() ...@@ -248,7 +248,6 @@ void CLMTSMeshFileLoader::constructMesh()
meshBuffer->Material.MaterialType = video::EMT_LIGHTMAP; // EMT_LIGHTMAP_M2/EMT_LIGHTMAP_M4 also possible meshBuffer->Material.MaterialType = video::EMT_LIGHTMAP; // EMT_LIGHTMAP_M2/EMT_LIGHTMAP_M4 also possible
meshBuffer->Material.Wireframe = false; meshBuffer->Material.Wireframe = false;
meshBuffer->Material.Lighting = false; meshBuffer->Material.Lighting = false;
meshBuffer->Material.BilinearFilter = true;
Mesh->addMeshBuffer(meshBuffer); Mesh->addMeshBuffer(meshBuffer);
......
...@@ -611,7 +611,6 @@ for (u32 p=0; p<nToRead; p++) ...@@ -611,7 +611,6 @@ for (u32 p=0; p<nToRead; p++)
buffer->Material.MaterialType = video::EMT_LIGHTMAP_M2; // EMT_LIGHTMAP_M4 also possible buffer->Material.MaterialType = video::EMT_LIGHTMAP_M2; // EMT_LIGHTMAP_M4 also possible
buffer->Material.Wireframe = false; buffer->Material.Wireframe = false;
buffer->Material.Lighting = false; buffer->Material.Lighting = false;
buffer->Material.BilinearFilter = true;
if (matEnt) if (matEnt)
{ {
......
...@@ -1302,7 +1302,8 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria ...@@ -1302,7 +1302,8 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria
io::CAttributes* attr = new io::CAttributes(this); io::CAttributes* attr = new io::CAttributes(this);
const char** materialNames = new const char*[MaterialRenderers.size()+1]; const char** materialNames = new const char*[MaterialRenderers.size()+1];
for (u32 i=0; i < MaterialRenderers.size(); ++i) u32 i;
for (i=0; i < MaterialRenderers.size(); ++i)
materialNames[i] = MaterialRenderers[i].Name.c_str(); materialNames[i] = MaterialRenderers[i].Name.c_str();
materialNames[MaterialRenderers.size()] = 0; materialNames[MaterialRenderers.size()] = 0;
...@@ -1320,27 +1321,31 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria ...@@ -1320,27 +1321,31 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria
attr->addFloat("Param1", material.MaterialTypeParam); attr->addFloat("Param1", material.MaterialTypeParam);
attr->addFloat("Param2", material.MaterialTypeParam2); attr->addFloat("Param2", material.MaterialTypeParam2);
attr->addTexture("Texture1", material.Textures[0]); core::stringc prefix="Texture";
attr->addTexture("Texture2", material.Textures[1]); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
attr->addTexture("Texture3", material.Textures[2]); attr->addTexture((prefix+i).c_str(), material.Textures[i]);
attr->addTexture("Texture4", material.Textures[3]);
attr->addBool("Wireframe", material.Wireframe); attr->addBool("Wireframe", material.Wireframe);
attr->addBool("GouraudShading", material.GouraudShading); attr->addBool("GouraudShading", material.GouraudShading);
attr->addBool("Lighting", material.Lighting); attr->addBool("Lighting", material.Lighting);
attr->addBool("ZWriteEnable", material.ZWriteEnable); attr->addBool("ZWriteEnable", material.ZWriteEnable);
attr->addInt("ZBuffer", material.ZBuffer);
attr->addBool("BackfaceCulling", material.BackfaceCulling); attr->addBool("BackfaceCulling", material.BackfaceCulling);
attr->addBool("BilinearFilter", material.BilinearFilter);
attr->addBool("TrilinearFilter", material.TrilinearFilter);
attr->addBool("AnisotropicFilter", material.AnisotropicFilter);
attr->addBool("FogEnable", material.FogEnable); attr->addBool("FogEnable", material.FogEnable);
attr->addBool("NormalizeNormals", material.NormalizeNormals); attr->addBool("NormalizeNormals", material.NormalizeNormals);
attr->addInt("ZBuffer", material.ZBuffer); prefix = "BilinearFilter";
attr->addEnum("TextureWrap1", material.TextureWrap[0], aTextureClampNames); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
attr->addEnum("TextureWrap2", material.TextureWrap[1], aTextureClampNames); attr->addBool((prefix+i).c_str(), material.BilinearFilter[i]);
attr->addEnum("TextureWrap3", material.TextureWrap[2], aTextureClampNames); prefix = "TrilinearFilter";
attr->addEnum("TextureWrap4", material.TextureWrap[3], aTextureClampNames); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
attr->addBool((prefix+i).c_str(), material.TrilinearFilter[i]);
prefix = "AnisotropicFilter";
for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
attr->addBool((prefix+i).c_str(), material.AnisotropicFilter[i]);
prefix="TextureWrap";
for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
attr->addEnum((prefix+i).c_str(), material.TextureWrap[i], aTextureClampNames);
return attr; return attr;
} }
...@@ -1371,27 +1376,30 @@ void CNullDriver::fillMaterialStructureFromAttributes(video::SMaterial& outMater ...@@ -1371,27 +1376,30 @@ void CNullDriver::fillMaterialStructureFromAttributes(video::SMaterial& outMater
outMaterial.MaterialTypeParam = attr->getAttributeAsFloat("Param1"); outMaterial.MaterialTypeParam = attr->getAttributeAsFloat("Param1");
outMaterial.MaterialTypeParam2 = attr->getAttributeAsFloat("Param2"); outMaterial.MaterialTypeParam2 = attr->getAttributeAsFloat("Param2");
outMaterial.Textures[0] = attr->getAttributeAsTexture("Texture1"); core::stringc prefix="Texture";
outMaterial.Textures[1] = attr->getAttributeAsTexture("Texture2"); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
outMaterial.Textures[2] = attr->getAttributeAsTexture("Texture3"); outMaterial.Textures[i] = attr->getAttributeAsTexture((prefix+i).c_str());
outMaterial.Textures[3] = attr->getAttributeAsTexture("Texture4");
outMaterial.Wireframe = attr->getAttributeAsBool("Wireframe"); outMaterial.Wireframe = attr->getAttributeAsBool("Wireframe");
outMaterial.GouraudShading = attr->getAttributeAsBool("GouraudShading"); outMaterial.GouraudShading = attr->getAttributeAsBool("GouraudShading");
outMaterial.Lighting = attr->getAttributeAsBool("Lighting"); outMaterial.Lighting = attr->getAttributeAsBool("Lighting");
outMaterial.ZWriteEnable = attr->getAttributeAsBool("ZWriteEnable"); outMaterial.ZWriteEnable = attr->getAttributeAsBool("ZWriteEnable");
outMaterial.ZBuffer = attr->getAttributeAsInt("ZBuffer");
outMaterial.BackfaceCulling = attr->getAttributeAsBool("BackfaceCulling"); outMaterial.BackfaceCulling = attr->getAttributeAsBool("BackfaceCulling");
outMaterial.BilinearFilter = attr->getAttributeAsBool("BilinearFilter");
outMaterial.TrilinearFilter = attr->getAttributeAsBool("TrilinearFilter");
outMaterial.AnisotropicFilter = attr->getAttributeAsBool("AnisotropicFilter");
outMaterial.FogEnable = attr->getAttributeAsBool("FogEnable"); outMaterial.FogEnable = attr->getAttributeAsBool("FogEnable");
outMaterial.NormalizeNormals = attr->getAttributeAsBool("NormalizeNormals"); outMaterial.NormalizeNormals = attr->getAttributeAsBool("NormalizeNormals");
prefix = "BilinearFilter";
outMaterial.ZBuffer = attr->getAttributeAsInt("ZBuffer"); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
outMaterial.TextureWrap[0] = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration("TextureWrap1", aTextureClampNames); outMaterial.BilinearFilter[i] = attr->getAttributeAsBool((prefix+i).c_str());
outMaterial.TextureWrap[1] = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration("TextureWrap2", aTextureClampNames); prefix = "TrilinearFilter";
outMaterial.TextureWrap[2] = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration("TextureWrap3", aTextureClampNames); for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
outMaterial.TextureWrap[3] = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration("TextureWrap4", aTextureClampNames); outMaterial.TrilinearFilter[i] = attr->getAttributeAsBool((prefix+i).c_str());
prefix = "AnisotropicFilter";
for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
outMaterial.AnisotropicFilter[i] = attr->getAttributeAsBool((prefix+i).c_str());
prefix = "TextureWrap";
for (i=0; i<MATERIAL_MAX_TEXTURES; ++i)
outMaterial.TextureWrap[i] = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+i).c_str(), aTextureClampNames);
} }
......
...@@ -153,7 +153,6 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file) ...@@ -153,7 +153,6 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
buffer->Material.MaterialType = video::EMT_LIGHTMAP; buffer->Material.MaterialType = video::EMT_LIGHTMAP;
buffer->Material.Wireframe = false; buffer->Material.Wireframe = false;
buffer->Material.Lighting = false; buffer->Material.Lighting = false;
buffer->Material.BilinearFilter = true;
Mesh->addMeshBuffer(buffer); Mesh->addMeshBuffer(buffer);
......
...@@ -1290,18 +1290,18 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -1290,18 +1290,18 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
break; break;
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
(material.BilinearFilter || material.TrilinearFilter) ? GL_LINEAR : GL_NEAREST); (material.BilinearFilter[i] || material.TrilinearFilter[i]) ? GL_LINEAR : GL_NEAREST);
if (material.Textures[i] && material.Textures[i]->hasMipMaps()) if (material.Textures[i] && material.Textures[i]->hasMipMaps())
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
material.TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR : material.BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST ); material.TrilinearFilter[i] ? GL_LINEAR_MIPMAP_LINEAR : material.BilinearFilter[i] ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST );
else else
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
(material.BilinearFilter || material.TrilinearFilter) ? GL_LINEAR : GL_NEAREST); (material.BilinearFilter[i] || material.TrilinearFilter[i]) ? GL_LINEAR : GL_NEAREST);
if (AnisotropyExtension) if (AnisotropyExtension)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
material.AnisotropicFilter ? MaxAnisotropy : 1.0f ); material.AnisotropicFilter[i] ? MaxAnisotropy : 1.0f );
} }
// fillmode // fillmode
......
...@@ -627,7 +627,6 @@ s32 CQ3LevelMesh::setShaderMaterial ( video::SMaterial &material, const tBSPFace ...@@ -627,7 +627,6 @@ s32 CQ3LevelMesh::setShaderMaterial ( video::SMaterial &material, const tBSPFace
material.MaterialType = video::EMT_SOLID; material.MaterialType = video::EMT_SOLID;
material.Wireframe = false; material.Wireframe = false;
material.Lighting = false; material.Lighting = false;
material.BilinearFilter = true;
material.BackfaceCulling = true; material.BackfaceCulling = true;
material.Textures[0] = 0; material.Textures[0] = 0;
material.Textures[1] = 0; material.Textures[1] = 0;
...@@ -907,7 +906,6 @@ void CQ3LevelMesh::constructMesh() ...@@ -907,7 +906,6 @@ void CQ3LevelMesh::constructMesh()
buffer->Material.MaterialType = video::EMT_LIGHTMAP_M4; buffer->Material.MaterialType = video::EMT_LIGHTMAP_M4;
buffer->Material.Wireframe = false; buffer->Material.Wireframe = false;
buffer->Material.Lighting = false; buffer->Material.Lighting = false;
buffer->Material.BilinearFilter = true;
Mesh[0]->addMeshBuffer(buffer); Mesh[0]->addMeshBuffer(buffer);
......
...@@ -38,7 +38,7 @@ CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng ...@@ -38,7 +38,7 @@ CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng
CPPFLAGS = $(CXXINCS) -DIRRLICHT_EXPORTS=1 CPPFLAGS = $(CXXINCS) -DIRRLICHT_EXPORTS=1
CXXFLAGS = -Wall CXXFLAGS = -Wall
ifndef NDEBUG ifndef NDEBUG
CXXFLAGS += -g CXXFLAGS += -pg
else else
CXXFLAGS += -fexpensive-optimizations -O3 CXXFLAGS += -fexpensive-optimizations -O3
endif endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment