Rework of shaders architecture

master
RealBadAngel 2013-10-31 23:57:27 +01:00
parent ecfc7f7d0e
commit dce85aa27f
2 changed files with 34 additions and 29 deletions

View File

@ -804,14 +804,31 @@ public:
u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
float daynight_ratio_f = (float)daynight_ratio / 1000.0;
services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
float time_of_day_f = m_client->getEnv().getTimeOfDayF();
services->setPixelShaderConstant("timeOfDay", &time_of_day_f, 1);
LocalPlayer* player = m_client->getEnv().getLocalPlayer();
v3f eye_position = player->getEyePosition();
services->setPixelShaderConstant("eyePosition", (irr::f32*)&eye_position, 3);
float enable_bumpmapping = 0;
if (g_settings->getBool("enable_bumpmapping"))
enable_bumpmapping = 1;
services->setPixelShaderConstant("enableBumpmapping", &enable_bumpmapping, 1);
// Normal map texture layer
int layer = 1;
int layer1 = 1;
int layer2 = 2;
int layer3 = 3;
// before 1.8 there isn't a "integer interface", only float
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
services->setPixelShaderConstant("normalTexture" , (irr::f32*)&layer, 1);
services->setPixelShaderConstant("normalTexture" , (irr::f32*)&layer1, 1);
services->setPixelShaderConstant("useNormalmap" , (irr::f32*)&layer2, 1);
services->setPixelShaderConstant("reflectionTexture" , (irr::f32*)&layer3, 1);
#else
services->setPixelShaderConstant("normalTexture" , (irr::s32*)&layer, 1);
services->setPixelShaderConstant("normalTexture" , (irr::s32*)&layer1, 1);
services->setPixelShaderConstant("useNormalmap" , (irr::s32*)&layer2, 1);
#endif
}
};

View File

@ -1104,7 +1104,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
*/
mapblock_mesh_generate_special(data, collector);
/*
Convert MeshCollector to SMesh
@ -1112,15 +1111,11 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
bool enable_shaders = g_settings->getBool("enable_shaders");
video::E_MATERIAL_TYPE shadermat1 = m_gamedef->getShaderSource()->
getShader("test_shader_1").material;
getShader("solids_shader").material;
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
getShader("test_shader_2").material;
getShader("liquids_shader").material;
video::E_MATERIAL_TYPE shadermat3 = m_gamedef->getShaderSource()->
getShader("test_shader_3").material;
video::E_MATERIAL_TYPE bumpmaps1 = m_gamedef->getShaderSource()->
getShader("bumpmaps_solids").material;
video::E_MATERIAL_TYPE bumpmaps2 = m_gamedef->getShaderSource()->
getShader("bumpmaps_liquids").material;
getShader("alpha_shader").material;
for(u32 i = 0; i < collector.prebuffers.size(); i++)
{
@ -1199,23 +1194,20 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
material.setFlag(video::EMF_BILINEAR_FILTER, false);
material.setFlag(video::EMF_FOG_ENABLE, true);
//material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_OFF);
//material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_SIMPLE);
material.setFlag(video::EMF_ANTI_ALIASING, video::EAAM_SIMPLE);
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
material.setTexture(0, p.tile.texture);
if (enable_shaders) {
video::E_MATERIAL_TYPE smat1 = shadermat1;
video::E_MATERIAL_TYPE smat2 = shadermat2;
video::E_MATERIAL_TYPE smat3 = shadermat3;
if (enable_bumpmapping) {
ITextureSource *tsrc = data->m_gamedef->tsrc();
std::string fname_base = tsrc->getTextureName(p.tile.texture_id);
if (enable_shaders) {
ITextureSource *tsrc = data->m_gamedef->tsrc();
material.setTexture(2, tsrc->getTexture("disable_img.png"));
material.setTexture(3, tsrc->getTexture("reflection.png"));
if (enable_bumpmapping) {
std::string fname_base = tsrc->getTextureName(p.tile.texture_id);
std::string normal_ext = "_normal.png";
size_t pos = fname_base.find(".");
std::string fname_normal = fname_base.substr(0, pos) + normal_ext;
if (tsrc->isKnownSourceImage(fname_normal)) {
// look for image extension and replace it
size_t i = 0;
@ -1223,15 +1215,11 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
fname_base.replace(i, 4, normal_ext);
i += normal_ext.length();
}
material.setTexture(1, tsrc->getTexture(fname_base));
smat1 = bumpmaps1;
smat2 = bumpmaps2;
material.setTexture(2, tsrc->getTexture("enable_img.png"));
}
}
p.tile.applyMaterialOptionsWithShaders(material, smat1, smat2, smat3);
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2, shadermat3);
} else {
p.tile.applyMaterialOptions(material);
}