I'm Italian, so sorry for my bad English
I use OpenSUSE 11.3, that works with KDevelop 4, for make C++ application...
I compiled fine Irrlicht library and I can include them very well... but, when I try compile the solution:
Code: Select all
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `drawFrame(irr::video::IVideoDriver*)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `drawFrame(irr::video::IVideoDriver*)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `disegnaRiferimento(irr::video::IVideoDriver*, float)':
CMakeFiles/sparatutto.dir/utilita.cpp.o: In function `disegnaRiferimento(irr::video::IVideoDriver*, float)':
CMakeFiles/sparatutto.dir/main.cpp.o: In function `main':
CMakeFiles/sparatutto.dir/main.cpp.o: In function `main':
utilita.cpp
Code: Select all
#include "utilita.h"
#include <iostream>
using namespace std;
/*
La procedura disegna una terna sinistrorsa
*/
void drawFrame(IVideoDriver *driver)
{
SMaterial mt;
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 255, 0, 0);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(1.0f,0.0f,0.0f),SColor(255, 255, 0,0 ));
mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 0, 255, 0);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,1.0f,0.0f),SColor(255, 0, 255, 0));
mt.AmbientColor = mt.DiffuseColor = mt.EmissiveColor = SColor(255, 0, 0, 255);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,0.0f,1.0f),SColor(255, 0, 0, 255));
}
/*
* La funzione disegna la bounding box richiesta
* Dati in ingresso:
* driver : puntatore al driver
* bbox : riferimento bounding box da disegnare
* mt : riferimento al materiale da utilizzare per il tracciamento della linea
*
* La funzione deve essere chiamata dopo aver disegnato tutta la scena in quanto modifica
* la matrice di trasformazione associata al video
*
*/
void drawBoundingBox(IVideoDriver* driver, aabbox3d<f32> &bbox, SMaterial &mt)
{
driver->setMaterial(mt);
// poich� le coordinate della bounding box sono gi� riferite
// al riferimento assoluto, resetto lo stack delle matrici di trasformazione
// del driver impostandolo alla matrice unitaria
// driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MaxEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MaxEdge.Z),vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
driver->draw3DLine(vector3df(bbox.MinEdge.X,bbox.MaxEdge.Y,bbox.MinEdge.Z),vector3df(bbox.MinEdge.X,bbox.MinEdge.Y,bbox.MinEdge.Z),SColor(255, 255, 0,0 ));
}
/*
* La funzione calcola il valore dei Frame Per Second dell'applicazione
* se il valore e' diverso da quello precedentemente calcolato
* il nuovo valore viene visualizzato nel titolo della finestra del programma
*/
void calcolaFPS( s32 &lastFPS, IrrlichtDevice *device, IVideoDriver* driver , const wchar_t *text )
{
const s32 fps = driver->getFPS();
/// se il frame rate e' cambiato aggiorno la barre del titolo
/// dell'applicazione con il nuovo frame rate
if (lastFPS != fps)
{
core::stringw str = text;
str += "[";
str += driver->getName();
str += "] FPS:";
str += fps;
// ottengo dal driver il numero di triangoli disegnati nell'ultimo frame
u32 nTri=driver->getPrimitiveCountDrawn();
str += " Tri: ";
str += nTri;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
/*
* La funzione consente all'utente di selezionare il driver video
* da utilizzare per l'applicazione
*
*/
void selezionaDriver(video::E_DRIVER_TYPE &driverType)
{
cout <<("Seleziona il driver video da utilizzare per questo esempio:\n"
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"
" (d) Software Renderer\n (e) Burning's Software Renderer\n"
" (f) NullDevice\n (altri tasti) esci\n\n");
char i;
std::cin >> i;
switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: driverType = video::EDT_OPENGL;
}
}
/*
* La procedura traccia le linee 3D che rappresentano il riferimento unitario
* Il disegno delle linee 3D deve essere posizionato nel ciclo che rigenera la scena
* dopo il disegno degli altri elementi della scena gestiti dallo scene manager
* Le linee 3D non sono gestite dallo scene manager.
* Prima di disegnare le linee devo eliminare l'eventuale matrice di trasformazione
* impostata della precedenti operazioni di disegno
*
* Parametri in ingresso:
*
* driver: puntatore al driver della scena
* lunghezza: lunghezza degli assi da disegnare
*/
void disegnaRiferimento(IVideoDriver* driver, float lunghezza)
{
SMaterial mt;
// rimuovo dallo stack delle trasformazioni la matrice preesistente ed imposto
// la matrice identit�
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
// Disegno tre segmenti giacenti lungo gli assi
mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,255,0,0);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(lunghezza,0.0f,0.0f),SColor(255, 255, 0,0 ));
mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,0,255,0);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,lunghezza,0.0f),SColor(255, 0, 255, 0));
mt.AmbientColor=mt.DiffuseColor=mt.EmissiveColor= SColor(255,0,0,255);
driver->setMaterial(mt);
driver->draw3DLine(vector3df(0.0f,0.0f,0.0f),vector3df(0.0f,0.0f,lunghezza),SColor(255, 0, 0, 255));
}
scene::ISceneNode* aggiungiMeshConMappaturaPlanare( video::IVideoDriver* driver, scene::ISceneManager* smgr, scene::IAnimatedMesh* mesh, const irr::io::path &nomeTexture, float scalaMappatura)
{
/// Genero sulla mesh una mappatura planare per l'applicazione
/// della texture
/// il primo parametro rappresenta i poligoni della mesh che hanno lo stesso materiale
/// il secondo specifica il rapporto tra le coordinate mondo e le coordinate della texture
/// provare a modificare il valore del secondo parametro
smgr->getMeshManipulator()->makePlanarTextureMapping(mesh, scalaMappatura);
scene::ISceneNode* pNode= 0;
/// creo il nodo contente la mesh
pNode = smgr->addAnimatedMeshSceneNode(mesh);
/// carico la texture da applicare al piano
pNode->setMaterialTexture(0, driver->getTexture(nomeTexture));
/// applico alla mesh la texture e imposto al zero il colore della componente speculare
pNode->getMaterial(0).SpecularColor.set(0,0,0,0);
return(pNode);
}
Code: Select all
#include <iostream>
using namespace std;
#include <irrlicht.h>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif
#include "utilita.h"
#include "receiver.h"
int main () {
//definizione vettore keyMap per FPS
SKeyMap keyMap[2];
keyMap[0].Action=EKA_STRAFE_LEFT;
keyMap[0].KeyCode=KEY_LEFT;
keyMap[1].Action=EKA_STRAFE_RIGHT;
keyMap[1].KeyCode=KEY_RIGHT;
/// creo ed inizializzo la variabile che contiene il FPS dell'applicazione
s32 lastFPS=-1;
/// Creo un istanza del gestore degli eventi personalizzato
MyEventReceiver receiver;
/// Creo il device
IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480));
// associo al device il ricevitore degli eventi
device->setEventReceiver(&receiver);
if (!device)
return 1;
/// Imposto la caption della finestra del programma
device->setWindowCaption(L"Sparatutto");
device->getCursorControl()->setVisible(false);
/** ottengo i puntatori a:
driver video
gestore della scena
gestore dell'interfaccia con lutente
*/
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
// leggo il modello della mesh dell'auto
IAnimatedMesh *scena=smgr->getMesh("media/scena1.x");
// aggiungo alla scena il nodo contenente
IAnimatedMeshSceneNode *NodoScena=smgr->addAnimatedMeshSceneNode(scena);
// disabilito l'illuminazione con luci dinamiche
NodoScena->setMaterialFlag(video::EMF_LIGHTING,true);
NodoScena->setPosition(vector3df(0.f,0.f,0.f));
/// aggiungo una camera di tipo SceneNode Maya che guarda
ICameraSceneNode *camera=smgr->addCameraSceneNodeFPS(0,0,1.5,-1,keyMap,2,true,0,false);
camera->setPosition(vector3df(0.f,250.f,-1000.f));
camera->setTarget(vector3df(0.f,100.f,0.f)); //punta al nodo della scena
scene::ITriangleSelector* selector = 0;
selector = smgr->createOctTreeTriangleSelector(NodoScena->getMesh(), NodoScena, 128);
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(selector, camera,vector3df(30,50,30),vector3df(0,0,0), vector3df(0,0,0));
selector->drop(); // As soon as we're done with the selector, drop it.
camera->addAnimator(anim);
//CREAZIONE OGGETTO "BERSAGLIO"
IAnimatedMesh *bersaglio=smgr->getMesh("media/bersaglio.x");
IAnimatedMeshSceneNode *Bersaglio=smgr->addAnimatedMeshSceneNode(bersaglio);
Bersaglio->setPosition(vector3df(0.f,0.f,23.f)); // lo posiziono
Bersaglio->setScale(vector3df(2.f,2.f,2.f));
IAnimatedMeshSceneNode *Bersaglio2=(IAnimatedMeshSceneNode*)Bersaglio->clone();
Bersaglio2->setPosition(Bersaglio->getPosition()+vector3df(500.f,0.f,0.f)); // lo posiziono
Bersaglio2->setScale(vector3df(2.f,2.f,2.f));
//CREAZIONE OGGETTO "PROIETTILE"
/*IAnimatedMesh *proiettile=smgr->getMesh("media/.x");
// aggiungo alla scena il nodo contenente
IAnimatedMeshSceneNode *Proiettile=smgr->addAnimatedMeshSceneNode(proiettile);
// disabilito l'illuminazione con luci dinamiche
Proiettile->setMaterialFlag(video::EMF_LIGHTING,false);
Proiettile->setPosition(camera->getPosition());*/
//CREO L'ANIMATORE PER IL PROIETTILE
ISceneNodeAnimator *anim_proiettili=smgr->createFlyStraightAnimator (camera->getPosition(),(camera->getPosition()+vector3df(0.f,0.f,100.f)),1,false,false);
smgr->setAmbientLight(SColorf(0.9,0.9,0.9));
/// Ridisegno la scena fino a che l'utente non preme i tasti Alt + F4
while (device->run())
{
/*if (receiver.isKeyPress=KEY_RETURN) {
// elimino l'animatore
anim_proiettili->drop();
// creo un animatore circolare e lo associo alla mesh
anim_proiettili=smgr->createFlyStraightAnimator (camera->getPosition(),(camera->getPosition()+vector3df(0.f,0.f,100.f)),1,false,false);
Proiettile->addAnimator(anim_proiettili);
}*/
/*
* avvio il processo di aggiornamento della scena e scelgo il colore dello sfondo
* il colore e' codificato con quattro valori, il primo indica la trasparenza
* 0 indica trasparenza completa 255 colore completamente opaco
* seguono poi le componenti r,g,b
*/
driver->beginScene(true, true, SColor(255,0,0,0)); // colore di sfondo nero
/// disegno la scena
smgr->drawAll();
/// disegno l'interfaccia grafica
guienv->drawAll();
/// segnalo di aver completato l'aggiornamento della scena
driver->endScene();
// Calcolo il FPS dell'applicazione e lo visualizzo nel titolo della finestra
calcolaFPS( lastFPS, device, driver , L"Sparatutto" );
/// aggiorno lo stato dei tasti
receiver.tick();
}
/// Termine del programma - rilascio il device
device->drop();
return 0;
}