Pages: 1 2
- Accueil forums
- » Routines
- » C++ Irrlicht 1.1 : Fake Glow,Dream et Night Vision
02-10-2006 20:07:55
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.240.40
- Courriel Site web
Hello,
Comme promis voici la release de mon code de fake glow,dream et night vision.
Au risque de me répéter, je ne programme pas en C++, j'apprends donc ne me ratatinez pas si vous voyez des erreurs ... il doit probablement y avoir des choses pas très belle dans mon code mais le résultat et l'idée sont là !
j'insiste encore sur le fait que se sont des FAKE effets et non pas de réel glow ou autre à base de shader.
Voici quelques screenshots pour illustrer se code :
Ici il n'y a aucun effet :
Effet de Night Vision :
Effet de Glow :
Effet de Dream :
Et ici vous pourrez télécharger le code et l'exe compilé avec la dll que j'utilise :
http://www.tv3dfr.com/irrlicht/Demo_N3.rar
Voilou @++ ![]()
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
02-10-2006 20:09:16
- DeusXL
- Membres

- Date d'inscription:
- Messages: 174
- IP: 82.66.209.23
- Courriel
Sweet ! ![]()
Je vais voir ce que je peux faire avec ça (voire le convertir comme scene node du wrapper
).
[Edit : Marche sous wine@Ubuntu 6.06, 90 fps avec le glow effect c'est pas mal du tout
]
Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.
Hors ligne
03-10-2006 10:52:59
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.153.6.212
- Courriel Site web
très réussi !
J'ai un plantage méchant en OpenGL, ca me le fait aussi dès que je veux loader une map quake 3 avec la dll de DeusXL, donc ca doit venir de ma daube de chip
j'adore l'effet dream
la classe ![]()
Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250
Hors ligne
03-10-2006 11:17:36
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.240.40
- Courriel Site web
Bon lol, moi qui esperait avoir des retours de chez les anglais c'est mal partie
.
je vous laisse l'url du post us aussi si vous voulez suivre on sait jamais :
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=16049
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
04-10-2006 19:56:27
- kedu
- Modérateurs

- Date d'inscription:
- Messages: 155
- IP: 86.207.160.2
- Courriel
Et bien bravo, tu as eu finalement ton petit succès... Vive la French Touch ^^
Hors ligne
12-10-2006 15:43:57
- Squarch
- Membres

- Date d'inscription:
- Messages: 4
- IP: 83.114.205.118
- Courriel
c'est tres reussi bravo ![]()
Hors ligne
12-10-2006 17:23:45
- Aranoth
- Membres

- Date d'inscription:
- Messages: 242
- IP: 86.213.108.190
- Courriel Site web
J'adore, vraiment.
Malheureusement j'utilise dans mon projet une camera classique, liée à un node, et du coup ça rend vraiment mal.
J'ai un peu cherché dans les sources sans trop voir où se situait le problème avec la caméra dont tu parlais dans l'autre post.
Dommage, j'aurais bien aimé utiliser le glow :p
Bonne continuation !
Hors ligne
22-10-2006 20:39:55
- Dekron
- Membres
- Date d'inscription:
- Messages: 46
- IP: 172.204.21.33
- Courriel Site web
très "fable" cet effet dream, j'apprécie. Je file voir le code.
Visitez Arcis : MMORPG ammateur utilisant irrlicht !
Etudiant ingénieur, maitrise C++, connaissances python & php.
Hors ligne
22-10-2006 20:47:00
- Dekron
- Membres
- Date d'inscription:
- Messages: 46
- IP: 172.204.21.33
- Courriel Site web
"Simson, sur irrlicht.sourceforge.org" Ecris:
It's limited at Camera FPS because my level in maths is low and i don't know how to get the camera rotation.
If you find the solution, don't hesitate to post the code Smile.
Besoin d'aide ?
Visitez Arcis : MMORPG ammateur utilisant irrlicht !
Etudiant ingénieur, maitrise C++, connaissances python & php.
Hors ligne
22-10-2006 22:08:57
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.16.11.177
- Courriel Site web
Hehe oui si tu trouves une solution je suis preneur
.
Il faut arriver à récupérer l'angle de rotation de la camera(x,y,z) pour pivoter les quad...
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
23-10-2006 09:22:54
- Dekron
- Membres
- Date d'inscription:
- Messages: 46
- IP: 194.167.30.129
- Courriel Site web
ca concerne plus la prog que des maths, de la facon dont tu l'exprime.
enfoi envoye un petit mail ( ou poste ici meme ) pour expliquer plus clairement la chose, genre ou est ce que ca te pose probleme etc ...
Visitez Arcis : MMORPG ammateur utilisant irrlicht !
Etudiant ingénieur, maitrise C++, connaissances python & php.
Hors ligne
10-12-2006 19:16:28
- N10
- Membres

