int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Lens Flare", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node2->setMaterialFlag( EMF_LIGHTING, false ); node2->setMD2Animation( scene::EMAT_STAND ); node2->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); node2->setPosition( vector3df( 20.0f, 0.0f, 0.0f ) ); ICameraSceneNode* cam = smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); ISceneNode* sun = smgr->addSphereSceneNode( 50.0f, 16 ); sun->setPosition( vector3df( 0.0f, 50.0f, 1000.0f ) ); sun->setMaterialFlag( EMF_LIGHTING, false ); sun->setMaterialTexture( 0, driver->getTexture("sun.png") ); // Interesting stuff // As before, we make a renderer IPostProc* ppRenderer = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); // Now make a flare effect: // (render from, output size, sun scene node) // can also use a vector instead of a scene node - when using a scene node the position will follow node automatically CLensFlarePostProc* ppFlare1 = new CLensFlarePostProc( ppRenderer, dimension2di( 1024, 512 ), driver->getTexture("flare.png"), sun, 50.0f ); CLensFlarePostProc* ppFlare2 = new CLensFlarePostProc( ppFlare1, dimension2di( 1024, 512 ), driver->getTexture("flare.png"), vector3df( -2000.0f, 50.0f, 1000.0f ) ); ppFlare2->setQuality( PPQ_CRUDE ); // Setting the quality to crude avoids pixel checking, which is slow (expecially when more than one lens flare), so if you use >1 flare, set most of them to crude. // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { cam->setPosition( vector3df( -(device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.2f, -70.0f ) ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppFlare2->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppFlare1; delete ppFlare2; delete ppRenderer; // Back to boring stuff device->drop(); return 0; }
/** Verify that two skinned animated mesh scene nodes can use different frames of the skinned mesh */ bool b3dAnimation(void) { // Use EDT_BURNINGSVIDEO since it is not dependent on (e.g.) OpenGL driver versions. IrrlichtDevice *device = createDevice( EDT_BURNINGSVIDEO, dimension2d<s32>(160, 120), 32); assert(device); if (!device) return false; IVideoDriver* driver = device->getVideoDriver(); ISceneManager * smgr = device->getSceneManager(); IAnimatedMesh* mesh = smgr->getMesh("../media/ninja.b3d"); IAnimatedMeshSceneNode* node1; IAnimatedMeshSceneNode* node2; assert(mesh); bool result = false; if(mesh) { node1 = smgr->addAnimatedMeshSceneNode(mesh); assert(node1); if(node1) { node1->setPosition(vector3df(-3, -3, 10)); node1->setMaterialFlag(EMF_LIGHTING, false); node1->setAnimationSpeed(0.f); } node2 = smgr->addAnimatedMeshSceneNode(mesh); assert(node2); if(node2) { node2->setPosition(vector3df(3, -3, 10)); node2->setMaterialFlag(EMF_LIGHTING, false); node2->setAnimationSpeed(0.f); node2->setCurrentFrame(62.f); } (void)smgr->addCameraSceneNode(); // Just jump to the last frame since that's all we're interested in. device->run(); driver->beginScene(true, true, SColor(255, 255, 255, 0)); smgr->drawAll(); driver->endScene(); result = takeScreenshotAndCompareAgainstReference(driver, "-b3dAnimation.png"); } device->drop(); return result; }
int main() { IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(800, 600)); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); smgr->addCameraSceneNode(0, vector3df(0,10,-10), vector3df(0,5,0)); IAnimatedMesh* mesh = smgr->getMesh("ninja.b3d"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh); node->setMaterialFlag(EMF_LIGHTING, false); node->setMaterialTexture( 0, driver->getTexture("nskinrd.jpg") ); node->setRotation(vector3df(0,180,0)); // let ninja be in front to us node->setJointMode(EJUOR_CONTROL); // tell irrlicht that you want to control joint positions IBoneSceneNode* bone = node->getJointNode("Joint10"); // create IBoneSceneNode and select the desired bone while(device->run()) { bone->setRotation(bone->getRotation() + vector3df(1,0,0)); // rotate bone driver->beginScene(); smgr->drawAll(); driver->endScene(); } device->drop(); return 0; }
bool testTransparentVertexAlphaMore(E_DRIVER_TYPE driverType) { IrrlichtDevice *device = createDevice(driverType, dimension2d<u32>(160, 120)); if (!device) return true; IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); if (driver->getColorFormat() != video::ECF_A8R8G8B8) { device->closeDevice(); device->run(); device->drop(); return true; } logTestString("Testing driver %ls\n", driver->getName()); IAnimatedMesh* mesh = smgr->getMesh("../media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); IMeshSceneNode* cube = smgr->addCubeSceneNode(10.0f,0,-1,vector3df(-5,3,-15)); if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setFrameLoop(0, 310); node->setMaterialTexture( 0, driver->getTexture("../media/sydney.bmp") ); } if (cube) { cube->getMaterial(0).MaterialType = EMT_TRANSPARENT_VERTEX_ALPHA; cube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp")); cube->setMaterialFlag(EMF_LIGHTING, false); smgr->getMeshManipulator()->setVertexColorAlpha(cube->getMesh(),128); } // second cube without texture cube = smgr->addCubeSceneNode(10.0f,0,-1,vector3df(5,3,-15)); if (cube) { cube->getMaterial(0).MaterialType = EMT_TRANSPARENT_VERTEX_ALPHA; cube->setMaterialFlag(EMF_LIGHTING, false); smgr->getMeshManipulator()->setVertexColorAlpha(cube->getMesh(),128); } smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); driver->beginScene(true, true, SColor(0,200,200,200)); smgr->drawAll(); driver->endScene(); bool result = takeScreenshotAndCompareAgainstReference(driver, "-transparentVertexAlphaChannelMore.png", 99.18f); device->closeDevice(); device->run(); device->drop(); return result; }
Car::Car(vector3df position, f64 radius, vector3df velocity, f64 maxSpeed, vector3df heading, f64 mass, vector3df scale, f64 turnRate, f64 maxForce) : MovingEntity(position, radius, velocity, maxSpeed, heading, mass, scale, turnRate, maxForce), m_pSceneNode(null), m_pStateMachine(null), m_p2DSprite(null), m_pCarPhaysics(null), m_pMesh(null) { // get ready state machine m_pStateMachine = new StateMachine<Car>(this); // start from nothing m_pStateMachine->ChangeState(IdleCar::Instance()); // get ready sprite ISceneManager* pSmgr = IrrDvc.GetSmgr(); IVideoDriver* pDriver = IrrDvc.GetDriver(); m_p2DSprite = pSmgr->addBillboardSceneNode(); m_p2DSprite->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL); video::ITexture* pTexture = pDriver->getTexture("Rsrc/car.tga"); // shkim, TODO. // why should I grap this texture here? as a result, get(+1)->grab(+1)->drop(-1) will give reference count as 1. // that means nobody know when I release texture after using at all. how do I figure it out? // answer is, keeping texture resource during Proc life time. it means loading texture at Proc initializing time and releasing them at Proc releasing time. // for doing that, need to use grab/drop pair after getTexture() pTexture->grab(); m_p2DSprite->setMaterialTexture(0, pTexture); m_p2DSprite->setMaterialFlag(video::EMF_LIGHTING, false); m_p2DSprite->setMaterialFlag(video::EMF_ZBUFFER, true); m_p2DSprite->setMaterialFlag(video::EMF_ZWRITE_ENABLE, true); m_p2DSprite->setSize(dimension2df(scale.X, scale.Y)); m_p2DSprite->setPosition(position); m_p2DSprite->setID(ID()); // get ready 3d scene node #ifdef DRAW_CAR_3D_MODEL // shkim, do not draw mode now m_pMesh = pSmgr->getMesh("Rsrc/cube.xml"); m_pSceneNode = pSmgr->addAnimatedMeshSceneNode(m_pMesh); m_pSceneNode->setPosition(vector3df(0.f, 0.f, 0.f)); m_pSceneNode->setRotation(vector3df(0.f, 0.f, 0.f)); m_pSceneNode->setScale(vector3df(4.f, 8.f, 1.f)); m_pSceneNode->setMaterialFlag(EMF_LIGHTING, false); #endif // DRAW_CAR_3D_MODEL // get ready physics model m_pCarPhaysics = new iforce2d_TopdownCar(&Box2dWld.GetWorld()); }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Multiple Renders", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Interesting stuff // This time, we make 2 renderers for the same scene IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); IPostProc* ppRenderer2 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); CEffectPostProc* ppBlur = new CEffectPostProc( ppRenderer2, dimension2di( 1024, 512 ), PP_BLUR, 0.005f ); CEffectPostProc* ppOverlay = new CEffectPostProc( ppRenderer1, dimension2di( 1024, 512 ), PP_OVERLAY, 1.0f ); ppOverlay->setInput( 1, ppBlur ); // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); // Because we want to have each scene render differently, we need to render them manually between changes: node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); ppRenderer1->preRender( ); // Note: preRender not render, and no NULL node->setMaterialTexture( 0, driver->getTexture("fireball.bmp") ); // We could call ppRender2->preRender() here, but it isn't necessary since the overlay will do that for us anyway ppOverlay->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppOverlay; delete ppBlur; delete ppRenderer1; delete ppRenderer2; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Custom Effect (Old Monitor)", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Interesting stuff IPostProc* ppRenderer = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); CEffectPostProc* ppMine = new CEffectPostProc( ppRenderer, dimension2di( 1024, 512 ), GL_OLDMONITOR, DX_OLDMONITOR, EPST_PS_1_2, EPST_PS_2_0, EMT_SOLID, PPF_FROMCODE, 1.0f ); // Notes: // EPST_PS_1_2 shows the minimum version required to run your shader - usually EPST_PS_1_1 for simple things // EMT_SOLID can be changed to EMT_TRANSPARENT_ALPHA_CHANNEL, EMT_TRANSPARENT_ALPHA_CHANNEL_REF, etc. If this is done, the first texture is copied to the screen, then the second drawn on top using your shader. This is much faster than using 2 dynamic textures in one shader (not sure why) so use it when you can if you have 2 inputs // 1.0f is where your parameters go // Remember to use setTimer if your effect uses the time variable: ppMine->setTimer( device->getTimer( ) ); // I hate this next line, but it needs to be set correctly to prevent MAJOR slowdown in Irrlicht when running in Direct3D mode. // (if not called, your shader will have all parameters set to 0. If called with values too high, your app will slow significantly) // Note: this is ONLY needed with custom shaders ppMine->setRequiredVariables( 1, true, true ); // (number of input parameters, uses time?, uses randNum?) // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { // The monitor effect needs to know how strong it should be ppMine->setParameters( min_( 1.0f, device->getTimer( )->getTime( ) * 0.0002f ) ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppMine->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppMine; delete ppRenderer; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Mixing Scenes", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Set up the second scene, object & camera - this time, use a different texture and camera angle to show some change ISceneManager* smgr2 = smgr->createNewSceneManager( false ); ISceneNode* rootnode2 = smgr2->getRootSceneNode( ); IAnimatedMeshSceneNode* node2 = smgr2->addAnimatedMeshSceneNode( smgr2->getMesh( "sydney.md2" ), rootnode2 ); node2->setMaterialFlag( EMF_LIGHTING, false ); node2->setMD2Animation( scene::EMAT_STAND ); node2->setMaterialTexture( 0, driver->getTexture("fireball.bmp") ); smgr2->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 10.0f, 5.0f, 0.0f ) ); // Interesting stuff (see previous example for full details) IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); IPostProc* ppRenderer2 = new CRendererPostProc( smgr2, dimension2di( 1024, 512 ), true, true, SColor( 255u, 0u, 0u, 0u ) ); // PP_OVERLAY takes a multiplication parameter - setting this to 1.0 does a simple add, 2.0 doubles the second texture's luminosity, etc. CEffectPostProc* ppOverlay = new CEffectPostProc( ppRenderer1, dimension2di( 1024, 512 ), PP_OVERLAY, 2.0f ); // The constructor can only take 1 input, but PP_OVERLAY needs 2, so set the other one now; ppOverlay->setInput( 1, ppRenderer2 ); // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); // We only need to tell the final node to render - it will automatically render both scenes ppOverlay->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppRenderer1; delete ppRenderer2; delete ppOverlay; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Transitions", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Set up the second scene, object & camera - this time, use a different texture and camera angle to show some change ISceneManager* smgr2 = smgr->createNewSceneManager( false ); ISceneNode* rootnode2 = smgr2->getRootSceneNode( ); IAnimatedMeshSceneNode* node2 = smgr2->addAnimatedMeshSceneNode( smgr2->getMesh( "sydney.md2" ), rootnode2 ); node2->setMaterialFlag( EMF_LIGHTING, false ); node2->setMD2Animation( scene::EMAT_STAND ); node2->setMaterialTexture( 0, driver->getTexture("fireball.bmp") ); smgr2->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 10.0f, 5.0f, 0.0f ) ); // Interesting stuff IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); IPostProc* ppRenderer2 = new CRendererPostProc( smgr2, dimension2di( 1024, 512 ), true, true, SColor( 255u, 0u, 0u, 0u ) ); CTransitionPostProc* ppTransition = new CTransitionPostProc( ppRenderer1, ppRenderer2, dimension2di( 1024, 512 ), driver->getTexture("terrain-heightmap.bmp") ); // ppTransition->setQuality( PPQ_CRUDE ); // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { ppTransition->setBlend( sinf( device->getTimer( )->getTime( ) * 0.0005f - 2.0f ) * 2.0f + 0.5f ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppTransition->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppTransition; delete ppRenderer1; delete ppRenderer2; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Single Effect", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Interesting stuff // We make 2 objects - a scene renderer, and a blur. both render to textures with size 1024x512 (always use powers of 2) // When setting up the renderer, the parameters are: // SceneManager to render, size of output, clearBackBuffer?, clearZBuffer?, background colour IPostProc* ppRenderer = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); // When setting up the effect, the parameters are: // Input, size of output, effect ID (see CEffectPostProc.h for full list), effect parameters (in this case, blur size) CEffectPostProc* ppBlur = new CEffectPostProc( ppRenderer, dimension2di( 1024, 512 ), PP_BLUR, 0.01f ); // Change to a better quality - not all shaders will respect these, but they can be used to hint the rendering standard required. ppBlur->setQuality( PPQ_GOOD ); // Options (worst to best): PPQ_CRUDE, PPQ_FAST, PPQ_DEFAULT, PPQ_GOOD, PPQ_BEST // You can also call setOverallQuality( PPQ_WHATEVER ) to change the quality of all effects which are in the chain. // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { // What's happened to beginScene? well we want to use beginScene( false, false ) for speed, but this makes Irrlicht complain (wrongly) when using Direct3D9, so use ( false, true ) in that case. driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); // The rendering is as normal, except smgr->drawAll(); is replaced with this line: ppBlur->render( NULL ); // NULL = render to screen. Can also take a texture to render to, or no parameter (renders to an internal texture) guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppBlur; delete ppRenderer; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Splitscreen", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Set up the second scene, object & camera - this time, use a different texture and camera angle to show some change ISceneManager* smgr2 = smgr->createNewSceneManager( false ); ISceneNode* rootnode2 = smgr2->getRootSceneNode( ); IAnimatedMeshSceneNode* node2 = smgr2->addAnimatedMeshSceneNode( smgr2->getMesh( "sydney.md2" ), rootnode2 ); node2->setMaterialFlag( EMF_LIGHTING, false ); node2->setMD2Animation( scene::EMAT_STAND ); node2->setMaterialTexture( 0, driver->getTexture("fireball.bmp") ); smgr2->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 10.0f, 5.0f, 0.0f ) ); // Interesting stuff IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); IPostProc* ppRenderer2 = new CRendererPostProc( smgr2, dimension2di( 1024, 512 ), true, true, SColor( 255u, 0u, 0u, 0u ) ); // Splitscreen objects can be given up to 4 views. The rects at the end are optional - if not given, an arrangement will be created to fit the given number of views CSplitPostProc* ppSplit = new CSplitPostProc( ppRenderer1, ppRenderer2, dimension2di( 1024, 512 ), rect<f32>( -0.5f, -1.0f, 0.5f, 0.0f ), rect<f32>( -0.7f, 0.0f, 0.3f, 1.0f ) ); ppSplit->setVoidColor( SColor( 255u, 128u, 128u, 128u ) ); // Change the colour shown where there are no views. Call setVoidColor() to use no color (slightly faster, but should only be used if the views entirely cover the screen) // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppSplit->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppRenderer1; delete ppSplit; delete ppRenderer2; // Back to boring stuff device->drop(); return 0; }
int main() { IrrlichtDevice *device = createDevice( video::EDT_SOFTWARE, dimension2d<u32>(640, 480), 16, false, false, false, 0); if (!device) return 1; device->setWindowCaption(L"Have a go here: Chapter 3"); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IAnimatedMesh* mesh = smgr->getMesh("/home/fuyajun/Documents/irrlicht-1.7.2/media/sydney.md2"); if (!mesh) { device->drop(); return 1; } IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); MyAnimationEndCallback animEndCallback; //连续动画 if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("/home/fuyajun/Documents/irrlicht-1.7.2/media/sydney.bmp") ); node->setLoopMode(false); node->setAnimationEndCallback(&animEndCallback); } smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); while(device->run()) { driver->beginScene(true, true, SColor(255,100,101,140)); smgr->drawAll(); driver->endScene(); } device->drop(); return 0; }
int example_helloworld() { // create device IrrlichtDevice *device = startup(); if (device == 0) return 1; // could not create selected driver. IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); if (!mesh) { device->drop(); return 1; } IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); /* To let the mesh look a little bit nicer, we change its material. We disable lighting because we do not have a dynamic light in here, and the mesh would be totally black otherwise. Then we set the frame loop, such that the predefined STAND animation is used. And last, we apply a texture to the mesh. Without it the mesh would be drawn using only a color. */ if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") ); } /* To look at the mesh, we place a camera into 3d space at the position (0, 30, -40). The camera looks from there to (0,5,0), which is approximately the place where our md2 model is. */ smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); EventReceiver_basic receiver(device); device->setEventReceiver(&receiver); return run ( device ); }
int main() { eventReceiver receiver; IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(1366, 768), 16,true, false, false,&receiver); device->setWindowCaption(L"(WhizGeek || Mclightning).com"); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); scene::ICameraSceneNode* kam= smgr->addCameraSceneNode(NULL,vector3df(0,0,200),vector3df(0,0,0)); //kam->setPosition(vector3df(0,0,200)); ISceneNode* kutu=smgr->addCubeSceneNode(50,0,2,vector3df(50,0,0)); ISceneNode* kutu2=smgr->addCubeSceneNode(50,0,2,vector3df(-50,0,0)); ITexture *duvar=driver->getTexture("wall.jpg"); kutu->setMaterialTexture(0,duvar); kutu->setMaterialFlag(video::EMF_LIGHTING, false); kutu2->setMaterialTexture(0,duvar); kutu2->setMaterialFlag(video::EMF_LIGHTING, false); IAnimatedMesh* mesh = smgr->getMesh("sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); node->setRotation(vector3df(0,270,0)); irFinder ir("test",true,230,255); CvPoint in; while(device->run()) { if(receiver.IsKeyDown(KEY_ESCAPE)) { device->drop(); return 0; } driver->beginScene(true, true, SColor(255,0,0,255)); in=ir.yenile(); //node->setPosition(vector3df(30*in.x/320,30*(240-in.y)/240,0)); kam->setPosition(vector3df(in.x-160,(240-in.y),200)); smgr->drawAll(); driver->endScene(); } device->drop(); }
/** At the moment, this just verifies that the last frame of the animation produces the expected bitmap. */ bool md2Animation(void) { // Use EDT_BURNINGSVIDEO since it is not dependent on (e.g.) OpenGL driver versions. IrrlichtDevice *device = createDevice( EDT_BURNINGSVIDEO, dimension2d<u32>(160, 120), 32); assert(device); if (!device) return false; IVideoDriver* driver = device->getVideoDriver(); ISceneManager * smgr = device->getSceneManager(); IAnimatedMesh* mesh = smgr->getMesh("../media/sydney.md2"); IAnimatedMeshSceneNode* node; assert(mesh); if(mesh) { node = smgr->addAnimatedMeshSceneNode(mesh); assert(node); if(node) { node->setPosition(vector3df(20, 0, 30)); node->setMaterialFlag(EMF_LIGHTING, false); node->setMaterialTexture(0, driver->getTexture("../media/sydney.bmp")); node->setLoopMode(false); (void)smgr->addCameraSceneNode(); // Just jump to the last frame since that's all we're interested in. node->setMD2Animation(EMAT_DEATH_FALLBACK); node->setCurrentFrame((f32)(node->getEndFrame())); device->run(); driver->beginScene(true, true, SColor(255, 255, 255, 0)); smgr->drawAll(); driver->endScene(); } } bool result = takeScreenshotAndCompareAgainstReference(driver, "-md2Animation.png"); device->drop(); return result; }
int main() { IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480), 16, false, false, false, 0); if (!device) cout<<"error"; else { device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", rect<s32>(10,10,260,22), true); IAnimatedMesh* mesh = smgr->getMesh("sydney.md2"); if (!mesh) { device->drop(); return 1; } IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); } smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); while(device->run()) { driver->beginScene(true, true, SColor(255,100,101,140)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); } device->drop(); } cout<<"hello world2"; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Combined Effects", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "sydney.md2" ) ); node->setMaterialFlag( EMF_LIGHTING, false ); node->setMD2Animation( scene::EMAT_STAND ); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); smgr->addCameraSceneNode( 0, vector3df( 40.0f, 30.0f, -40.0f ), vector3df( 0.0f, 5.0f, 0.0f ) ); // Interesting stuff (see previous example for full details) IPostProc* ppRenderer = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); CEffectPostProc* ppInvert = new CEffectPostProc( ppRenderer, dimension2di( 1024, 512 ), PP_INVERT ); // The second effect is made exactly the same way, but takes ppInvert as the input instead of ppRenderer CEffectPostProc* ppBlur = new CEffectPostProc( ppInvert, dimension2di( 1024, 512 ), PP_BLUR, 0.01f ); // delete ppInvert; // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppBlur->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } // The effects can be deleted in any order delete ppBlur; delete ppInvert; delete ppRenderer; // Back to boring stuff device->drop(); return 0; }
GameFieldNeo::GameFieldNeo() : BaseGameEntity(BaseGameEntity::GetNextValidID(), vector3df(0.f, 0.f, 0.f), 0.f, vector3df(1.f, 1.f, 1.f)) { // get ready scene node ISceneManager* pSmgr = IrrDvc.GetSmgr(); m_pMesh = pSmgr->getMesh("Rsrc/Cube.dae"); if (m_pMesh) { m_pSceneNode = pSmgr->addAnimatedMeshSceneNode(m_pMesh); m_pSceneNode->setScale(vector3df(10.f, 10.f, 10.f)); m_pSceneNode->setMaterialFlag(video::EMF_LIGHTING, false); } scene::ISceneNodeAnimator* pAnim = pSmgr->createRotationAnimator(core::vector3df(1,1,1)); if (pAnim) { m_pSceneNode->addAnimator(pAnim); pAnim->drop(); } }
ISceneNode* spawnVehicle( const pdp::VehicleDesign *design, const vector3df &pos ) { ISceneManager* smgr = irrlicht->getSceneManager(); ISceneNode *container_node = smgr->addSceneNode( "empty" ); std::list<IAnimatedMesh*>::const_iterator it = design->chassis()->meshes().begin(); std::list<IAnimatedMesh*>::const_iterator itEnd = design->chassis()->meshes().end(); for ( ; it != itEnd; ++it) { IAnimatedMesh* mesh = *it; IAnimatedMeshSceneNode* mesh_node = smgr->addAnimatedMeshSceneNode( mesh, container_node ); if (mesh_node) { mesh_node->setMaterialFlag( EMF_LIGHTING, false ); mesh_node->setAnimationSpeed( 20.0f ); mesh_node->setMaterialTexture( 0, design->chassis()->texture() ); playerChassis = mesh_node; } } std::list<pdp::Component*>::const_iterator tit = design->components().begin(); for (int i=0; i < design->chassis()->attachments().size(); ++i) { pdp::Attachment a = design->chassis()->attachments()[i]; it = (*tit)->meshes().begin(); itEnd = (*tit)->meshes().end(); for (; it != itEnd; ++it) { IAnimatedMesh *mesh = *it; IMeshSceneNode *turr_node = smgr->addMeshSceneNode( mesh, container_node ); if (turr_node) { turr_node->setMaterialFlag( EMF_LIGHTING, false ); turr_node->setMaterialTexture( 0, (*tit)->texture() ); turr_node->setPosition(a.offset()); if (a.type() == "Turret") { playerTurret = turr_node; } } } ++tit; } return container_node; }
F14::F14(vector3df position, vector3df rotation, IrrlichtDevice *device) { this->device = device; ISceneManager *smgr = device->getSceneManager(); video::IVideoDriver *driver = device->getVideoDriver(); //Set the airplane attributes weight = 100; armor = 100; health = 100; bulletDamage = 8; speed = 10; //Create the Airplane's scene node mesh = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../media/meshes/f14.x"),0, 1, position, rotation); //Turn off dynamic lighting mesh->setMaterialFlag(video::EMF_LIGHTING, false); //Set the plane's texture mesh->setMaterialTexture(0, driver->getTexture("../media/textures/f14texture.jpg")); }
/* This is the main method. We can now use main() on every platform. */ int main() { /* The most important function of the engine is the createDevice() function. The IrrlichtDevice is created by it, which is the root object for doing anything with the engine. createDevice() has 7 parameters: - deviceType: Type of the device. This can currently be the Null-device, one of the two software renderers, D3D9, or OpenGL. In this example we use EDT_SOFTWARE, but to try out, you might want to change it to EDT_BURNINGSVIDEO, EDT_NULL, EDT_DIRECT3D9, or EDT_OPENGL. - windowSize: Size of the Window or screen in FullScreenMode to be created. In this example we use 640x480. - bits: Amount of color bits per pixel. This should be 16 or 32. The parameter is often ignored when running in windowed mode. - fullscreen: Specifies if we want the device to run in fullscreen mode or not. - stencilbuffer: Specifies if we want to use the stencil buffer (for drawing shadows). - vsync: Specifies if we want to have vsync enabled, this is only useful in fullscreen mode. - eventReceiver: An object to receive events. We do not want to use this parameter here, and set it to 0. Always check the return value to cope with unsupported drivers, dimensions, etc. */ IrrlichtDevice *device = createDevice( video::EDT_OGLES1, dimension2d<u32>(640, 480), 16, false, false, false, 0); if (!device) return 1; /* Set the caption of the window to some nice text. Note that there is an 'L' in front of the string. The Irrlicht Engine uses wide character strings when displaying text. */ device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); /* Get a pointer to the VideoDriver, the SceneManager and the graphical user interface environment, so that we do not always have to write device->getVideoDriver(), device->getSceneManager(), or device->getGUIEnvironment(). */ IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); /* We add a hello world label to the window, using the GUI environment. The text is placed at the position (10,10) as top left corner and (260,22) as lower right corner. */ guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", rect<s32>(10,10,260,22), true); /* Get a media path dedicated for your platform. */ const io::path mediaPath = getExampleMediaPath(); /* To show something interesting, we load a Quake 2 model and display it. We only have to get the Mesh from the Scene Manager with getMesh() and add a SceneNode to display the mesh with addAnimatedMeshSceneNode(). We check the return value of getMesh() to become aware of loading problems and other errors. Instead of writing the filename sydney.md2, it would also be possible to load a Maya object file (.obj), a complete Quake3 map (.bsp) or any other supported file format. By the way, that cool Quake 2 model called sydney was modelled by Brian Collins. */ IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2"); if (!mesh) { device->drop(); return 1; } IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); /* To let the mesh look a little bit nicer, we change its material. We disable lighting because we do not have a dynamic light in here, and the mesh would be totally black otherwise. Then we set the frame loop, such that the predefined STAND animation is used. And last, we apply a texture to the mesh. Without it the mesh would be drawn using only a color. */ if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture(mediaPath + "sydney.bmp") ); } /* To look at the mesh, we place a camera into 3d space at the position (0, 30, -40). The camera looks from there to (0,5,0), which is approximately the place where our md2 model is. */ smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); /* Ok, now we have set up the scene, lets draw everything: We run the device in a while() loop, until the device does not want to run any more. This would be when the user closes the window or presses ALT+F4 (or whatever keycode closes a window). */ while(device->run()) { /* Anything can be drawn between a beginScene() and an endScene() call. The beginScene() call clears the screen with a color and the depth buffer, if desired. Then we let the Scene Manager and the GUI Environment draw their content. With the endScene() call everything is presented on the screen. */ driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255,100,101,140)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); } /* After we are done with the render loop, we have to delete the Irrlicht Device created before with createDevice(). In the Irrlicht Engine, you have to delete all objects you created with a method or function which starts with 'create'. The object is simply deleted by calling ->drop(). See the documentation at irr::IReferenceCounted::drop() for more information. */ device->drop(); return 0; }
// Tests B3D animations. bool b3dAnimation(void) { // Use EDT_BURNINGSVIDEO since it is not dependent on (e.g.) OpenGL driver versions. IrrlichtDevice *device = createDevice( EDT_BURNINGSVIDEO, dimension2d<u32>(160, 120), 32); assert(device); if (!device) return false; IVideoDriver* driver = device->getVideoDriver(); ISceneManager * smgr = device->getSceneManager(); ISkinnedMesh* mesh = (ISkinnedMesh*)smgr->getMesh("../media/ninja.b3d"); assert(mesh); bool result = false; if (!mesh) return false; IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(mesh); assert(node1); /** Verify that two skinned animated mesh scene nodes can use different frames of the skinned mesh */ if(node1) { node1->setPosition(vector3df(-3, -3, 10)); node1->setMaterialFlag(EMF_LIGHTING, false); node1->setAnimationSpeed(0.f); node1->setCurrentFrame(10.f); node1->setDebugDataVisible(irr::scene::EDS_BBOX_BUFFERS); } IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode(mesh); assert(node2); if(node2) { node2->setPosition(vector3df(3, -3, 10)); node2->setMaterialFlag(EMF_LIGHTING, false); node2->setAnimationSpeed(0.f); node2->setCurrentFrame(62.f); node2->setDebugDataVisible(irr::scene::EDS_BBOX_BUFFERS); } (void)smgr->addCameraSceneNode(); // Just jump to the last frame since that's all we're interested in. device->run(); driver->beginScene(true, true, SColor(255, 60, 60, 60)); smgr->drawAll(); driver->endScene(); result = takeScreenshotAndCompareAgainstReference(driver, "-b3dAnimation.png"); if (node2) node2->remove(); /** Now test if bones are correctly positioned. */ node1->setDebugDataVisible(scene::EDS_SKELETON); node1->setPosition(vector3df(1, -5, 8)); node1->setRotation(core::vector3df(0,180,0)); node1->updateAbsolutePosition(); for (u32 i=0; i<node1->getJointCount(); ++i) { smgr->addCubeSceneNode(1.f,0,-1,node1->getJointNode(i)->getAbsolutePosition()); // smgr->addCubeSceneNode(1.f,node1->getJointNode(i)); } // Simple render call device->run(); driver->beginScene(true, true, SColor(255, 60, 60, 60)); smgr->drawAll(); driver->endScene(); result &= takeScreenshotAndCompareAgainstReference(driver, "-b3dJointPosition.png"); device->closeDevice(); device->run(); device->drop(); return result; }
/* This is the main method. We can use void main() on every platform. On Windows platforms, we could also use the WinMain method if we would want to get rid of the console window, which pops up when starting a program with main(), but to keep this example simple, we use main(). */ int main(int argc, char** argv) { /* The most important function of the engine is the 'createDevice' function. The Irrlicht Device can be created with it, which is the root object for doing everything with the engine. createDevice() has 7 paramters: deviceType: Type of the device. This can currently be the Null-device, the Software device, DirectX8, DirectX9, or OpenGL. In this example we use EDT_SOFTWARE, but to try out, you might want to change it to EDT_NULL, EDT_DIRECTX8 , EDT_DIRECTX9, or EDT_OPENGL. windowSize: Size of the Window or FullscreenMode to be created. In this example we use 640x480. bits: Amount of bits per pixel when in fullscreen mode. This should be 16 or 32. This parameter is ignored when running in windowed mode. fullscreen: Specifies if we want the device to run in fullscreen mode or not. stencilbuffer: Specifies if we want to use the stencil buffer for drawing shadows. vsync: Specifies if we want to have vsync enabled, this is only useful in fullscreen mode. eventReceiver: An object to receive events. We do not want to use this parameter here, and set it to 0. */ IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2d<s32>(640, 480), 16, false, false, false, 0); /* Set the caption of the window to some nice text. Note that there is a 'L' in front of the string. The Irrlicht Engine uses wide character strings when displaying text. */ device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo"); /* Get a pointer to the video driver, the SceneManager and the graphical user interface environment, so that we do not always have to write device->getVideoDriver(), device->getSceneManager() and device->getGUIEnvironment(). */ IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); /* We add a hello world label to the window, using the GUI environment. */ guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", rect<int>(10,10,200,22), true); /* To display something interesting, we load a Quake 2 model and display it. We only have to get the Mesh from the Scene Manager (getMesh()) and add a SceneNode to display the mesh. (addAnimatedMeshSceneNode()). Instead of writing the filename sydney.md2, it would also be possible to load a Maya object file (.obj), a complete Quake3 map (.bsp) or a Milshape file (.ms3d). By the way, that cool Quake 2 model called sydney was modelled by Brian Collins. */ IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); /* To let the mesh look a little bit nicer, we change its material a little bit: We disable lighting because we do not have a dynamic light in here, and the mesh would be totally black. Then we set the frame loop, so that the animation is looped between the frames 0 and 310. And at last, we apply a texture to the mesh. Without it the mesh would be drawn using only a color. */ if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setFrameLoop(0, 310); node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") ); } /* To look at the mesh, we place a camera into 3d space at the position (0, 30, -40). The camera looks from there to (0,5,0). */ smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0)); /* Ok, now we have set up the scene, lets draw everything: We run the device in a while() loop, until the device does not want to run any more. This would be when the user closed the window or pressed ALT+F4 in windows. */ while(device->run()) { /* Anything can be drawn between a beginScene() and an endScene() call. The beginScene clears the screen with a color and also the depth buffer if wanted. Then we let the Scene Manager and the GUI Environment draw their content. With the endScene() call everything is presented on the screen. */ driver->beginScene(true, true, SColor(0,200,200,200)); smgr->drawAll(); guienv->drawAll(); driver->endScene(); } /* After we are finished, we have to delete the Irrlicht Device created before with createDevice(). In the Irrlicht Engine, you will have to delete all objects you created with a method or function which starts with 'create'. The object is simply deleted by calling ->drop(). See the documentation at http://irrlicht.sourceforge.net//docu/classirr_1_1IUnknown.html#a3 for more information. */ device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual // To make things more interesting, we add many Sydneys and a textured floor this time IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Heat Haze (with Depth dependence)", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMesh* mesh = smgr->getMesh("sydney.md2"); ISceneManager* smgr2 = smgr->createNewSceneManager( false ); ISceneNode* rootnode2 = smgr2->getRootSceneNode( ); IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices( ); u32 matid, matid2; switch( driver->getDriverType( ) ) { case EDT_OPENGL: matid = gpu->addHighLevelShaderMaterial( GL_V_MAT, "main", EVST_VS_1_1, GL_PLAIN, "main", EPST_PS_1_1, new CTexturesShaderCallback( ), EMT_SOLID, 1 ); matid2 = gpu->addHighLevelShaderMaterial( GL_V_MAT, "main", EVST_VS_1_1, GL_HEATSOURCE, "main", EPST_PS_1_1, new CTexturesShaderCallback( ), EMT_TRANSPARENT_ALPHA_CHANNEL, 1 ); break; case EDT_DIRECT3D8: case EDT_DIRECT3D9: default: matid = gpu->addHighLevelShaderMaterial( DX_V_MAT, "main", EVST_VS_1_1, DX_PLAIN, "main", EPST_PS_2_0, new CTexturesShaderCallback( ), EMT_SOLID, 0 ); matid2 = gpu->addHighLevelShaderMaterial( DX_V_MAT, "main", EVST_VS_1_1, DX_HEATSOURCE, "main", EPST_PS_2_0, new CTexturesShaderCallback( ), EMT_TRANSPARENT_ALPHA_CHANNEL, 0 ); } for( u8 x = 0u; x != 2u; ++ x ) for( u8 i = 0u; i != 5u; ++ i ) { IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); node->setMaterialType( (E_MATERIAL_TYPE) matid ); node->setPosition( vector3df( -x * 20.0f, 0.0f, i * 40.0f ) ); ISceneNode* node2 = smgr2->addBillboardSceneNode( rootnode2, dimension2df( 30.0f, 80.0f ), vector3df( -x * 20.0f, 30.0f, i * 40.0f ) ); node2->setMaterialFlag(EMF_LIGHTING, false); node2->setMaterialType( EMT_TRANSPARENT_ADD_COLOR ); node2->setMaterialTexture( 0, driver->getTexture("fireball.bmp") ); node2->setMaterialType( (E_MATERIAL_TYPE) matid2 ); } ISceneNode* nodeF = smgr->addMeshSceneNode( smgr->addHillPlaneMesh( "", dimension2df( 200.0f, 200.0f ), dimension2d<u32>( 10, 10 ), NULL, 0.0f, dimension2df( 0.0f, 0.0f ), dimension2df( 100.0f, 100.0f ) ) ); nodeF->setMaterialFlag(EMF_LIGHTING, false); nodeF->setMaterialTexture( 0, driver->getTexture("terrain-heightmap.bmp") ); nodeF->setPosition( vector3df( 0.0f, -22.0f, 0.0f ) ); nodeF->setMaterialType( (E_MATERIAL_TYPE) matid ); ICameraSceneNode* cam1 = smgr->addCameraSceneNode( 0, vector3df( 40.0f, 60.0f, -40.0f ), vector3df( 0.0f, 5.0f, 50.0f ) ); ICameraSceneNode* cam2 = smgr2->addCameraSceneNode( rootnode2, vector3df( 40.0f, 60.0f, -40.0f ), vector3df( 0.0f, 5.0f, 50.0f ) ); IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); IPostProc* ppRenderer2 = new CRendererPostProc( smgr2, dimension2di( 1024, 512 ), true, true, SColor( 255u, 0u, 0u, 0u ) ); CEffectPostProc* ppHaze = new CEffectPostProc( ppRenderer1, dimension2di( 1024, 512 ), PP_HAZEDEPTH ); ppHaze->setInput( 1, ppRenderer2 ); ppHaze->setTimer( device->getTimer( ) ); // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { cam1->setPosition( vector3df( 40.0f, 60.0f - (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.1f, -40.0f ) ); cam1->setTarget( vector3df( -(device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.2f, 50.0f ) ); cam2->setPosition( cam1->getPosition( ) ); cam2->setTarget( cam1->getTarget( ) ); cam2->setUpVector( cam1->getUpVector( ) ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppHaze->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppHaze; delete ppRenderer1; delete ppRenderer2; // Back to boring stuff device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual // To make things more interesting, we add many Sydneys and a textured floor this time IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Depth of Field", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMesh* mesh = smgr->getMesh("sydney.md2"); // Create the required material. This is a simple shader which draws the texture with no lights. // Use GL_PLAIN1 / DX_PLANE1 or GL_PLAIN2 / DX_PLANE2 to support 1 or 2 basic point-lights u32 matid; IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices( ); switch( driver->getDriverType( ) ) { case EDT_OPENGL: matid = gpu->addHighLevelShaderMaterial( GL_V_MAT, "main", EVST_VS_1_1, GL_PLAIN, "main", EPST_PS_1_1, new CTexturesShaderCallback( ), EMT_SOLID, 1 ); break; case EDT_DIRECT3D8: case EDT_DIRECT3D9: default: matid = gpu->addHighLevelShaderMaterial( DX_V_MAT, "main", EVST_VS_1_1, DX_PLAIN, "main", EPST_PS_2_0, new CTexturesShaderCallback( ), EMT_SOLID, 0 ); } for( u8 x = 0u; x != 2u; ++ x ) for( u8 i = 0u; i != 5u; ++ i ) { IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); node->setMaterialType( (E_MATERIAL_TYPE) matid ); node->setPosition( vector3df( -x * 20.0f, 0.0f, i * 40.0f ) ); } ISceneNode* node2 = smgr->addMeshSceneNode( smgr->addHillPlaneMesh( "", dimension2df( 200.0f, 200.0f ), dimension2d<u32>( 10, 10 ), NULL, 0.0f, dimension2df( 0.0f, 0.0f ), dimension2df( 100.0f, 100.0f ) ) ); node2->setMaterialFlag(EMF_LIGHTING, false); node2->setMaterialTexture( 0, driver->getTexture("terrain-heightmap.bmp") ); node2->setMaterialType( (E_MATERIAL_TYPE) matid ); node2->setPosition( vector3df( 0.0f, -22.0f, 0.0f ) ); ICameraSceneNode* cam = smgr->addCameraSceneNode( 0, vector3df( 40.0f, 60.0f, -40.0f ), vector3df( 0.0f, 5.0f, 50.0f ) ); IPostProc* ppRenderer = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255u, 100u, 101u, 140u ) ); CEffectPostProc* ppBlurDOF = new CEffectPostProc( ppRenderer, dimension2di( 1024, 512 ), PP_BLURDOF ); // We could set parameters on creation, but no need since we will animate it anyway. // Parameters are: near blur, near focus, far focus, far blur, blur level // You can also use PP_BLURDOFNEAR or PP_BLURDOFFAR to have only near or far blurring // These variables aren't important - they are just for showing the FPS wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { // Change the camera angle cam->setTarget( vector3df( -(device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.2f, 0.0f ) ); // Animate the depth of field: f32 p = sinf( device->getTimer( )->getTime( ) * 0.0005f ) * 0.5f - 0.2f; ppBlurDOF->setParameters( p * 100.0f + 80.0f, p * 100.0f + 110.0f, p * 100.0f + 160.0f, p * 100.0f + 240.0f, 0.01f ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppBlurDOF->render( NULL ); guienv->drawAll( ); driver->endScene( ); // Show the current FPS if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppBlurDOF; delete ppRenderer; // Back to boring stuff device->drop(); return 0; }
/* Ok, now the main-function: First, we initialize the device, get the SourceManager and VideoDriver, load an animated mesh from .md2 and a map from .pk3. Because that's old stuff, I won't explain every step. Just take care of the maps position. */ int main() { // ask user for driver video::E_DRIVER_TYPE driverType=driverChoiceConsole(); if (driverType==video::EDT_COUNT) return 1; //Instance of the EventReceiver MyEventReceiver receiver; //Initialise the engine IrrlichtDevice *device = createDevice(driverType, dimension2du(ResX,ResY), 32, fullScreen, false, false, &receiver); if (!device) return 1; ISceneManager *smgr = device->getSceneManager(); IVideoDriver *driver = device->getVideoDriver(); //Load model IAnimatedMesh *model = smgr->getMesh("../../media/sydney.md2"); if (!model) return 1; IAnimatedMeshSceneNode *model_node = smgr->addAnimatedMeshSceneNode(model); //Load texture if (model_node) { ITexture *texture = driver->getTexture("../../media/sydney.bmp"); model_node->setMaterialTexture(0,texture); model_node->setMD2Animation(scene::EMAT_RUN); //Disable lighting (we've got no light) model_node->setMaterialFlag(EMF_LIGHTING,false); } //Load map device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3"); IAnimatedMesh *map = smgr->getMesh("20kdm2.bsp"); if (map) { ISceneNode *map_node = smgr->addOctreeSceneNode(map->getMesh(0)); //Set position map_node->setPosition(vector3df(-850,-220,-850)); } /* Now we create our four cameras. One is looking at the model from the front, one from the top and one from the side. In addition there's a FPS-camera which can be controlled by the user. */ // Create 3 fixed and one user-controlled cameras //Front camera[0] = smgr->addCameraSceneNode(0, vector3df(50,0,0), vector3df(0,0,0)); //Top camera[1] = smgr->addCameraSceneNode(0, vector3df(0,50,0), vector3df(0,0,0)); //Left camera[2] = smgr->addCameraSceneNode(0, vector3df(0,0,50), vector3df(0,0,0)); //User-controlled camera[3] = smgr->addCameraSceneNodeFPS(); // don't start at sydney's position if (camera[3]) camera[3]->setPosition(core::vector3df(-50,0,-50)); /* Create a variable for counting the fps and hide the mouse: */ //Hide mouse device->getCursorControl()->setVisible(false); //We want to count the fps int lastFPS = -1; /* There wasn't much new stuff - till now! Only by defining four cameras, the game won't be splitscreen. To do this you need several steps: - Set the viewport to the whole screen - Begin a new scene (Clear screen) - The following 3 steps are repeated for every viewport in the splitscreen - Set the viewport to the area you wish - Activate the camera which should be "linked" with the viewport - Render all objects - If you have a GUI: - Set the viewport the whole screen - Display the GUI - End scene Sounds a little complicated, but you'll see it isn't: */ while(device->run()) { //Set the viewpoint to the whole screen and begin scene driver->setViewPort(rect<s32>(0,0,ResX,ResY)); driver->beginScene(true,true,SColor(255,100,100,100)); //If SplitScreen is used if (SplitScreen) { //Activate camera1 smgr->setActiveCamera(camera[0]); //Set viewpoint to the first quarter (left top) driver->setViewPort(rect<s32>(0,0,ResX/2,ResY/2)); //Draw scene smgr->drawAll(); //Activate camera2 smgr->setActiveCamera(camera[1]); //Set viewpoint to the second quarter (right top) driver->setViewPort(rect<s32>(ResX/2,0,ResX,ResY/2)); //Draw scene smgr->drawAll(); //Activate camera3 smgr->setActiveCamera(camera[2]); //Set viewpoint to the third quarter (left bottom) driver->setViewPort(rect<s32>(0,ResY/2,ResX/2,ResY)); //Draw scene smgr->drawAll(); //Set viewport the last quarter (right bottom) driver->setViewPort(rect<s32>(ResX/2,ResY/2,ResX,ResY)); } //Activate camera4 smgr->setActiveCamera(camera[3]); //Draw scene smgr->drawAll(); driver->endScene(); /* As you can probably see, the image is rendered for every viewport seperately. That means, that you'll loose much performance. Ok, if you're aksing "How do I have to set the viewport to get this or that screen?", don't panic. It's really easy: In the rect-function you define 4 coordinates: - X-coordinate of the corner left top - Y-coordinate of the corner left top - X-coordinate of the corner right bottom - Y-coordinate of the corner right bottom That means, if you want to split the screen into 2 viewports you would give the following coordinates: - 1st viewport: 0,0,ResX/2,ResY - 2nd viewport: ResX/2,0,ResX,ResY If you didn't fully understand, just play arround with the example to check out what happens. Now we just view the current fps and shut down the engine, when the user wants to: */ //Get and show fps if (driver->getFPS() != lastFPS) { lastFPS = driver->getFPS(); core::stringw tmp = L"Irrlicht SplitScreen-Example (FPS: "; tmp += lastFPS; tmp += ")"; device->setWindowCaption(tmp.c_str()); } } //Delete device device->drop(); return 0; }
//When our engine is called up int main(int argc, char* argv[]) { //This is all that's needed to initialize the engine ... blahaha irrEngineManager *Manager = new irrEngineManager(); IrrlichtDevice *Device = Manager->getDevice(); ISceneManager *Smgr = Device->getSceneManager(); IVideoDriver *Video = Device->getVideoDriver(); irrBulletWorld *World = Manager->getBulletWorld(); ISoundEngine *Sound = Manager->getSoundEngine(); IGUIEnvironment *Gui = Device->getGUIEnvironment(); ICursorControl *cursor = Device->getCursorControl(); World->setGravity(vector3df(0,-100,0)); Manager->setWindowCaption(L"irrEngine"); Device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3"); //Scene Begin CStaticProp *prop = new CStaticProp(Device, World, Smgr->getMesh("20kdm2.bsp")->getMesh(0)); // CGUIButton *button = new CGUIButton(Device); // button->setRelativePosition(vector2df(720, 450)); // button->setPosition(vector2df(720, 450)); // button->setScale(vector2df(2,2)); // Manager->registerStaticProp(prop); CGUIImage *image = new CGUIImage(Device); // image->setImage(Video->getTexture("draakan.png")); // image->setRelativePosition(vector2df(720, 450)); // image->setRelativeScale(vector2df(1,1)); CRigidBox *box = new CRigidBox(Device, World); box->setScale(vector3df(5,5,5)); box->setPosition(vector3df(715,1200,500)); box->setMaterialFlag(EMF_LIGHTING, false); box->setMaterialTexture(0, Video->getTexture("textures/crate.jpg")); Manager->registerRigidBox(box); // CRenderTarget *rt = new CRenderTarget(Device, box->getNode()); // rt->getCamera()->setPosition(vector3df(0,500,0)); ICameraSceneNode *Camera = Smgr->addCameraSceneNodeFPS(0, 100.f, 0.0f, -1, 0, 0, true, 0.0, false, true); // ICameraSceneNode*Camera = Smgr->addCameraSceneNodeFPS(); Smgr->addAnimatedMeshSceneNode(Smgr->getMesh("dwarf.x")); CIrrKlangSceneNode *Nodes = new CIrrKlangSceneNode(Sound, Smgr->getRootSceneNode(), Smgr, 666); Nodes->setMinMaxSoundDistance(); Nodes->setSoundFileName("Menu.mp3"); CFPSController *controller = new CFPSController(Device, World, Smgr->getMesh("dwarf.x")); Manager->registerFPSController(controller); Manager->setActivePlayer(controller); // controller->setCameraOffset(vector3df(0,50,0)); controller->setNodeOffset(vector3df(0,-10,0)); // rt->setFollowMode(true, Camera); // rt->setTrailMode(true, Camera, true, true); // box->setMaterialTexture(0, rt->getTexture()); // Manager->registerRenderTarget(rt); // // CRagdoll *doll = new CRagdoll(Device, World, Smgr->getMesh("dwarf.x")); //Continue using Irrlicht as normal u32 TimeStamp = Device->getTimer()->getTime(); u32 DeltaTime = 0; while (Manager->run()) { //The Manager handles everything inside of this drawAll call DeltaTime = Device->getTimer()->getTime() - TimeStamp; TimeStamp = Device->getTimer()->getTime(); World->stepSimulation(DeltaTime*0.001f, 120); Manager->drawAll(); } //When the device is closed, delete the irrEngine manager to cause a "domino" effect of deletion :) delete Manager; if (Device) Device->drop(); }
int main() { IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(1024, 768), 32, false, false, true, 0); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); smgr->addCameraSceneNodeFPS(); const s32 randLength = 1024; srand(device->getTimer()->getRealTime()); //Creating the grid for unit measure, etc u32 tileNumber = 128; IAnimatedMesh* groundMesh = smgr->addHillPlaneMesh("", dimension2d<float>(8,8),dimension2d<u32>(tileNumber,tileNumber),0,0.0f,dimension2df(0,0),dimension2df(tileNumber,tileNumber)); IAnimatedMeshSceneNode * groundNode = smgr->addAnimatedMeshSceneNode(groundMesh); groundNode->setMaterialTexture(0,driver->getTexture("../media/grid2.png")); groundNode->setMaterialFlag(EMF_LIGHTING,false); groundNode->setPosition(vector3df(0,-2,0)); //obstacles for stuff EntityGroup obstacles; for(int i = 0; i < 20; i++) { ISceneNode* s = smgr->addSphereSceneNode(20); IrrlichtBaseEntity * e = new IrrlichtBaseEntity(s); s->setPosition(vector3df(rand()%randLength - (randLength/2),0,rand()%randLength - (randLength/2))); obstacles.push_back(e); } //Nodes for vehicles ISceneNode * cube = smgr->addCubeSceneNode(4); ISceneNode * cube2 = smgr->addCubeSceneNode(4); cube->setMaterialFlag(EMF_LIGHTING,false); cube->setMaterialTexture(0,driver->getTexture("../media/v1-solid.png")); cube2->setMaterialFlag(EMF_LIGHTING,false); cube2->setMaterialTexture(0,driver->getTexture("../media/v2-solid.png")); //Creating the actual vehicles IrrlichtMobileEntity * Entity1 = new IrrlichtMobileEntity(cube ,vector3df(0,0,0), 1, 90, 40); IrrlichtMobileEntity * Entity2 = new IrrlichtMobileEntity(cube2,vector3df(0,0,300), 1, 100, 50); //Creating the steering conrollers, constructor also sets steering on entity SimpleSteeringController* Entity1Steering = new SimpleSteeringController(Entity1); SimpleSteeringController * Entity2Steering = new SimpleSteeringController(Entity2); //Setting up other params for behaviors Entity1Steering->SetObstacles(obstacles); Entity1Steering->SetHideTarget(Entity2); Entity1Steering->SetBehaviorFlag(EBF_HIDE,true); Entity1Steering->SetBehaviorFlag(EBF_AVOID,true); Entity2Steering->SetObstacles(obstacles); Entity2Steering->SetPursuitTarget(Entity1); Entity2Steering->SetBehaviorFlag(EBF_PURSUIT,true); Entity2Steering->SetBehaviorFlag(EBF_AVOID,true); //vars for tracking time between frames. This allows framerate independent motion state updates. u32 then = device->getTimer()->getTime(); float timeUpdate = 0; while(device->run()) { const u32 now = device->getTimer()->getTime(); const float frameDeltaTime = (float)(now - then) / 1000.f; // Time in seconds then = now; timeUpdate += frameDeltaTime; if(timeUpdate > 1) { core::stringw str = L"desteer v0.0.1 FPS: "; str += (s32)driver->getFPS(); device->setWindowCaption(str.c_str()); timeUpdate = 0; } //Do behavior updates before the rendering. Entity1->Update(frameDeltaTime); Entity2->Update(frameDeltaTime); driver->beginScene(true, true, SColor(255,100,101,140)); smgr->drawAll(); driver->endScene(); } //Clean up irrlicht. device->drop(); return 0; }
int main( ) { // Boring stuff: set up the scene, object & camera as usual // To make things more interesting, we add many Sydneys and a textured floor this time IrrlichtDevice* device = createDevice( DRIVER, dimension2d<s32>( 640, 480 ), 16, false, false, false, 0 ); IVideoDriver* driver = device->getVideoDriver( ); ISceneManager* smgr = device->getSceneManager( ); IGUIEnvironment* guienv = device->getGUIEnvironment( ); device->getFileSystem( )->changeWorkingDirectoryTo( MEDIA_DIRECTORY ); guienv->addStaticText( L"Sandbox", rect<s32>( 10, 10, 260, 22 ), true ); IAnimatedMesh* mesh = smgr->getMesh("sydney.md2"); IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices( ); u32 matid; switch( driver->getDriverType( ) ) { case EDT_OPENGL: matid = gpu->addHighLevelShaderMaterial( GL_V_MAT, "main", EVST_VS_1_1, GL_PLAIN, "main", EPST_PS_1_1, new CTexturesShaderCallback( ), EMT_SOLID, 1 ); break; case EDT_DIRECT3D8: case EDT_DIRECT3D9: default: matid = gpu->addHighLevelShaderMaterial( DX_V_MAT, "main", EVST_VS_1_1, DX_PLAIN, "main", EPST_PS_2_0, new CTexturesShaderCallback( ), EMT_SOLID, 0 ); } for( u8 x = 0u; x != 2u; ++ x ) for( u8 i = 0u; i != 5u; ++ i ) { IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh ); node->setMaterialFlag(EMF_LIGHTING, false); node->setMD2Animation(scene::EMAT_STAND); node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") ); node->setMaterialType( (E_MATERIAL_TYPE) matid ); node->setPosition( vector3df( -x * 20.0f, 0.0f, i * 40.0f ) ); } ISceneNode* nodeF = smgr->addTerrainSceneNode( "terrain-heightmap.bmp" ); nodeF->setMaterialFlag(EMF_LIGHTING, false); nodeF->setMaterialTexture( 0, driver->getTexture("terrain-heightmap.bmp") ); nodeF->setPosition( vector3df( -512.0f, -50.0f, -512.0f ) ); nodeF->setScale( vector3df( 4.0f, 0.2f, 4.0f ) ); nodeF->setMaterialType( (E_MATERIAL_TYPE) matid ); ICameraSceneNode* cam1 = smgr->addCameraSceneNode( 0, vector3df( 0.0f, 0.0f, -40.0f ), vector3df( 0.0f, 5.0f, 50.0f ) ); IPostProc* ppRenderer1 = new CRendererPostProc( smgr, dimension2di( 1024, 512 ), true, true, SColor( 255, 130u, 180u, 230u ) ); CWaterPostProc* ppWater = new CWaterPostProc( ppRenderer1, dimension2di( 1024, 512 ), -22.0f ); ppWater->setTimer( device->getTimer( ) ); wchar_t tmp[255]; u8 t = 0u; while( device->run( ) ) { // cam1->setPosition( vector3df( 40.0f, 60.0f - (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.1f, -40.0f ) ); cam1->setPosition( vector3df( (device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.1f, -40.0f ) ); // cam1->setTarget( vector3df( (device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.1f, 0.0f ) ); // cam1->setTarget( cam1->getPosition( ) + vector3df( 0.0f, 0.0f, 10.0f ) ); // cam1->setTarget( vector3df( -(device->getCursorControl( )->getPosition( ).X - 320.0f) * 0.1f, (device->getCursorControl( )->getPosition( ).Y - 240.0f) * 0.2f, 50.0f ) ); driver->beginScene( false, driver->getDriverType( ) == video::EDT_DIRECT3D9 ); ppWater->render( NULL ); guienv->drawAll( ); driver->endScene( ); if( ++ t == 30u ) { t = 0u; swprintf(tmp, 255, L"%ls fps:%3d", driver->getName(), driver->getFPS() ); device->setWindowCaption( tmp ); } } delete ppWater; delete ppRenderer1; // Back to boring stuff device->drop(); return 0; }
// ---------------------------------------------------------------------------- Track::Track(path file) { m_valid = true; FILE* pFile; pFile = fopen(file.c_str(), "rb"); if (!pFile) { m_valid = false; stringw emsg = _("Editor failed to open file:\n \""); emsg += file; emsg += "\""; MsgWndw::get()->showMsg(emsg); return; } // SIGN u64 sign; fread(&sign, sizeof(u64), 1, pFile); if (sign != TOP_SECRET_SIGNATURE_NUMBER) { MsgWndw::get()->showMsg(_("File can not be opened: signature failed.")); m_valid = false; fclose(pFile); return; } // TRACK NAME u8 size; wchar_t* c; fread(&size, sizeof(u8), 1, pFile); if (!Editor::isValidSize(size)) { fclose(pFile); m_valid = false; MsgWndw::get()->showMsg(_("File loading failed!")); return; } c = new wchar_t[size]; fread(c, sizeof(wchar_t), size, pFile); m_track_name = c; delete[] c; // DESIGNER NAME fread(&size, sizeof(u8), 1, pFile); if (!Editor::isValidSize(size)) { fclose(pFile); m_valid = false; MsgWndw::get()->showMsg(_("File loading failed!")); return; } c = new wchar_t[size]; fread(c, sizeof(wchar_t), size, pFile); m_designer = c; delete[] c; // FILE NAME c8* cc; fread(&size, sizeof(u8), 1, pFile); if (!Editor::isValidSize(size)) { fclose(pFile); m_valid = false; MsgWndw::get()->showMsg(_("File loading failed!")); return; } cc = new c8[size]; fread(cc, sizeof(c8), size, pFile); m_file_name = cc; delete[] cc; // MUSIC fread(&size, sizeof(u8), 1, pFile); if (!Editor::isValidSize(size)) { fclose(pFile); m_valid = false; MsgWndw::get()->showMsg(_("File loading failed!")); return; } cc = new c8[size]; fread(cc, sizeof(c8), size, pFile); m_music = cc; delete[] cc; // TERRAIN ISceneManager* sm = Editor::getEditor()->getSceneManager(); m_terrain = new Terrain(sm->getRootSceneNode(), sm, 1, pFile); if (!m_terrain->isValid()) { fclose(pFile); MsgWndw::get()->showMsg(_("Loading failed :invalid terrain!")); m_valid = false; return; } // SKY Sky* s = Viewport::get()->getSky(); delete s; s = new Sky(pFile); Viewport::get()->setSky(s); // GRAVITY ROAD FLAG fread(&m_gravity_road, sizeof(bool), 1, pFile); // ROADS IRoad* r; fread(&size, sizeof(u8), 1, pFile); if (size < 0 || size > MAX_ROAD_NUM) { MsgWndw::get()->showMsg(_("Loading failed: invalid terrain!")); } else { if (size > 0) { m_driveline = new DriveLine(sm->getRootSceneNode(), sm, 0, pFile); if (!m_driveline->isValid()) { std::cerr << _("Warning: invalid driveline!\n"); ISpline* spline = new TCR(sm->getRootSceneNode(), sm, 0); m_driveline = new DriveLine(sm->getRootSceneNode(), sm, 0, spline, L"DriveLine"); } m_roads.push_back(m_driveline); m_driveline->refresh(); } // driveline for (u8 i = 1; i < size; i++) { r = new Road(sm->getRootSceneNode(), sm, 0, pFile); if (r->isValid()) { m_roads.push_back(r); r->refresh(); r->setWireFrame(false); Viewport::get()->setSplineMode(false); } else std::cerr << "Warning: invalid road - skipped :(\n"; } // roads } // valid roadnum // CHECKLINES Viewport::get()->loadCheckLines(pFile); // OBJECTS u32 num; fread(&num, sizeof(u32), 1, pFile); Viewport::setLastEntityID(num + MAGIC_NUMBER); for (u32 i = 0; i < num; i++) { ISceneNode* node = 0; vector3df pos, rot, sca; fread(&pos, sizeof(vector3df), 1, pFile); fread(&rot, sizeof(vector3df), 1, pFile); fread(&sca, sizeof(vector3df), 1, pFile); u8 size; fread(&size, sizeof(u8), 1, pFile); if (!Editor::isValidSize(size)) { m_valid = false; MsgWndw::get()->showMsg(_("Loading failed!")); fclose(pFile); return; } c8 *name = new c8[size]; fread(name, sizeof(c8), size, pFile); path p = name; if (p == path("banana") || p == path("item") || p == path("small-nitro") || p == path("big-nitro")) { node = loadItem(name); } // item else { node = sm->addAnimatedMeshSceneNode(sm->getMesh(p)); node->setName(name); } // object if (node) { node->setPosition(pos); node->setRotation(rot); node->setScale(sca); node->setID(MAGIC_NUMBER + i + 1); } // valid node else { std::cerr << "Warning: couldn't load object < " << name << " >!\n"; num -= 1; i -= 1; } // invalid node delete[] name; } fclose(pFile); } // Track - from file