this example will show you hwo easly can you apply shader effects to a custom SceneNude.
the shader program will apply the Embossed effects to each frame of the movie.
first we declare a global TShader class to allow next custom SceneNude to share the effect.
in the main function we write the shader program by using TShader class.
in the render function of our SceneNude we have to activate the shader program by using {your class}->Start(); the we draw our scenenude the we deactivate it by using {your class}->Stop();.
Code: Select all
/************************************
Magic library
playing movie with shader
Embossed effects
*************************************/
#include <irrlicht.h>
#include <Magic2d.hpp>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
// global declration of Irrlicht interfaces
IrrlichtDevice* device;
IVideoDriver* driver;
ISceneManager* smgr;
IGUIEnvironment* guienv;
TShader* Embossed;
class CSampleSceneNode : public ISceneNode
{
aabbox3d<f32> Box;
SMaterial Material;
public:
S3DVertex Vertices[4];
CSampleSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id): ISceneNode(parent, mgr, id)
{
float u = 320.0/512.0;
float v = 240.0/512.0;
Material.Wireframe = false;
Material.Lighting = false;
Vertices[0] = S3DVertex(-10,-10,0, 0,0,0,SColor(255,255,255,255),0,v);
Vertices[1] = S3DVertex( 10,-10,0, 0,0,0,SColor(255,255,255,255),u,v);
Vertices[2] = S3DVertex( 10, 10,0, 0,0,0,SColor(255,255,255,255),u,0);
Vertices[3] = S3DVertex(-10, 10,0, 0,0,0,SColor(255,255,255,255),0,0);
Box.reset(Vertices[0].Pos);
for (s32 i=1; i<4; ++i) Box.addInternalPoint(Vertices[i].Pos);
}
virtual void OnPreRender()
{
if (IsVisible) SceneManager->registerNodeForRendering(this);
ISceneNode::OnPreRender();
}
virtual void render()
{
u16 indices[] = { 0,1,3, 3,1,2, 1,0,2, 2,0,3 };
IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setMaterial(Material);
SetBlend(ALPHABLEND);
Embossed->Start();
driver->setTransform(ETS_WORLD, AbsoluteTransformation);
driver->drawIndexedTriangleList(&Vertices[0], 4, &indices[0], 4);
Embossed->Stop();
}
virtual const aabbox3d<f32>& getBoundingBox() const
{
return Box;
}
virtual s32 getMaterialCount()
{
return 1;
}
virtual SMaterial& getMaterial(s32 i)
{
return Material;
}
};
int main()
{
device = createDevice(EDT_OPENGL, dimension2d<s32>(640, 480), 32);
bool rslt = InitMagic(device);
if(rslt == false)
printf("Magic Library will only work with OpenGL driver");
device->setWindowCaption(L"Hello World! - Magic 2d library for Irrlicht");
driver = device->getVideoDriver();
smgr = device->getSceneManager();
guienv = device->getGUIEnvironment();
Embossed = new TShader();
Embossed->CreatFProg();
Embossed->AddToFragmnProg("!!ARBfp1.0");
Embossed->AddToFragmnProg("ATTRIB inTexCoord = fragment.texcoord;");
Embossed->AddToFragmnProg("OUTPUT outColor = result.color;");
Embossed->AddToFragmnProg("PARAM c[2] = { {0.001, 2, 0.5, 1} , {0.33333334} };");
Embossed->AddToFragmnProg("TEMP R0,R1;");
Embossed->AddToFragmnProg("ADD R0.xy, inTexCoord, c[0].x;");
Embossed->AddToFragmnProg("TEX R1, R0, texture, 2D;");
Embossed->AddToFragmnProg("ADD R0.xy, inTexCoord, -c[0].x;");
Embossed->AddToFragmnProg("MUL R1,R1,c[0].y;");
Embossed->AddToFragmnProg("TEX R0, R0, texture, 2D;");
Embossed->AddToFragmnProg("MAD R0,-R0,c[0].y,R1;");
Embossed->AddToFragmnProg("ADD R0,R0, c[0].zzzw;");
Embossed->AddToFragmnProg("ADD R0.x,R0.x, R0.y;");
Embossed->AddToFragmnProg("ADD R0.x,R0.x, R0.z;");
Embossed->AddToFragmnProg("MUL outColor.xyz,R0.x,c[1].x;");
Embossed->AddToFragmnProg("MOV outColor.w, R0;");
Embossed->AddToFragmnProg("END");
Embossed->FinishFragmnProg();
TMovie* movie=new TMovie;
movie->LoadMovie("../../media/Test.Avi");
// movie->LoadMovie("../../media/s1.asf");
movie->SetMovieFPS(65);
// movie->SetMovieFPS(10);
movie->SetLooped(true);
driver->setTextureCreationFlag(ETCF_ALWAYS_32_BIT,TRUE);
driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS,FALSE);
ITexture* movTxtr = driver->addTexture(dimension2d<s32>(512,512),"");
smgr->addCameraSceneNode(0,vector3df(0,0,-20),vector3df(0,0,0));
CSampleSceneNode* myNode=new CSampleSceneNode(smgr->getRootSceneNode(),smgr,666);
myNode->setMaterialTexture(0,movTxtr);
myNode->setMaterialType(EMT_TRANSPARENT_VERTEX_ALPHA);
myNode->setPosition(vector3df(0,0,0));
int lastFPS = -1;
movie->Seek(movie->GetFullTime()/2);
LONGLONG MovieLen = movie->GetFullTime()/10000000; // length of movie in Secs
while(device->run())
{
driver->beginScene(true, true, SColor(0,200,200,200));
movie->NextMovieFrame();
movie->DrawMovie(0,0,movTxtr);
smgr->drawAll();
guienv->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
wchar_t tmp[1024];
swprintf(tmp, 1024, L"Hello World! - Magic 2d library for Irrlicht (%s)(fps:%d)",driver->getName(), fps);
device->setWindowCaption(tmp);
lastFPS = fps;
}
}
device->drop();
return 0;
}
just activate the effect befor smgr->drawAll(); the deactivate it.
Enjoy it.