- Date d'inscription:
- Messages: 46
- IP: 80.170.52.169
- Courriel
cela me semble très intéressant je le test tous de suite
Hors ligne
10-12-2006 22:55:07
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
je viens de tester, ca donne vachement bien ! [ sur mon linux, Fedora Core 4 ]
(j'ai du faire quelques modif pour compiler comme remplacer <CEffets.h> par "CEffects.h" et encader les code du .h par #ifndef Machin88 #define Machin88 .... #endif )
Merci pour ce code, je vais voir de l'integrer dans mes bidouillages
Hors ligne
30-12-2006 15:26:46
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.239.230
- Courriel Site web
J'ai effectué une petite mise à jour afin que cela fonctionne mieux sous Irrlicht 1.2.
Voici le code :
CEffects.cpp:
/*-----------------------------------------
Programmed by Fabre Cédric
(Copland/simson) 02/10/2006
Thanks to the Irrlicht team
for this good 3D engine !
This code has not been tested under Linux.
If you find any errors or corrections,
in advance thanks you for any feedbacks.
-------------------------------------------
Contact : simson2004@wanadoo.fr
-----------------------------------------*/
#include <irrlicht.h>
#include <CEffects.h>
using namespace irr;
CQuadSceneNode::CQuadSceneNode(scene::ISceneNode* parent,scene::ISceneManager* mgr,s32 id): scene::ISceneNode(parent, mgr, id)
{
Material.DiffuseColor = video::SColor(0,0,0,0);
Material.EmissiveColor = video::SColor(0,0,0,0);
Material.SpecularColor = video::SColor(0,0,0,0);
Material.ZBuffer = false;
Material.Wireframe = false;
Material.PointCloud = false;
Material.Lighting = false;
Material.BackfaceCulling = false;
Material.FogEnable = false;
Material.GouraudShading = false;
Material.NormalizeNormals = true;
Material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
irr::video::E_DRIVER_TYPE dr = mgr->getVideoDriver()->getDriverType();
if (dr != video::EDT_OPENGL)
{
video::SColor Color = video::SColor(4,40,40,40);
VertexQuad[0]=video::S3DVertex(-1,1,0,0,0,0,Color,0,0);
VertexQuad[1]=video::S3DVertex(1,1,0,0,0,0,Color,1,0);
VertexQuad[2]=video::S3DVertex(-1,-1,0,0,0,0,Color,0,1);
VertexQuad[3]=video::S3DVertex(1,-1,0,0,0,0,Color,1,1);
}
else
{
video::SColor Color = video::SColor(4,34,34,34);
VertexQuad[0]=video::S3DVertex(-1,1,0,0,0,0,Color,0,1);
VertexQuad[1]=video::S3DVertex(1,1,0,0,0,0,Color,1,1);
VertexQuad[2]=video::S3DVertex(-1,-1,0,0,0,0,Color,0,0);
VertexQuad[3]=video::S3DVertex(1,-1,0,0,0,0,Color,1,0);
}
Box.reset(VertexQuad[0].Pos);
for (s32 i=1; i<4; ++i)
{
Box.addInternalPoint(VertexQuad[i].Pos);
}
}
void CQuadSceneNode::OnPreRender()
{
if (IsVisible)
SceneManager->registerNodeForRendering(this);
ISceneNode::OnPreRender();
}
void CQuadSceneNode::render()
{
u16 indices[] = { 0,1,2, 3,2,1 };
video::IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setMaterial(Material);
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
driver->drawIndexedTriangleList(&VertexQuad[0], 4, &indices[0], 2);
}
const core::aabbox3d<f32>& CQuadSceneNode::getBoundingBox() const
{
return Box;
}
s32 CQuadSceneNode::getMaterialCount()
{
return 1;
}
video::SMaterial& CQuadSceneNode::getMaterial(s32 i)
{
return Material;
}
//Déclaration de RTexGlow;
video::ITexture* RTexGlow=0;
video::ITexture* RTexDream=0;
video::ITexture* RTexNV=0;
//Déclaration d'un CQuadSceneNode (Node personnalisé pour créer un Quad)
CQuadSceneNode* Quad[11];
//Méthode de création du Glow
void CreateGlow(scene::ICameraSceneNode* CamGlow,scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 GlowSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
//Ici on creer notre Render Texture
RTexGlow=driver->createRenderTargetTexture(core::dimension2d<s32>(GlowSize,GlowSize));
f32 resultat = cos((CamGlow->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamGlow->getAspectRatio();
//Ici on va créer plusieurs quad pour simuler un effet de Blur
for (int nbquad=0;nbquad<=3;nbquad++)
{
Quad[nbquad] = new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
Quad[nbquad]->setParent(CamGlow);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.003f+(nbquad/300),-0.001f+(nbquad/300),1.09f));
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX+((float)nbquad/300),SizeY+((float)nbquad/300),1));
Quad[nbquad]->setMaterialTexture(0,RTexGlow);
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu du Glow
void RenderGlow(scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 gA=0,s32 gR=0,s32 gG=0,s32 gB=0)
{
//On test si le Render Texture existe bien
if (RTexGlow)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL)
{
if (i==0 || i >=4){Quad[i]->setVisible(false);}else{Quad[i]->setVisible(true);}
}
}
//On affiche notre scene
driver->setRenderTarget(RTexGlow, true, true, video::SColor(gA,gR,gG,gB));
smgr->drawAll();
driver->setRenderTarget(0);
//On affiche nos quads
Quad[0]->setVisible(true);
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->updateAbsolutePosition();}
}
}
}
//Méthode de création de l'effet Dream Filter
void CreateDreamFilter(scene::ICameraSceneNode* CamDream,scene::ISceneManager* smgr,video::IVideoDriver* driver,f32 EffectSize=1.0f,s32 DreamSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
//Ici on creer notre Render Texture
RTexDream=driver->createRenderTargetTexture(core::dimension2d<s32>(DreamSize,DreamSize));
f32 resultat = cos((CamDream->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamDream->getAspectRatio();
//Alors ici on va en créer plusieurs pour simuler un effet de Blur
for (int nbquad=4;nbquad<=7;nbquad++)
{
Quad[nbquad] = new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
Quad[nbquad]->setParent(CamDream);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.001f,-0.001f,1.09f));
Quad[nbquad]->setScale(irr::core::vector3df((ScaleX+((float)nbquad/20)*EffectSize),(SizeY+((float)nbquad/20)*EffectSize),1));
Quad[nbquad]->setMaterialTexture(0,RTexDream);
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu du DreamFilter
void RenderDreamFilter(scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 dA=0,s32 dR=0,s32 dG=0,s32 dB=0)
{
//On test si le Render Texture existe bien
if (RTexDream)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->setVisible(false);}
}
Quad[5]->setVisible(true);
Quad[6]->setVisible(true);
Quad[7]->setVisible(true);
//On affiche notre scene
driver->setRenderTarget(RTexDream, true, true, video::SColor(dA,dR,dG,dB));
smgr->drawAll();
driver->setRenderTarget(0);
Quad[4]->setVisible(true);
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->updateAbsolutePosition();}
}
}
}
//Méthode de création de l'effet NightVision
void CreateNightVision(scene::ICameraSceneNode* CamNightVision,scene::ISceneManager* smgr,video::IVideoDriver* driver,irr::c8* NoiseFile,s32 NightVisionSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
irr::video::E_DRIVER_TYPE dr = smgr->getVideoDriver()->getDriverType();
irr::video::ITexture* NoiseTexture = driver->getTexture(NoiseFile);
//Ici on creer notre Render Texture
RTexNV=driver->createRenderTargetTexture(core::dimension2d<s32>(NightVisionSize,NightVisionSize));
f32 resultat = cos((CamNightVision->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamNightVision->getAspectRatio();
for (int nbquad=8;nbquad<=10;nbquad++)
{
Quad[nbquad]= new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
Quad[nbquad]->setParent(CamNightVision);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.001f,0.001f,1.09f));
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX,SizeY,1));
for (int i =0;i<=Quad[nbquad]->getMaterialCount()-1;i++)
{
if(nbquad!=10)
{
//On test si on est en directx ou autre pour gérer les coloris
if (dr != video::EDT_OPENGL)
{
Quad[nbquad]->getMaterial(i).MaterialType=video::EMT_TRANSPARENT_VERTEX_ALPHA;
Quad[nbquad]->getMaterial(i).DiffuseColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).EmissiveColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).AmbientColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).SpecularColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).Lighting=true;
}
else
{
Quad[nbquad]->getMaterial(i).MaterialType=video::EMT_TRANSPARENT_VERTEX_ALPHA;
Quad[nbquad]->getMaterial(i).DiffuseColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).EmissiveColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).AmbientColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).SpecularColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).Lighting=true;
}
}
}
if (nbquad!=10)
{
Quad[nbquad]->setMaterialTexture(0,RTexNV);
}
else
{
core::vector3df vec = Quad[nbquad]->getPosition();
vec.Z = 1.05f;
scene::ISceneNodeAnimator* noiseAnim = smgr->createFlyCircleAnimator(vec,0.03f,0.7f);
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX+0.05f,SizeY+0.05f,1));
Quad[nbquad]->addAnimator(noiseAnim);
Quad[nbquad]->setMaterialTexture(0,NoiseTexture);
}
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu de l'effet NightVision
void RenderNightVision(scene::ISceneManager* smgr,video::IVideoDriver* driver)
{
//On test si le Render Texture existe bien
if (RTexNV)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL)
{
if (i<=8){Quad[i]->setVisible(false);}else{Quad[i]->setVisible(true);}
}
}
//On affiche notre scene
driver->setRenderTarget(RTexNV, true, true, video::SColor(0,0,0,0));
smgr->drawAll();
driver->setRenderTarget(0);
Quad[8]->setVisible(true);
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->updateAbsolutePosition();}
}
}
}
//Méthode si l'on ne veut plus rien afficher
void RenderNothing()
{
for (int i =0;i<=10;i++)
{
if (Quad[i]!= NULL){Quad[i]->setVisible(false);}
}
}
//Méthode de suppression du Glow
void DeleteGlow()
{
if (RTexGlow){RTexGlow->drop();}
for (int i=0;i<=3;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression du DreamFilter
void DeleteDream()
{
if (RTexDream){RTexDream->drop();}
for (int i=4;i<=7;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression du Night Vision
void DeleteNightVision()
{
if (RTexNV){RTexNV->drop();}
for (int i=8;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression
void DeleteEffects()
{
//On test si notre Render Texture existe bien et on supprime
if (RTexGlow){RTexGlow->drop();}
if (RTexDream){RTexDream->drop();}
if (RTexNV){RTexNV->drop();}
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}CEffects.h:
/*-----------------------------------------
Programmed by Fabre Cédric
(Copland/simson) 02/10/2006
Thanks to the Irrlicht team
for this good 3D engine !
This code has not been tested under Linux.
If you find any errors or corrections,
in advance thanks you for any feedbacks.
-------------------------------------------
Contact : simson2004@wanadoo.fr
-----------------------------------------*/
using namespace irr;
//Classe QuadSceneNode pour dessiner un Quad perso
class CQuadSceneNode : public scene::ISceneNode
{
public:
CQuadSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id);
virtual void OnPreRender();
virtual void render();
virtual const core::aabbox3d<f32>& getBoundingBox() const;
s32 getMaterialCount();
virtual video::SMaterial& getMaterial(s32 i);
private :
core::aabbox3d<f32> Box;
video::S3DVertex VertexQuad[4];
video::SMaterial Material;
};
void CreateGlow(scene::ICameraSceneNode* CamGlow,scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 GlowSize);
void RenderGlow(scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 gA,s32 gR,s32 gG,s32 gB);
void CreateDreamFilter(scene::ICameraSceneNode* CamDream,scene::ISceneManager* smgr,video::IVideoDriver* driver,f32 EffectSize,s32 DreamSize);
void RenderDreamFilter(scene::ISceneManager* smgr,video::IVideoDriver* driver,s32 dA,s32 dR,s32 dG,s32 dB);
void CreateNightVision(scene::ICameraSceneNode* CamNightVision,scene::ISceneManager* smgr,video::IVideoDriver* driver,irr::c8* NoiseFile,s32 NightVisionSize);
void RenderNightVision(scene::ISceneManager* smgr,video::IVideoDriver* driver);
void RenderNothing();
void DeleteGlow();
void DeleteDream();
void DeleteNightVision();
void DeleteEffects();Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
30-12-2006 17:49:37
- Aranoth
- Membres

- Date d'inscription:
- Messages: 242
- IP: 86.201.49.229
- Courriel Site web
As-tu réglé ton problème avec les caméras "statiques" (comprendre non FPS et non Maya) ?
Hors ligne
30-12-2006 19:03:58
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.157.24
- Courriel Site web
Bein non, et je ne pense pas le régler à grand coup de baguette magique malheureusement
.
Je pense qu'il faudrait directement modifier le code d'irrlicht dans les Cameras pour corriger se problème....
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
31-12-2006 12:52:38
- smeagol
- Membres
- Date d'inscription:
- Messages: 34
- IP: 83.205.47.253
- Courriel
Le code est-il compilable sous nunux.
Hors ligne
31-12-2006 13:11:57
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.157.24
- Courriel Site web
Il est écrit comme "non testé sous linux", mais en fait je l'ai testé sous Code::Blocks Linux Ubuntu et ça marche bien
.
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
31-12-2006 13:40:27
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
smeagol Ecris:
Le code est-il compilable sous nunux.
chez moi ca compile (en ligne de commande, sans ide, fedora code 4), mais j'ai du faire les modif dont j'ai parlé précédemment :
remplacer <CEffets.h> par "CEffects.h" et encader les code du .h par #ifndef Machin88 #define Machin88 .... #endif
Hors ligne
12-02-2007 17:34:10
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.162.175
- Courriel Site web
Une petite mise à jour pour que cela fonctionne théoriquement avec les autres caméras...A tester donc.
CEffects.cpp :
/*-----------------------------------------
Programmed by Fabre Cédric
(Copland/simson) 02/10/2006
Thanks to the Irrlicht team
for this good 3D engine !
This code has not been tested under Linux.
If you find any errors or corrections,
in advance thanks you for any feedbacks.
-------------------------------------------
Contact : simson2004@wanadoo.fr
-----------------------------------------*/
#include <irrlicht.h>
#include <CEffects.h>
using namespace irr;
namespace EffectsLibrary
{
CQuadSceneNode::CQuadSceneNode(scene::ISceneNode* parent,scene::ISceneManager* mgr,s32 id): scene::ISceneNode(parent, mgr, id)
{
Material.DiffuseColor = video::SColor(0,0,0,0);
Material.EmissiveColor = video::SColor(0,0,0,0);
Material.SpecularColor = video::SColor(0,0,0,0);
Material.ZBuffer = false;
Material.ZWriteEnable = false;
Material.Wireframe = false;
Material.PointCloud = false;
Material.Lighting = false;
Material.BackfaceCulling = false;
Material.FogEnable = false;
Material.GouraudShading = false;
Material.NormalizeNormals = true;
Material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
irr::video::E_DRIVER_TYPE dr = mgr->getVideoDriver()->getDriverType();
if (dr != video::EDT_OPENGL)
{
video::SColor Color = video::SColor(4,40,40,40);
VertexQuad[0]=video::S3DVertex(-1,1,0,0,0,0,Color,0,0);
VertexQuad[1]=video::S3DVertex(1,1,0,0,0,0,Color,1,0);
VertexQuad[2]=video::S3DVertex(-1,-1,0,0,0,0,Color,0,1);
VertexQuad[3]=video::S3DVertex(1,-1,0,0,0,0,Color,1,1);
}
else
{
video::SColor Color = video::SColor(4,34,34,34);
VertexQuad[0]=video::S3DVertex(-1,1,0,0,0,0,Color,0,1);
VertexQuad[1]=video::S3DVertex(1,1,0,0,0,0,Color,1,1);
VertexQuad[2]=video::S3DVertex(-1,-1,0,0,0,0,Color,0,0);
VertexQuad[3]=video::S3DVertex(1,-1,0,0,0,0,Color,1,0);
}
Box.reset(VertexQuad[0].Pos);
for (s32 i=1; i<4; ++i)
{
Box.addInternalPoint(VertexQuad[i].Pos);
}
}
void CQuadSceneNode::OnPreRender()
{
if (IsVisible)
SceneManager->registerNodeForRendering(this);
ISceneNode::OnPreRender();
}
void CQuadSceneNode::render()
{
u16 indices[] = { 0,1,2, 3,2,1 };
video::IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setMaterial(Material);
core::matrix4 Mat;
Mat.makeIdentity();
//On sauvegarde les matrices
core::matrix4 MatrixWorld = driver->getTransform(video::ETS_WORLD);
core::matrix4 MatrixView = driver->getTransform(video::ETS_VIEW);
//On applique les matrices de monde et de vue
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
driver->setTransform(video::ETS_VIEW,Mat);
//On dessine nos Quad ici
driver->drawIndexedTriangleList(&VertexQuad[0], 4, &indices[0], 2);
//On restaure les matrices
driver->setTransform(video::ETS_VIEW,MatrixView);
driver->setTransform(video::ETS_WORLD,MatrixWorld);
}
const core::aabbox3d<f32>& CQuadSceneNode::getBoundingBox() const
{
return Box;
}
u32 CQuadSceneNode::getMaterialCount()
{
return 1;
}
video::SMaterial& CQuadSceneNode::getMaterial(u32 i)
{
return Material;
}
//Déclaration de RTexGlow;
video::ITexture* RTexGlow=0;
video::ITexture* RTexDream=0;
video::ITexture* RTexNV=0;
//Déclaration d'un CQuadSceneNode (Node personnalisé pour créer un Quad)
CQuadSceneNode* Quad[11];
//Méthode de création du Glow
void CreateGlow(scene::ICameraSceneNode* CamGlow,scene::ISceneManager* smgr,s32 GlowSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (smgr->getVideoDriver()->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
//Ici on creer notre Render Texture
RTexGlow = smgr->getVideoDriver()->createRenderTargetTexture(core::dimension2d<s32>(GlowSize,GlowSize));
f32 resultat = cos((CamGlow->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamGlow->getAspectRatio();
//Ici on va créer plusieurs quad pour simuler un effet de Blur
for (int nbquad=0;nbquad<=3;nbquad++)
{
Quad[nbquad] = new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
//Quad[nbquad]->setAutomaticCulling(false);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.003f+(nbquad/300),-0.001f+(nbquad/300),1.09f));
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX+((float)nbquad/300),SizeY+((float)nbquad/300),1));
Quad[nbquad]->setMaterialTexture(0,RTexGlow);
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu du Glow
void RenderGlow(scene::ISceneManager* smgr,s32 gA=0,s32 gR=0,s32 gG=0,s32 gB=0,u32 NbsOfPass=0)
{
//On test si le Render Texture existe bien
if (RTexGlow)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL)
{
if (i==0 || i >=4){Quad[i]->setVisible(false);}else{Quad[i]->setVisible(true);}
}
}
//On affiche notre scene
smgr->getVideoDriver()->setRenderTarget(RTexGlow, true, true, video::SColor(gA,gR,gG,gB));
smgr->drawAll();
smgr->getVideoDriver()->setRenderTarget(0);
switch (NbsOfPass)
{
case 1:
Quad[1]->setVisible(false);
Quad[2]->setVisible(false);
Quad[3]->setVisible(false);
break;
case 2:
Quad[1]->setVisible(false);
Quad[2]->setVisible(false);
break;
case 3:
Quad[1]->setVisible(false);
break;
}
//On affiche nos quads
Quad[0]->setVisible(true);
}
}
//Méthode de création de l'effet Dream Filter
void CreateDreamFilter(scene::ICameraSceneNode* CamDream,scene::ISceneManager* smgr,f32 EffectSize=1.0f,s32 DreamSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (smgr->getVideoDriver()->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
//Ici on creer notre Render Texture
RTexDream=smgr->getVideoDriver()->createRenderTargetTexture(core::dimension2d<s32>(DreamSize,DreamSize));
f32 resultat = cos((CamDream->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamDream->getAspectRatio();
//Alors ici on va en créer plusieurs pour simuler un effet de Blur
for (int nbquad=4;nbquad<=7;nbquad++)
{
Quad[nbquad] = new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
//Quad[nbquad]->setAutomaticCulling(false);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.001f,-0.001f,1.09f));
Quad[nbquad]->setScale(irr::core::vector3df((ScaleX+((float)nbquad/20)*EffectSize),(SizeY+((float)nbquad/20)*EffectSize),1));
Quad[nbquad]->setMaterialTexture(0,RTexDream);
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu du DreamFilter
void RenderDreamFilter(scene::ISceneManager* smgr,s32 dA=0,s32 dR=0,s32 dG=0,s32 dB=0)
{
//On test si le Render Texture existe bien
if (RTexDream)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->setVisible(false);}
}
Quad[5]->setVisible(true);
Quad[6]->setVisible(true);
Quad[7]->setVisible(true);
//On affiche notre scene
smgr->getVideoDriver()->setRenderTarget(RTexDream, true, true, video::SColor(dA,dR,dG,dB));
smgr->drawAll();
smgr->getVideoDriver()->setRenderTarget(0);
Quad[4]->setVisible(true);
}
}
//Méthode de création de l'effet NightVision
void CreateNightVision(scene::ICameraSceneNode* CamNightVision,scene::ISceneManager* smgr,irr::c8* NoiseFile,s32 NightVisionSize=64)
{
//On vérifi que la carte vidéo soit cappable d'utiliser le Render To Texture
if (smgr->getVideoDriver()->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
irr::video::E_DRIVER_TYPE dr = smgr->getVideoDriver()->getDriverType();
irr::video::ITexture* NoiseTexture = smgr->getVideoDriver()->getTexture(NoiseFile);
//Ici on creer notre Render Texture
RTexNV=smgr->getVideoDriver()->createRenderTargetTexture(core::dimension2d<s32>(NightVisionSize,NightVisionSize));
f32 resultat = cos((CamNightVision->getFOV()/2));
resultat = 1.09f/resultat;
resultat = (resultat*resultat) - (1.09f*1.09f);
resultat = sqrt(resultat);
f32 SizeY = resultat;
f32 ScaleX = resultat * CamNightVision->getAspectRatio();
for (int nbquad=8;nbquad<=10;nbquad++)
{
Quad[nbquad]= new CQuadSceneNode(smgr->getRootSceneNode(), smgr, 0);
//Quad[nbquad]->setAutomaticCulling(false);
Quad[nbquad]->setPosition(irr::core::vector3df(-0.001f,0.001f,1.09f));
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX,SizeY,1));
for (u32 i =0;i<=Quad[nbquad]->getMaterialCount()-1;i++)
{
if(nbquad!=10)
{
//On test si on est en directx ou autre pour gérer les coloris
if (dr != video::EDT_OPENGL)
{
Quad[nbquad]->getMaterial(i).MaterialType=video::EMT_TRANSPARENT_VERTEX_ALPHA;
Quad[nbquad]->getMaterial(i).DiffuseColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).EmissiveColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).AmbientColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).SpecularColor = video::SColor(10,20,150,20);
Quad[nbquad]->getMaterial(i).Lighting=true;
}
else
{
Quad[nbquad]->getMaterial(i).MaterialType=video::EMT_TRANSPARENT_VERTEX_ALPHA;
Quad[nbquad]->getMaterial(i).DiffuseColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).EmissiveColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).AmbientColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).SpecularColor = video::SColor(10,10,120,10);
Quad[nbquad]->getMaterial(i).Lighting=true;
}
}
}
if (nbquad!=10)
{
Quad[nbquad]->setMaterialTexture(0,RTexNV);
}
else
{
core::vector3df vec = Quad[nbquad]->getPosition();
vec.Z = 1.05f;
scene::ISceneNodeAnimator* noiseAnim = smgr->createFlyCircleAnimator(vec,0.03f,0.7f);
Quad[nbquad]->setScale(irr::core::vector3df(ScaleX+0.05f,SizeY+0.05f,1));
Quad[nbquad]->addAnimator(noiseAnim);
Quad[nbquad]->setMaterialTexture(0,NoiseTexture);
}
Quad[nbquad]->drop();
}
}
}
//Méthode de rendu de l'effet NightVision
void RenderNightVision(scene::ISceneManager* smgr)
{
//On test si le Render Texture existe bien
if (RTexNV)
{
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL)
{
if (i<=8){Quad[i]->setVisible(false);}else{Quad[i]->setVisible(true);}
}
}
//On affiche notre scene
smgr->getVideoDriver()->setRenderTarget(RTexNV, true, true, video::SColor(0,0,0,0));
smgr->drawAll();
smgr->getVideoDriver()->setRenderTarget(0);
Quad[8]->setVisible(true);
}
}
//Méthode si l'on ne veut plus rien afficher
void RenderNothing()
{
for (int i =0;i<=10;i++)
{
if (Quad[i]!= NULL){Quad[i]->setVisible(false);}
}
}
//Méthode de suppression du Glow
void DeleteGlow()
{
if (RTexGlow){RTexGlow->drop();}
for (int i=0;i<=3;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression du DreamFilter
void DeleteDream()
{
if (RTexDream){RTexDream->drop();}
for (int i=4;i<=7;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression du Night Vision
void DeleteNightVision()
{
if (RTexNV){RTexNV->drop();}
for (int i=8;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
//Méthode de suppression
void DeleteEffects()
{
//On test si notre Render Texture existe bien et on supprime
if (RTexGlow){RTexGlow->drop();}
if (RTexDream){RTexDream->drop();}
if (RTexNV){RTexNV->drop();}
for (int i=0;i<=10;i++)
{
if (Quad[i] != NULL){Quad[i]->remove();}
}
}
}CEffects.h
/*-----------------------------------------
Programmed by Fabre Cédric
(Copland/simson) 02/10/2006
Thanks to the Irrlicht team
for this good 3D engine !
This code has not been tested under Linux.
If you find any errors or corrections,
in advance thanks you for any feedbacks.
-------------------------------------------
Contact : simson2004@wanadoo.fr
-----------------------------------------*/
using namespace irr;
namespace EffectsLibrary
{
class CQuadSceneNode : public scene::ISceneNode
{
public:
CQuadSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id);
virtual void OnPreRender();
virtual void render();
virtual const core::aabbox3d<f32>& getBoundingBox() const;
u32 getMaterialCount();
virtual video::SMaterial& getMaterial(u32 i);
private :
core::aabbox3d<f32> Box;
video::S3DVertex VertexQuad[4];
video::SMaterial Material;
};
void CreateGlow(scene::ICameraSceneNode* CamGlow,scene::ISceneManager* smgr,s32 GlowSize);
void RenderGlow(scene::ISceneManager* smgr,s32 gA,s32 gR,s32 gG,s32 gB,u32 NbsOfPass);
void CreateDreamFilter(scene::ICameraSceneNode* CamDream,scene::ISceneManager* smgr,f32 EffectSize,s32 DreamSize);
void RenderDreamFilter(scene::ISceneManager* smgr,s32 dA,s32 dR,s32 dG,s32 dB);
void CreateNightVision(scene::ICameraSceneNode* CamNightVision,scene::ISceneManager* smgr,irr::c8* NoiseFile,s32 NightVisionSize);
void RenderNightVision(scene::ISceneManager* smgr);
void RenderNothing();
void DeleteGlow();
void DeleteDream();
void DeleteNightVision();
void DeleteEffects();
}Voilou, en espérant que vous y apporterez des améliorations, ça serai sympa
@+
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
28-02-2007 16:14:39
- alikettab
- Membres
- Date d'inscription:
- Messages: 3
- IP: 41.201.220.134
- Courriel
Je vais tester ca, puis je vous en dit mon avis.
Hors ligne
30-12-2007 12:34:00
- gp2mv3
- Membres
- Date d'inscription:
- Messages: 103
- IP: 81.244.89.36
- Courriel Site web
Salut,
J'ai essayé ton code mais j'ai un problème au niveau de la ligne 67 de CEffects.cpp.
Voici la ligne :
ISceneNode::OnRender();
Je suis sous Irrlicht 1.4 et j'ai cherché un membre du style de celui-là mais je n'en trouve pas.
Existe t'il un membre du même type ?
Merci d'avance.
Gp2mv3
Hors ligne
30-12-2007 14:54:10
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 78.115.131.54
- Courriel Site web
remplace
ISceneNode::OnRender();
par
ISceneNode::OnRegisterSceneNode();![]()
Edit : OnRender ses pour les version enterieur de irrlicht ( 1.0 à 1.2 ) pour les nouvelle versin ses OnRegisterSceneNode ^^
Hors ligne
30-12-2007 15:00:03
- gp2mv3
- Membres
- Date d'inscription:
- Messages: 103
- IP: 81.244.89.36
- Courriel Site web
Ok, merci, je vais essayer.
Hors ligne
30-12-2007 15:03:34
- gp2mv3
- Membres
- Date d'inscription:
- Messages: 103
- IP: 81.244.89.36
- Courriel Site web
J'ai une erreur dans mon compilateur :
No space left on device
Assembler messages:
No space left on device
Enfin, c'est vraisemblablement l'assembleur qui plante.
Hors ligne



