Code: Select all
bool COGLES2NormalMapRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
{
if (SharedRenderer)
return SharedRenderer->OnRender(service, vtxtype);
else
{
/* Vertex Shader part */
/* Transform Matrices Upload */
core::matrix4 world = Driver->getTransform(ETS_WORLD);
IMaterialRendererServices::setVertexShaderConstant("uWorldMatrix", world.pointer(), 16);
core::matrix4 worldViewProj = Driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= Driver->getTransform(video::ETS_VIEW);
worldViewProj *= Driver->getTransform(ETS_WORLD);
IMaterialRendererServices::setVertexShaderConstant("uMvpMatrix", worldViewProj.pointer(), 16);
// IMaterialRendererServices* services=service;
video::IVideoDriver* driver = Driver;//services->getVideoDriver();
/*
// set transposed world matrix
const core::matrix4& tWorld = driver->getTransform(video::ETS_WORLD).getTransposed();
//services->setVertexShaderConstant(tWorld.pointer(), 0, 4);
// set transposed worldViewProj matrix
core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
core::matrix4 tr(worldViewProj.getTransposed());
services->setVertexShaderConstant(tr.pointer(), 8, 4);
*/
// here we fetch the fixed function lights from the driver
// and set them as constants
u32 cnt = driver->getDynamicLightCount();
// Load the inverse world matrix.
core::matrix4 invWorldMat;
driver->getTransform(video::ETS_WORLD).getInverse(invWorldMat);
core::vector3df vpos[2];
video::SColorf vcolor[2];
for (u32 i=0; i<2; ++i)
{
video::SLight light;
if (i<cnt)
light = driver->getDynamicLight(i);
else
{
light.DiffuseColor.set(0,0,0); // make light dark
light.Radius = 1.0f;
}
light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation
// Transform the light by the inverse world matrix to get it into object space.
invWorldMat.transformVect(light.Position);
/*services->setVertexShaderConstant(
reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1);*/
vpos[i]=light.Position;
vcolor[i]=light.DiffuseColor;
/*
services->setVertexShaderConstant(
reinterpret_cast<const f32*>(&light.DiffuseColor), 13+(i*2), 1);*/
}
IMaterialRendererServices::setVertexShaderConstant("uLightPos[0]",reinterpret_cast<const f32*>(&vpos),6);
IMaterialRendererServices::setVertexShaderConstant("uLightColor[0]",reinterpret_cast<const f32*>(&vcolor),8);
/* Textures Upload */
s32 TextureUsage0 = Driver->isActiveTexture(0);
s32 TextureUsage1 = Driver->isActiveTexture(1);
IMaterialRendererServices::setPixelShaderConstant("uTextureUsage0", &TextureUsage0, 1);
IMaterialRendererServices::setPixelShaderConstant("uTextureUsage1", &TextureUsage1, 1);
core::matrix4 textureMatrix0 = Driver->getTransform(video::ETS_TEXTURE_0);
core::matrix4 textureMatrix1 = Driver->getTransform(video::ETS_TEXTURE_0);
IMaterialRendererServices::setPixelShaderConstant("uTextureMatrix0", textureMatrix0.pointer(), 16);
IMaterialRendererServices::setPixelShaderConstant("uTextureMatrix1", textureMatrix1.pointer(), 16);
s32 TextureUnit0 = 0;
s32 TextureUnit1 = 1;
IMaterialRendererServices::setPixelShaderConstant("texture0", &TextureUnit0, 1);
IMaterialRendererServices::setPixelShaderConstant("texture1", &TextureUnit1, 1);
return true;
}