12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #ifndef IRR_I_SCENE_MANAGER_H_INCLUDED
- #define IRR_I_SCENE_MANAGER_H_INCLUDED
- #include "IReferenceCounted.h"
- #include "irrArray.h"
- #include "path.h"
- #include "vector3d.h"
- #include "dimension2d.h"
- #include "SColor.h"
- #include "ETerrainElements.h"
- #include "ESceneNodeTypes.h"
- #include "ESceneNodeAnimatorTypes.h"
- #include "EMeshWriterEnums.h"
- #include "SceneParameters.h"
- #include "IGeometryCreator.h"
- #include "ISkinnedMesh.h"
- #include "IXMLWriter.h"
- namespace irr
- {
- struct SKeyMap;
- struct SEvent;
- namespace io
- {
- class IReadFile;
- class IAttributes;
- class IWriteFile;
- class IFileSystem;
- } // end namespace io
- namespace gui
- {
- class IGUIFont;
- class IGUIEnvironment;
- } // end namespace gui
- namespace video
- {
- class IVideoDriver;
- class SMaterial;
- class IImage;
- class ITexture;
- } // end namespace video
- namespace scene
- {
- //! Enumeration for render passes.
- /** A parameter passed to the registerNodeForRendering() method of the ISceneManager,
- specifying when the node wants to be drawn in relation to the other nodes.
- Note: Despite the numbering this is not used as bit-field.
- */
- enum E_SCENE_NODE_RENDER_PASS
- {
- //! No pass currently active
- ESNRP_NONE =0,
- //! Camera pass. The active view is set up here. The very first pass.
- ESNRP_CAMERA =1,
- //! In this pass, lights are transformed into camera space and added to the driver
- ESNRP_LIGHT =2,
- //! This is mostly used for sky boxes. Stage between light and solid.
- ESNRP_SKY_BOX =4,
- //! All normal objects can use this for registering themselves.
- /** This value will never be returned by
- ISceneManager::getSceneNodeRenderPass(). The scene manager
- will determine by itself if an object is transparent or solid
- and register the object as ESNRT_TRANSPARENT or ESNRP_SOLID
- automatically if you call registerNodeForRendering with this
- value (which is default). Note that it will register the node
- only as ONE type. If your scene node has both solid and
- transparent material types register it twice (one time as
- ESNRP_SOLID, the other time as ESNRT_TRANSPARENT) and in the
- render() method call getSceneNodeRenderPass() to find out the
- current render pass and render only the corresponding parts of
- the node. */
- ESNRP_AUTOMATIC =24,
- //! Solid scene nodes or special scene nodes without materials.
- ESNRP_SOLID =8,
- //! Transparent scene nodes, drawn after solid nodes. They are sorted from back to front and drawn in that order.
- ESNRP_TRANSPARENT =16,
- //! Transparent effect scene nodes, drawn after Transparent nodes. They are sorted from back to front and drawn in that order.
- ESNRP_TRANSPARENT_EFFECT =32,
- //! Drawn after the solid nodes, before the transparent nodes, the time for drawing shadow volumes
- ESNRP_SHADOW =64,
- //! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves).
- ESNRP_GUI = 128
- };
- //! Enumeration for sorting transparent nodes
- /** Sorting used for nodes with ESNRP_TRANSPARENT or ESNRP_AUTOMATIC+transparency.
- Also used for ESNRP_TRANSPARENT_EFFECT nodes (in an independent array)
- Transparent nodes are always drawn back to front based on distance to camera.
- This enum controls which points are used for the distance. */
- enum E_TRANSPARENT_NODE_SORTING
- {
- //! Don't sort, but draw in the order in which nodes registered themselves for rendering
- //! By default this is the order in which nodes are in the scenegraph
- //! Which can be used to do some custom sorting via scene-graph (mainly useful if you only have to that once)
- ETNS_NONE,
- //! Distance from node origin to camera position
- ETNS_ORIGIN,
- //! Distance from node center to camera position
- ETNS_CENTER,
- //! Distance from the nearest of the 2 transformed bounding-box extend corners to camera
- ETNS_BBOX_EXTENTS,
- //! Distance from node origin to camera plane
- ETNS_PLANE_ORIGIN,
- //! Distance from node center to camera plane
- //! With orthographic cameras there's a high chance you might prefer this one
- ETNS_PLANE_CENTER,
- //! Default sorting Irrlicht uses currently
- //! This may change in the future
- ETNS_DEFAULT = ETNS_CENTER
- };
- class IAnimatedMesh;
- class IAnimatedMeshSceneNode;
- class IBillboardSceneNode;
- class IBillboardTextSceneNode;
- class ICameraSceneNode;
- class IDummyTransformationSceneNode;
- class ILightManager;
- class ILightSceneNode;
- class IMesh;
- class IMeshBuffer;
- class IMeshCache;
- class IMeshLoader;
- class IMeshManipulator;
- class IMeshSceneNode;
- class IMeshWriter;
- class IMetaTriangleSelector;
- class IOctreeSceneNode;
- class IParticleSystemSceneNode;
- class ISceneCollisionManager;
- class ISceneLoader;
- class ISceneNode;
- class ISceneNodeAnimator;
- class ISceneNodeAnimatorCollisionResponse;
- class ISceneNodeAnimatorFactory;
- class ISceneNodeFactory;
- class ISceneUserDataSerializer;
- class IShadowVolumeSceneNode;
- class ITerrainSceneNode;
- class ITextSceneNode;
- class ITriangleSelector;
- class IVolumeLightSceneNode;
- namespace quake3
- {
- struct IShader;
- } // end namespace quake3
- //! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff.
- /** All Scene nodes can be created only here. There is a always growing
- list of scene nodes for lots of purposes: Indoor rendering scene nodes
- like the Octree (addOctreeSceneNode()) or the terrain renderer
- (addTerrainSceneNode()), different Camera scene nodes
- (addCameraSceneNode(), addCameraSceneNodeMaya()), scene nodes for Light
- (addLightSceneNode()), Billboards (addBillboardSceneNode()) and so on.
- A scene node is a node in the hierarchical scene graph. Every scene node
- may have children, which are other scene nodes. Children move relative
- the their parents position. If the parent of a node is not visible, its
- children won't be visible, too. In this way, it is for example easily
- possible to attach a light to a moving car or to place a walking
- character on a moving platform on a moving ship.
- The SceneManager is also able to load 3d mesh files of different
- formats. Take a look at getMesh() to find out what formats are
- supported. If these formats are not enough, use
- addExternalMeshLoader() to add new formats to the engine.
- */
- class ISceneManager : public virtual IReferenceCounted
- {
- public:
- //! Get pointer to an animatable mesh. Loads the file if not loaded already.
- /**
- * If you want to remove a loaded mesh from the cache again, use removeMesh().
- * Currently there are the following mesh formats supported:
- * <TABLE border="1" cellpadding="2" cellspacing="0">
- * <TR>
- * <TD>Format</TD>
- * <TD>Description</TD>
- * </TR>
- * <TR>
- * <TD>3D Studio (.3ds)</TD>
- * <TD>Loader for 3D-Studio files which lots of 3D packages
- * are able to export. Only static meshes are currently
- * supported by this importer.</TD>
- * </TR>
- * <TR>
- * <TD>3D World Studio (.smf)</TD>
- * <TD>Loader for Leadwerks SMF mesh files, a simple mesh format
- * containing static geometry for games. The proprietary .STF texture format
- * is not supported yet. This loader was originally written by Joseph Ellis. </TD>
- * </TR>
- * <TR>
- * <TD>Bliz Basic B3D (.b3d)</TD>
- * <TD>Loader for blitz basic files, developed by Mark
- * Sibly. This is the ideal animated mesh format for game
- * characters as it is both rigidly defined and widely
- * supported by modeling and animation software.
- * As this format supports skeletal animations, an
- * ISkinnedMesh will be returned by this importer.</TD>
- * </TR>
- * <TR>
- * <TD>Cartography shop 4 (.csm)</TD>
- * <TD>Cartography Shop is a modeling program for creating
- * architecture and calculating lighting. Irrlicht can
- * directly import .csm files thanks to the IrrCSM library
- * created by Saurav Mohapatra which is now integrated
- * directly in Irrlicht.
- * </TR>
- * <TR>
- * <TD>COLLADA (.dae, .xml)</TD>
- * <TD>COLLADA is an open Digital Asset Exchange Schema for
- * the interactive 3D industry. There are exporters and
- * importers for this format available for most of the
- * big 3d packagesat http://collada.org. Irrlicht can
- * import COLLADA files by using the
- * ISceneManager::getMesh() method. COLLADA files need
- * not contain only one single mesh but multiple meshes
- * and a whole scene setup with lights, cameras and mesh
- * instances, this loader can set up a scene as
- * described by the COLLADA file instead of loading and
- * returning one single mesh. By default, this loader
- * behaves like the other loaders and does not create
- * instances, but it can be switched into this mode by
- * using
- * SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, true);
- * Created scene nodes will be named as the names of the
- * nodes in the COLLADA file. The returned mesh is just
- * a dummy object in this mode. Meshes included in the
- * scene will be added into the scene manager with the
- * following naming scheme:
- * "path/to/file/file.dea#meshname". The loading of such
- * meshes is logged. Currently, this loader is able to
- * create meshes (made of only polygons), lights, and
- * cameras. Materials and animations are currently not
- * supported but this will change with future releases.
- * </TD>
- * </TR>
- * <TR>
- * <TD>Delgine DeleD (.dmf)</TD>
- * <TD>DeleD (delgine.com) is a 3D editor and level-editor
- * combined into one and is specifically designed for 3D
- * game-development. With this loader, it is possible to
- * directly load all geometry is as well as textures and
- * lightmaps from .dmf files. To set texture and
- * material paths, see scene::DMF_USE_MATERIALS_DIRS.
- * It is also possible to flip the alpha texture by setting
- * scene::DMF_FLIP_ALPHA_TEXTURES to true and to set the
- * material transparent reference value by setting
- * scene::DMF_ALPHA_CHANNEL_REF to a float between 0 and
- * 1. The loader is based on Salvatore Russo's .dmf
- * loader, I just changed some parts of it. Thanks to
- * Salvatore for his work and for allowing me to use his
- * code in Irrlicht and put it under Irrlicht's license.
- * For newer and more enhanced versions of the loader,
- * take a look at delgine.com.
- * </TD>
- * </TR>
- * <TR>
- * <TD>DirectX (.x)</TD>
- * <TD>Platform independent importer (so not D3D-only) for
- * .x files. Most 3D packages can export these natively
- * and there are several tools for them available, e.g.
- * the Maya exporter included in the DX SDK.
- * .x files can include skeletal animations and Irrlicht
- * is able to play and display them, users can manipulate
- * the joints via the ISkinnedMesh interface. Currently,
- * Irrlicht only supports uncompressed .x files.</TD>
- * </TR>
- * <TR>
- * <TD>Half-Life model (.mdl)</TD>
- * <TD>This loader opens Half-life 1 models, it was contributed
- * by Fabio Concas and adapted by Thomas Alten.</TD>
- * </TR>
- * <TR>
- * <TD>Irrlicht Mesh (.irrMesh)</TD>
- * <TD>This is a static mesh format written in XML, native
- * to Irrlicht and written by the irr mesh writer.
- * This format is exported by the CopperCube engine's
- * lightmapper.</TD>
- * </TR>
- * <TR>
- * <TD>LightWave (.lwo)</TD>
- * <TD>Native to NewTek's LightWave 3D, the LWO format is well
- * known and supported by many exporters. This loader will
- * import LWO2 models including lightmaps, bumpmaps and
- * reflection textures.</TD>
- * </TR>
- * <TR>
- * <TD>Maya (.obj)</TD>
- * <TD>Most 3D software can create .obj files which contain
- * static geometry without material data. The material
- * files .mtl are also supported. This importer for
- * Irrlicht can load them directly. </TD>
- * </TR>
- * <TR>
- * <TD>Milkshape (.ms3d)</TD>
- * <TD>.MS3D files contain models and sometimes skeletal
- * animations from the Milkshape 3D modeling and animation
- * software. Like the other skeletal mesh loaders, joints
- * are exposed via the ISkinnedMesh animated mesh type.</TD>
- * </TR>
- * <TR>
- * <TD>My3D (.my3d)</TD>
- * <TD>.my3D is a flexible 3D file format. The My3DTools
- * contains plug-ins to export .my3D files from several
- * 3D packages. With this built-in importer, Irrlicht
- * can read and display those files directly. This
- * loader was written by Zhuck Dimitry who also created
- * the whole My3DTools package.
- * </TD>
- * </TR>
- * <TR>
- * <TD>OCT (.oct)</TD>
- * <TD>The oct file format contains 3D geometry and
- * lightmaps and can be loaded directly by Irrlicht. OCT
- * files<br> can be created by FSRad, Paul Nette's
- * radiosity processor or exported from Blender using
- * OCTTools which can be found in the exporters/OCTTools
- * directory of the SDK. Thanks to Murphy McCauley for
- * creating all this.</TD>
- * </TR>
- * <TR>
- * <TD>OGRE Meshes (.mesh)</TD>
- * <TD>Ogre .mesh files contain 3D data for the OGRE 3D
- * engine. Irrlicht can read and display them directly
- * with this importer. To define materials for the mesh,
- * copy a .material file named like the corresponding
- * .mesh file where the .mesh file is. (For example
- * ogrehead.material for ogrehead.mesh). Thanks to
- * Christian Stehno who wrote and contributed this
- * loader.</TD>
- * </TR>
- * <TR>
- * <TD>Pulsar LMTools (.lmts)</TD>
- * <TD>LMTools is a set of tools (Windows & Linux) for
- * creating lightmaps. Irrlicht can directly read .lmts
- * files thanks to<br> the importer created by Jonas
- * Petersen.
- * Notes for<br> this version of the loader:<br>
- * - It does not recognize/support user data in the
- * *.lmts files.<br>
- * - The TGAs generated by LMTools don't work in
- * Irrlicht for some reason (the textures are upside
- * down). Opening and resaving them in a graphics app
- * will solve the problem.</TD>
- * </TR>
- * <TR>
- * <TD>Quake 3 levels (.bsp)</TD>
- * <TD>Quake 3 is a popular game by IDSoftware, and .pk3
- * files contain .bsp files and textures/lightmaps
- * describing huge prelighted levels. Irrlicht can read
- * .pk3 and .bsp files directly and thus render Quake 3
- * levels directly. Written by Nikolaus Gebhardt
- * enhanced by Dean P. Macri with the curved surfaces
- * feature. </TD>
- * </TR>
- * <TR>
- * <TD>Quake 2 models (.md2)</TD>
- * <TD>Quake 2 models are characters with morph target
- * animation. Irrlicht can read, display and animate
- * them directly with this importer. </TD>
- * </TR>
- * <TR>
- * <TD>Quake 3 models (.md3)</TD>
- * <TD>Quake 3 models are characters with morph target
- * animation, they contain mount points for weapons and body
- * parts and are typically made of several sections which are
- * manually joined together.</TD>
- * </TR>
- * <TR>
- * <TD>Stanford Triangle (.ply)</TD>
- * <TD>Invented by Stanford University and known as the native
- * format of the infamous "Stanford Bunny" model, this is a
- * popular static mesh format used by 3D scanning hardware
- * and software. This loader supports extremely large models
- * in both ASCII and binary format, but only has rudimentary
- * material support in the form of vertex colors and texture
- * coordinates.</TD>
- * </TR>
- * <TR>
- * <TD>Stereolithography (.stl)</TD>
- * <TD>The STL format is used for rapid prototyping and
- * computer-aided manufacturing, thus has no support for
- * materials.</TD>
- * </TR>
- * </TABLE>
- *
- * To load and display a mesh quickly, just do this:
- * \code
- * SceneManager->addAnimatedMeshSceneNode(
- * SceneManager->getMesh("yourmesh.3ds"));
- * \endcode
- * If you would like to implement and add your own file format loader to Irrlicht,
- * see addExternalMeshLoader().
- * \param filename: Filename of the mesh to load.
- * \param alternativeCacheName: In case you want to have the mesh under another name in the cache (to create real copies)
- * \return Null if failed, otherwise pointer to the mesh.
- * This pointer should not be dropped. See IReferenceCounted::drop() for more information.
- **/
- virtual IAnimatedMesh* getMesh(const io::path& filename, const io::path& alternativeCacheName=io::path("")) = 0;
- //! Get pointer to an animatable mesh. Loads the file if not loaded already.
- /** Works just as getMesh(const char* filename). If you want to
- remove a loaded mesh from the cache again, use removeMesh().
- \param file File handle of the mesh to load.
- \return NULL if failed and pointer to the mesh if successful.
- This pointer should not be dropped. See
- IReferenceCounted::drop() for more information. */
- virtual IAnimatedMesh* getMesh(io::IReadFile* file) = 0;
- //! Get interface to the mesh cache which is shared between all existing scene managers.
- /** With this interface, it is possible to manually add new loaded
- meshes (if ISceneManager::getMesh() is not sufficient), to remove them and to iterate
- through already loaded meshes. */
- virtual IMeshCache* getMeshCache() = 0;
- //! Get the video driver.
- /** \return Pointer to the video Driver.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual video::IVideoDriver* getVideoDriver() = 0;
- //! Get the active GUIEnvironment
- /** \return Pointer to the GUIEnvironment
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual gui::IGUIEnvironment* getGUIEnvironment() = 0;
- //! Get the active FileSystem
- /** \return Pointer to the FileSystem
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual io::IFileSystem* getFileSystem() = 0;
- //! adds Volume Lighting Scene Node.
- /** Example Usage:
- scene::IVolumeLightSceneNode * n = smgr->addVolumeLightSceneNode(0, -1,
- 32, 32, //Subdivide U/V
- video::SColor(0, 180, 180, 180), //foot color
- video::SColor(0, 0, 0, 0) //tail color
- );
- if (n)
- {
- n->setScale(core::vector3df(46.0f, 45.0f, 46.0f));
- n->getMaterial(0).setTexture(0, smgr->getVideoDriver()->getTexture("lightFalloff.png"));
- }
- \return Pointer to the volumeLight if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IVolumeLightSceneNode* addVolumeLightSceneNode(ISceneNode* parent=0, s32 id=-1,
- const u32 subdivU = 32, const u32 subdivV = 32,
- const video::SColor foot = video::SColor(51, 0, 230, 180),
- const video::SColor tail = video::SColor(0, 0, 0, 0),
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0;
- //! Adds a cube scene node
- /** \param size: Size of the cube, uniformly in each dimension.
- \param parent: Parent of the scene node. Can be 0 if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent
- where the scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \param type: Type of cube-mesh to create. Check ECUBE_MESH_TYPE documentation for more info
- \return Pointer to the created test scene node. This
- pointer should not be dropped. See IReferenceCounted::drop()
- for more information. */
- virtual IMeshSceneNode* addCubeSceneNode(f32 size=10.0f, ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f),
- ECUBE_MESH_TYPE type=ECMT_1BUF_12VTX_NA) = 0;
- //! Adds a sphere scene node of the given radius and detail
- /** \param radius: Radius of the sphere.
- \param polyCount: The number of vertices in horizontal and
- vertical direction. The total polyCount of the sphere is
- polyCount*polyCount. This parameter must be less than 256 to
- stay within the 16-bit limit of the indices of a meshbuffer.
- \param parent: Parent of the scene node. Can be 0 if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent
- where the scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \return Pointer to the created test scene node. This
- pointer should not be dropped. See IReferenceCounted::drop()
- for more information. */
- virtual IMeshSceneNode* addSphereSceneNode(f32 radius=5.0f, s32 polyCount=16,
- ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0;
- //! Adds a scene node for rendering an animated mesh model.
- /** \param mesh: Pointer to the loaded animated mesh to be displayed.
- \param parent: Parent of the scene node. Can be NULL if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent where the
- scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IAnimatedMeshSceneNode* addAnimatedMeshSceneNode(IAnimatedMesh* mesh,
- ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f),
- bool alsoAddIfMeshPointerZero=false) = 0;
- //! Adds a scene node for rendering a static mesh.
- /** \param mesh: Pointer to the loaded static mesh to be displayed.
- \param parent: Parent of the scene node. Can be NULL if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent where the
- scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IMeshSceneNode* addMeshSceneNode(IMesh* mesh, ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f),
- bool alsoAddIfMeshPointerZero=false) = 0;
- //! Adds a scene node for rendering a animated water surface mesh.
- /** Looks really good when the Material type EMT_TRANSPARENT_REFLECTION
- is used.
- \param waveHeight: Height of the water waves.
- \param waveSpeed: Speed of the water waves.
- \param waveLength: Length of a water wave.
- \param mesh: Pointer to the loaded static mesh to be displayed with water waves on it.
- \param parent: Parent of the scene node. Can be NULL if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent where the
- scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* addWaterSurfaceSceneNode(IMesh* mesh,
- f32 waveHeight=2.0f, f32 waveSpeed=300.0f, f32 waveLength=10.0f,
- ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0;
- //! Adds a scene node for rendering using a octree to the scene graph.
- /** This a good method for rendering
- scenes with lots of geometry. The octree is built on the fly from the mesh.
- \param mesh: The mesh containing all geometry from which the octree will be build.
- If this animated mesh has more than one frames in it, the first frame is taken.
- \param parent: Parent node of the octree node.
- \param id: id of the node. This id can be used to identify the node.
- \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node.
- If a node gets less polys than this value it will not be split into
- smaller nodes.
- \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
- \return Pointer to the octree if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IOctreeSceneNode* addOctreeSceneNode(IAnimatedMesh* mesh, ISceneNode* parent=0,
- s32 id=-1, s32 minimalPolysPerNode=512, bool alsoAddIfMeshPointerZero=false) = 0;
- //! Adds a scene node for rendering using a octree to the scene graph.
- /** This a good method for rendering scenes with lots of
- geometry. The octree is built on the fly from the mesh, much
- faster then a bsp tree.
- \param mesh: The mesh containing all geometry from which the octree will be build.
- \param parent: Parent node of the octree node.
- \param id: id of the node. This id can be used to identify the node.
- \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node.
- If a node gets less polys than this value it will not be split into
- smaller nodes.
- \param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
- \return Pointer to the octree if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IOctreeSceneNode* addOctreeSceneNode(IMesh* mesh, ISceneNode* parent=0,
- s32 id=-1, s32 minimalPolysPerNode=256, bool alsoAddIfMeshPointerZero=false) = 0;
- //! Adds a camera scene node to the scene graph and sets it as active camera.
- /** This camera does not react on user input like for example the one created with
- addCameraSceneNodeFPS(). If you want to move or animate it, use animators or the
- ISceneNode::setPosition(), ICameraSceneNode::setTarget() etc methods.
- By default, a camera's look at position (set with setTarget()) and its scene node
- rotation (set with setRotation()) are independent. If you want to be able to
- control the direction that the camera looks by using setRotation() then call
- ICameraSceneNode::bindTargetAndRotation(true) on it.
- \param position: Position of the space relative to its parent where the camera will be placed.
- \param lookat: Position where the camera will look at. Also known as target.
- \param parent: Parent scene node of the camera. Can be null. If the parent moves,
- the camera will move too.
- \param id: id of the camera. This id can be used to identify the camera.
- \param makeActive Flag whether this camera should become the active one.
- Make sure you always have one active camera.
- \return Pointer to interface to camera if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ICameraSceneNode* addCameraSceneNode(ISceneNode* parent = 0,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& lookat = core::vector3df(0,0,100),
- s32 id=-1, bool makeActive=true) = 0;
- //! Adds a maya style user controlled camera scene node to the scene graph.
- /** This is a standard camera with an animator that provides mouse control similar
- to camera in the 3D Software Maya by Alias Wavefront.
- The camera does not react on setPosition anymore after applying this animator. Instead
- use setTarget, to fix the target the camera the camera hovers around. And setDistance
- to set the current distance from that target, i.e. the radius of the orbit the camera
- hovers on.
- \param parent: Parent scene node of the camera. Can be null.
- \param rotateSpeed: Rotation speed of the camera.
- \param zoomSpeed: Zoom speed of the camera.
- \param translationSpeed: TranslationSpeed of the camera.
- \param id: id of the camera. This id can be used to identify the camera.
- \param distance Initial distance of the camera from the object
- \param makeActive Flag whether this camera should become the active one.
- Make sure you always have one active camera.
- \return Returns a pointer to the interface of the camera if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ICameraSceneNode* addCameraSceneNodeMaya(ISceneNode* parent=0,
- f32 rotateSpeed=-1500.f, f32 zoomSpeed=200.f,
- f32 translationSpeed=1500.f, s32 id=-1, f32 distance=70.f,
- bool makeActive=true
- , f32 rotX = 0.f, f32 rotY = 0.f
- ) =0;
- //! Adds a camera scene node with an animator which provides mouse and keyboard control appropriate for first person shooters (FPS).
- /** This FPS camera is intended to provide a demonstration of a
- camera that behaves like a typical First Person Shooter. It is
- useful for simple demos and prototyping but is not intended to
- provide a full solution for a production quality game. It binds
- the camera scene node rotation to the look-at target; @see
- ICameraSceneNode::bindTargetAndRotation(). With this camera,
- you look with the mouse, and move with cursor keys. If you want
- to change the key layout, you can specify your own keymap. For
- example to make the camera be controlled by the cursor keys AND
- the keys W,A,S, and D, do something like this:
- \code
- SKeyMap keyMap[8];
- keyMap[0].Action = EKA_MOVE_FORWARD;
- keyMap[0].KeyCode = KEY_UP;
- keyMap[1].Action = EKA_MOVE_FORWARD;
- keyMap[1].KeyCode = KEY_KEY_W;
- keyMap[2].Action = EKA_MOVE_BACKWARD;
- keyMap[2].KeyCode = KEY_DOWN;
- keyMap[3].Action = EKA_MOVE_BACKWARD;
- keyMap[3].KeyCode = KEY_KEY_S;
- keyMap[4].Action = EKA_STRAFE_LEFT;
- keyMap[4].KeyCode = KEY_LEFT;
- keyMap[5].Action = EKA_STRAFE_LEFT;
- keyMap[5].KeyCode = KEY_KEY_A;
- keyMap[6].Action = EKA_STRAFE_RIGHT;
- keyMap[6].KeyCode = KEY_RIGHT;
- keyMap[7].Action = EKA_STRAFE_RIGHT;
- keyMap[7].KeyCode = KEY_KEY_D;
- camera = sceneManager->addCameraSceneNodeFPS(0, 100, 500, -1, keyMap, 8);
- \endcode
- \param parent: Parent scene node of the camera. Can be null.
- \param rotateSpeed: Speed in degrees with which the camera is
- rotated. This can be done only with the mouse.
- \param moveSpeed: Speed in units per millisecond with which
- the camera is moved. Movement is done with the cursor keys.
- \param id: id of the camera. This id can be used to identify
- the camera.
- \param keyMapArray: Optional pointer to an array of a keymap,
- specifying what keys should be used to move the camera. If this
- is null, the default keymap is used. You can define actions
- more then one time in the array, to bind multiple keys to the
- same action.
- \param keyMapSize: Amount of items in the keymap array.
- \param noVerticalMovement: Setting this to true makes the
- camera only move within a horizontal plane, and disables
- vertical movement as known from most ego shooters. Default is
- 'false', with which it is possible to fly around in space, if
- no gravity is there.
- \param jumpSpeed: Speed with which the camera is moved when
- jumping.
- \param invertMouse: Setting this to true makes the camera look
- up when the mouse is moved down and down when the mouse is
- moved up, the default is 'false' which means it will follow the
- movement of the mouse cursor.
- \param makeActive Flag whether this camera should become the active one.
- Make sure you always have one active camera.
- \return Pointer to the interface of the camera if successful,
- otherwise 0. This pointer should not be dropped. See
- IReferenceCounted::drop() for more information. */
- virtual ICameraSceneNode* addCameraSceneNodeFPS(ISceneNode* parent = 0,
- f32 rotateSpeed = 100.0f, f32 moveSpeed = 0.5f, s32 id=-1,
- SKeyMap* keyMapArray=0, s32 keyMapSize=0, bool noVerticalMovement=false,
- f32 jumpSpeed = 0.f, bool invertMouse=false,
- bool makeActive=true) = 0;
- //! Adds a dynamic light scene node to the scene graph.
- /** The light will cast dynamic light on all
- other scene nodes in the scene, which have the material flag video::MTF_LIGHTING
- turned on. (This is the default setting in most scene nodes).
- \param parent: Parent scene node of the light. Can be null. If the parent moves,
- the light will move too.
- \param position: Position of the space relative to its parent where the light will be placed.
- \param color: Diffuse color of the light. Ambient or Specular colors can be set manually with
- the ILightSceneNode::getLightData() method.
- \param radius: Radius of the light.
- \param id: id of the node. This id can be used to identify the node.
- \return Pointer to the interface of the light if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ILightSceneNode* addLightSceneNode(ISceneNode* parent = 0,
- const core::vector3df& position = core::vector3df(0,0,0),
- video::SColorf color = video::SColorf(1.0f, 1.0f, 1.0f),
- f32 radius=100.0f, s32 id=-1) = 0;
- //! Adds a billboard scene node to the scene graph.
- /** A billboard is like a 3d sprite: A 2d element,
- which always looks to the camera. It is usually used for things
- like explosions, fire, lensflares and things like that.
- \param parent Parent scene node of the billboard. Can be null.
- If the parent moves, the billboard will move too.
- \param size Size of the billboard. This size is 2 dimensional
- because a billboard only has width and height.
- \param position Position of the space relative to its parent
- where the billboard will be placed.
- \param id An id of the node. This id can be used to identify
- the node.
- \param colorTop The color of the vertices at the top of the
- billboard (default: white).
- \param colorBottom The color of the vertices at the bottom of
- the billboard (default: white).
- \return Pointer to the billboard if successful, otherwise NULL.
- This pointer should not be dropped. See
- IReferenceCounted::drop() for more information. */
- virtual IBillboardSceneNode* addBillboardSceneNode(ISceneNode* parent = 0,
- const core::dimension2d<f32>& size = core::dimension2d<f32>(10.0f, 10.0f),
- const core::vector3df& position = core::vector3df(0,0,0), s32 id=-1,
- video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0;
- //! Adds a skybox scene node to the scene graph.
- /** A skybox is a big cube with 6 textures on it and
- is drawn around the camera position.
- \param top: Texture for the top plane of the box.
- \param bottom: Texture for the bottom plane of the box.
- \param left: Texture for the left plane of the box.
- \param right: Texture for the right plane of the box.
- \param front: Texture for the front plane of the box.
- \param back: Texture for the back plane of the box.
- \param parent: Parent scene node of the skybox. A skybox usually has no parent,
- so this should be null. Note: If a parent is set to the skybox, the box will not
- change how it is drawn.
- \param id: An id of the node. This id can be used to identify the node.
- \return Pointer to the sky box if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* addSkyBoxSceneNode(video::ITexture* top, video::ITexture* bottom,
- video::ITexture* left, video::ITexture* right, video::ITexture* front,
- video::ITexture* back, ISceneNode* parent = 0, s32 id=-1) = 0;
- //! Adds a skydome scene node to the scene graph.
- /** A skydome is a large (half-) sphere with a panoramic texture
- on the inside and is drawn around the camera position.
- Note: If the texture is mirrored you can use a negative scale for
- the texture-matrix of the node to still work with it.
- \param texture: Texture for the dome.
- \param horiRes: Number of vertices of a horizontal layer of the sphere.
- \param vertRes: Number of vertices of a vertical layer of the sphere.
- \param texturePercentage: How much of the height of the
- texture is used. Should be between 0 and 1.
- \param spherePercentage: How much of the sphere is drawn.
- Value should be between 0 and 2, where 1 is an exact
- half-sphere and 2 is a full sphere.
- \param radius The Radius of the sphere
- \param parent: Parent scene node of the dome. A dome usually has no parent,
- so this should be null. Note: If a parent is set, the dome will not
- change how it is drawn.
- \param id: An id of the node. This id can be used to identify the node.
- \return Pointer to the sky dome if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* addSkyDomeSceneNode(video::ITexture* texture,
- u32 horiRes=16, u32 vertRes=8,
- f32 texturePercentage=0.9, f32 spherePercentage=2.0,f32 radius = 1000.f,
- ISceneNode* parent=0, s32 id=-1) = 0;
- //! Adds a particle system scene node to the scene graph.
- /** \param withDefaultEmitter: Creates a default working point emitter
- which emits some particles. Set this to true to see a particle system
- in action. If set to false, you'll have to set the emitter you want by
- calling IParticleSystemSceneNode::setEmitter().
- \param parent: Parent of the scene node. Can be NULL if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: Position of the space relative to its parent where the
- scene node will be placed.
- \param rotation: Initial rotation of the scene node.
- \param scale: Initial scale of the scene node.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IParticleSystemSceneNode* addParticleSystemSceneNode(
- bool withDefaultEmitter=true, ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0,0,0),
- const core::vector3df& rotation = core::vector3df(0,0,0),
- const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) = 0;
- //! Adds a terrain scene node to the scene graph.
- /** This node implements is a simple terrain renderer which uses
- a technique known as geo mip mapping
- for reducing the detail of triangle blocks which are far away.
- The code for the TerrainSceneNode is based on the terrain
- renderer by Soconne and the GeoMipMapSceneNode developed by
- Spintz. They made their code available for Irrlicht and allowed
- it to be distributed under this licence. I only modified some
- parts. A lot of thanks go to them.
- This scene node is capable of loading terrains and updating
- the indices at runtime to enable viewing very large terrains
- very quickly. It uses a CLOD (Continuous Level of Detail)
- algorithm which updates the indices for each patch based on
- a LOD (Level of Detail) which is determined based on a patch's
- distance from the camera.
- The patch size of the terrain must always be a size of 2^N+1,
- i.e. 8+1(9), 16+1(17), etc.
- The MaxLOD available is directly dependent on the patch size
- of the terrain. LOD 0 contains all of the indices to draw all
- the triangles at the max detail for a patch. As each LOD goes
- up by 1 the step taken, in generating indices increases by
- -2^LOD, so for LOD 1, the step taken is 2, for LOD 2, the step
- taken is 4, LOD 3 - 8, etc. The step can be no larger than
- the size of the patch, so having a LOD of 8, with a patch size
- of 17, is asking the algorithm to generate indices every 2^8 (
- 256 ) vertices, which is not possible with a patch size of 17.
- The maximum LOD for a patch size of 17 is 2^4 ( 16 ). So,
- with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 (
- every 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every
- 8 vertices ) and LOD 4 ( every 16 vertices ).
- \param heightMapFileName: The name of the file on disk, to read vertex data from. This should
- be a gray scale bitmap.
- \param parent: Parent of the scene node. Can be 0 if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: The absolute position of this node.
- \param rotation: The absolute rotation of this node. ( NOT YET IMPLEMENTED )
- \param scale: The scale factor for the terrain. If you're
- using a heightmap of size 129x129 and would like your terrain
- to be 12900x12900 in game units, then use a scale factor of (
- core::vector ( 100.0f, 100.0f, 100.0f ). If you use a Y
- scaling factor of 0.0f, then your terrain will be flat.
- \param vertexColor: The default color of all the vertices. If no texture is associated
- with the scene node, then all vertices will be this color. Defaults to white.
- \param maxLOD: The maximum LOD (level of detail) for the node. Only change if you
- know what you are doing, this might lead to strange behavior.
- \param patchSize: patch size of the terrain. Only change if you
- know what you are doing, this might lead to strange behavior.
- \param smoothFactor: The number of times the vertices are smoothed.
- \param addAlsoIfHeightmapEmpty: Add terrain node even with empty heightmap.
- \return Pointer to the created scene node. Can be null
- if the terrain could not be created, for example because the
- heightmap could not be loaded. The returned pointer should
- not be dropped. See IReferenceCounted::drop() for more
- information. */
- virtual ITerrainSceneNode* addTerrainSceneNode(
- const io::path& heightMapFileName,
- ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0.0f,0.0f,0.0f),
- const core::vector3df& rotation = core::vector3df(0.0f,0.0f,0.0f),
- const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f),
- video::SColor vertexColor = video::SColor(255,255,255,255),
- s32 maxLOD=5, E_TERRAIN_PATCH_SIZE patchSize=ETPS_17, s32 smoothFactor=0,
- bool addAlsoIfHeightmapEmpty = false) = 0;
- //! Adds a terrain scene node to the scene graph.
- /** Just like the other addTerrainSceneNode() method, but takes an IReadFile
- pointer as parameter for the heightmap. For more information take a look
- at the other function.
- \param heightMapFile: The file handle to read vertex data from. This should
- be a gray scale bitmap.
- \param parent: Parent of the scene node. Can be 0 if no parent.
- \param id: Id of the node. This id can be used to identify the scene node.
- \param position: The absolute position of this node.
- \param rotation: The absolute rotation of this node. ( NOT YET IMPLEMENTED )
- \param scale: The scale factor for the terrain. If you're
- using a heightmap of size 129x129 and would like your terrain
- to be 12900x12900 in game units, then use a scale factor of (
- core::vector ( 100.0f, 100.0f, 100.0f ). If you use a Y
- scaling factor of 0.0f, then your terrain will be flat.
- \param vertexColor: The default color of all the vertices. If no texture is associated
- with the scene node, then all vertices will be this color. Defaults to white.
- \param maxLOD: The maximum LOD (level of detail) for the node. Only change if you
- know what you are doing, this might lead to strange behavior.
- \param patchSize: patch size of the terrain. Only change if you
- know what you are doing, this might lead to strange behavior.
- \param smoothFactor: The number of times the vertices are smoothed.
- \param addAlsoIfHeightmapEmpty: Add terrain node even with empty heightmap.
- \return Pointer to the created scene node. Can be null
- if the terrain could not be created, for example because the
- heightmap could not be loaded. The returned pointer should
- not be dropped. See IReferenceCounted::drop() for more
- information. */
- virtual ITerrainSceneNode* addTerrainSceneNode(
- io::IReadFile* heightMapFile,
- ISceneNode* parent=0, s32 id=-1,
- const core::vector3df& position = core::vector3df(0.0f,0.0f,0.0f),
- const core::vector3df& rotation = core::vector3df(0.0f,0.0f,0.0f),
- const core::vector3df& scale = core::vector3df(1.0f,1.0f,1.0f),
- video::SColor vertexColor = video::SColor(255,255,255,255),
- s32 maxLOD=5, E_TERRAIN_PATCH_SIZE patchSize=ETPS_17, s32 smoothFactor=0,
- bool addAlsoIfHeightmapEmpty = false) = 0;
- //! Adds a quake3 scene node to the scene graph.
- /** A Quake3 Scene renders multiple meshes for a specific HighLanguage Shader (Quake3 Style )
- \return Pointer to the quake3 scene node if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IMeshSceneNode* addQuake3SceneNode(const IMeshBuffer* meshBuffer, const quake3::IShader * shader,
- ISceneNode* parent=0, s32 id=-1
- ) = 0;
- //! Adds an empty scene node to the scene graph.
- /** Can be used for doing advanced transformations
- or structuring the scene graph.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* addEmptySceneNode(ISceneNode* parent=0, s32 id=-1) = 0;
- //! Adds a dummy transformation scene node to the scene graph.
- /** This scene node does not render itself, and does not respond to set/getPosition,
- set/getRotation and set/getScale. Its just a simple scene node that takes a
- matrix as relative transformation, making it possible to insert any transformation
- anywhere into the scene graph.
- \return Pointer to the created scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IDummyTransformationSceneNode* addDummyTransformationSceneNode(
- ISceneNode* parent=0, s32 id=-1) = 0;
- //! Adds a text scene node, which is able to display 2d text at a position in three dimensional space
- virtual ITextSceneNode* addTextSceneNode(gui::IGUIFont* font, const wchar_t* text,
- video::SColor color=video::SColor(100,255,255,255),
- ISceneNode* parent = 0, const core::vector3df& position = core::vector3df(0,0,0),
- s32 id=-1) = 0;
- //! Adds a text scene node, which uses billboards. The node, and the text on it, will scale with distance.
- /**
- \param font The font to use on the billboard. Pass 0 to use the GUI environment's default font.
- \param text The text to display on the billboard.
- \param parent The billboard's parent. Pass 0 to use the root scene node.
- \param size The billboard's width and height.
- \param position The billboards position relative to its parent.
- \param id: An id of the node. This id can be used to identify the node.
- \param colorTop: The color of the vertices at the top of the billboard (default: white).
- \param colorBottom: The color of the vertices at the bottom of the billboard (default: white).
- \return Pointer to the billboard if successful, otherwise NULL.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IBillboardTextSceneNode* addBillboardTextSceneNode( gui::IGUIFont* font, const wchar_t* text,
- ISceneNode* parent = 0,
- const core::dimension2d<f32>& size = core::dimension2d<f32>(10.0f, 10.0f),
- const core::vector3df& position = core::vector3df(0,0,0), s32 id=-1,
- video::SColor colorTop = 0xFFFFFFFF, video::SColor colorBottom = 0xFFFFFFFF) = 0;
- //! Adds a Hill Plane mesh to the mesh pool.
- /** The mesh is generated on the fly
- and looks like a plane with some hills on it. It is uses mostly for quick
- tests of the engine only. You can specify how many hills there should be
- on the plane and how high they should be. Also you must specify a name for
- the mesh, because the mesh is added to the mesh pool, and can be retrieved
- again using ISceneManager::getMesh() with the name as parameter.
- \param name: The name of this mesh which must be specified in order
- to be able to retrieve the mesh later with ISceneManager::getMesh().
- \param tileSize: Size of a tile of the mesh. (10.0f, 10.0f) would be a
- good value to start, for example.
- \param tileCount: Specifies how much tiles there will be. If you specify
- for example that a tile has the size (10.0f, 10.0f) and the tileCount is
- (10,10), than you get a field of 100 tiles which has the dimension 100.0f x 100.0f.
- \param material: Material of the hill mesh.
- \param hillHeight: Height of the hills. If you specify a negative value
- you will get holes instead of hills. If the height is 0, no hills will be
- created.
- \param countHills: Amount of hills on the plane. There will be countHills.X
- hills along the X axis and countHills.Y along the Y axis. So in total there
- will be countHills.X * countHills.Y hills.
- \param textureRepeatCount: Defines how often the texture will be repeated in
- x and y direction.
- return Null if the creation failed. The reason could be that you
- specified some invalid parameters or that a mesh with that name already
- exists. If successful, a pointer to the mesh is returned.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IAnimatedMesh* addHillPlaneMesh(const io::path& name,
- const core::dimension2d<f32>& tileSize, const core::dimension2d<u32>& tileCount,
- video::SMaterial* material = 0, f32 hillHeight = 0.0f,
- const core::dimension2d<f32>& countHills = core::dimension2d<f32>(0.0f, 0.0f),
- const core::dimension2d<f32>& textureRepeatCount = core::dimension2d<f32>(1.0f, 1.0f)) = 0;
- //! Adds a static terrain mesh to the mesh pool.
- /** The mesh is generated on the fly
- from a texture file and a height map file. Both files may be huge
- (8000x8000 pixels would be no problem) because the generator splits the
- files into smaller textures if necessary.
- You must specify a name for the mesh, because the mesh is added to the mesh pool,
- and can be retrieved again using ISceneManager::getMesh() with the name as parameter.
- \param meshname: The name of this mesh which must be specified in order
- to be able to retrieve the mesh later with ISceneManager::getMesh().
- \param texture: Texture for the terrain. Please note that this is not a
- hardware texture as usual (ITexture), but an IImage software texture.
- You can load this texture with IVideoDriver::createImageFromFile().
- \param heightmap: A grayscaled heightmap image. Like the texture,
- it can be created with IVideoDriver::createImageFromFile(). The amount
- of triangles created depends on the size of this texture, so use a small
- heightmap to increase rendering speed.
- \param stretchSize: Parameter defining how big a is pixel on the heightmap.
- \param maxHeight: Defines how high a white pixel on the heightmap is.
- \param defaultVertexBlockSize: Defines the initial dimension between vertices.
- \return Null if the creation failed. The reason could be that you
- specified some invalid parameters, that a mesh with that name already
- exists, or that a texture could not be found. If successful, a pointer to the mesh is returned.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IAnimatedMesh* addTerrainMesh(const io::path& meshname,
- video::IImage* texture, video::IImage* heightmap,
- const core::dimension2d<f32>& stretchSize = core::dimension2d<f32>(10.0f,10.0f),
- f32 maxHeight=200.0f,
- const core::dimension2d<u32>& defaultVertexBlockSize = core::dimension2d<u32>(64,64)) = 0;
- //! add a static arrow mesh to the meshpool
- /** \param name Name of the mesh
- \param vtxColorCylinder color of the cylinder
- \param vtxColorCone color of the cone
- \param tessellationCylinder Number of quads the cylinder side consists of
- \param tessellationCone Number of triangles the cone's roof consists of
- \param height Total height of the arrow
- \param cylinderHeight Total height of the cylinder, should be lesser than total height
- \param widthCylinder Diameter of the cylinder
- \param widthCone Diameter of the cone's base, should be not smaller than the cylinder's diameter
- \return Pointer to the arrow mesh if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IAnimatedMesh* addArrowMesh(const io::path& name,
- video::SColor vtxColorCylinder=0xFFFFFFFF,
- video::SColor vtxColorCone=0xFFFFFFFF,
- u32 tessellationCylinder=4, u32 tessellationCone=8,
- f32 height=1.f, f32 cylinderHeight=0.6f,
- f32 widthCylinder=0.05f, f32 widthCone=0.3f) = 0;
- //! add a static sphere mesh to the meshpool
- /** \param name Name of the mesh
- \param radius Radius of the sphere
- \param polyCountX Number of quads used for the horizontal tiling
- \param polyCountY Number of quads used for the vertical tiling
- \return Pointer to the sphere mesh if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IAnimatedMesh* addSphereMesh(const io::path& name,
- f32 radius=5.f, u32 polyCountX = 16,
- u32 polyCountY = 16) = 0;
- //! Add a volume light mesh to the meshpool
- /** \param name Name of the mesh
- \param SubdivideU Horizontal subdivision count
- \param SubdivideV Vertical subdivision count
- \param FootColor Color of the bottom of the light
- \param TailColor Color of the top of the light
- \return Pointer to the volume light mesh if successful, otherwise 0.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information.
- */
- virtual IAnimatedMesh* addVolumeLightMesh(const io::path& name,
- const u32 SubdivideU = 32, const u32 SubdivideV = 32,
- const video::SColor FootColor = video::SColor(51, 0, 230, 180),
- const video::SColor TailColor = video::SColor(0, 0, 0, 0)) = 0;
- //! Gets the root scene node.
- /** This is the scene node which is parent
- of all scene nodes. The root scene node is a special scene node which
- only exists to manage all scene nodes. It will not be rendered and cannot
- be removed from the scene.
- \return Pointer to the root scene node.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* getRootSceneNode() = 0;
- //! Get the first scene node with the specified id.
- /** \param id: The id to search for
- \param start: Scene node to start from. All children of this scene
- node are searched. If null is specified, the root scene node is
- taken.
- \return Pointer to the first scene node with this id,
- and null if no scene node could be found.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* getSceneNodeFromId(s32 id, ISceneNode* start=0) = 0;
- //! Get the first scene node with the specified name.
- /** \param name: The name to search for
- \param start: Scene node to start from. All children of this scene
- node are searched. If null is specified, the root scene node is
- taken.
- \return Pointer to the first scene node with this id,
- and null if no scene node could be found.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* getSceneNodeFromName(const c8* name, ISceneNode* start=0) = 0;
- //! Get the first scene node with the specified type.
- /** \param type: The type to search for
- \param start: Scene node to start from. All children of this scene
- node are searched. If null is specified, the root scene node is
- taken.
- \return Pointer to the first scene node with this type,
- and null if no scene node could be found.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* getSceneNodeFromType(scene::ESCENE_NODE_TYPE type, ISceneNode* start=0) = 0;
- //! Get scene nodes by type.
- /** \param type: Type of scene node to find (ESNT_ANY will return all child nodes).
- \param outNodes: results will be added to this array (outNodes is not cleared).
- \param start: Scene node to start from. This node and all children of this scene
- node are checked (recursively, so also children of children, etc). If null is specified,
- the root scene node is taken as start-node. */
- virtual void getSceneNodesFromType(ESCENE_NODE_TYPE type,
- core::array<scene::ISceneNode*>& outNodes,
- ISceneNode* start=0) = 0;
- //! Get the current active camera.
- /** \return The active camera is returned. Note that this can
- be NULL, if there was no camera created yet.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ICameraSceneNode* getActiveCamera() const =0;
- //! Sets the currently active camera.
- /** The previous active camera will be deactivated.
- \param camera: The new camera which should be active. */
- virtual void setActiveCamera(ICameraSceneNode* camera) = 0;
- //! Sets the color of stencil buffers shadows drawn by the scene manager.
- virtual void setShadowColor(video::SColor color = video::SColor(150,0,0,0)) = 0;
- //! Get the current color of shadows.
- virtual video::SColor getShadowColor() const = 0;
- //! Create a shadow volume scene node to be used with custom nodes
- /** Use this if you implement your own SceneNodes and need shadow volumes in them.
- Otherwise you should generally use addShadowVolumeSceneNode functions from IMeshSceneNode or IAnimatedMeshSceneNode.*/
- virtual IShadowVolumeSceneNode* createShadowVolumeSceneNode(const IMesh* shadowMesh, ISceneNode* parent, s32 id, bool zfailmethod, f32 infinity) = 0;
- //! Registers a node for rendering it at a specific time.
- /** This method should only be used by SceneNodes when they get a
- ISceneNode::OnRegisterSceneNode() call.
- \param node: Node to register for drawing. Usually scene nodes would set 'this'
- as parameter here because they want to be drawn.
- \param pass: Specifies when the node wants to be drawn in relation to the other nodes.
- For example, if the node is a shadow, it usually wants to be drawn after all other nodes
- and will use ESNRP_SHADOW for this. See scene::E_SCENE_NODE_RENDER_PASS for details.
- Note: This is _not_ a bitfield. If you want to register a note for several render passes, then
- call this function once for each pass.
- \return scene will be rendered ( passed culling ) */
- virtual u32 registerNodeForRendering(ISceneNode* node,
- E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) = 0;
- //! Clear all nodes which are currently registered for rendering
- /** Usually you don't have to care about this as drawAll will clear nodes
- after rendering them. But sometimes you might have to manually reset this.
- For example when you deleted nodes between registering and rendering. */
- virtual void clearAllRegisteredNodesForRendering() = 0;
- //! Draws all the scene nodes.
- /** This can only be invoked between
- IVideoDriver::beginScene() and IVideoDriver::endScene(). Please note that
- the scene is not only drawn when calling this, but also animated
- by existing scene node animators, culling of scene nodes is done, etc. */
- virtual void drawAll() = 0;
- //! Creates a rotation animator, which rotates the attached scene node around itself.
- /** \param rotationSpeed Specifies the speed of the animation in degree per 10 milliseconds.
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will animate it.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createRotationAnimator(const core::vector3df& rotationSpeed) = 0;
- //! Creates a fly circle animator, which lets the attached scene node fly around a center.
- /** \param center: Center of the circle.
- \param radius: Radius of the circle.
- \param speed: The orbital speed, in radians per millisecond.
- \param direction: Specifies the upvector used for alignment of the mesh.
- \param startPosition: The position on the circle where the animator will
- begin. Value is in multiples of a circle, i.e. 0.5 is half way around. (phase)
- \param radiusEllipsoid: if radiusEllipsoid != 0 then radius2 from a ellipsoid
- begin. Value is in multiples of a circle, i.e. 0.5 is half way around. (phase)
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will animate it.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createFlyCircleAnimator(
- const core::vector3df& center=core::vector3df(0.f,0.f,0.f),
- f32 radius=100.f, f32 speed=0.001f,
- const core::vector3df& direction=core::vector3df(0.f, 1.f, 0.f),
- f32 startPosition = 0.f,
- f32 radiusEllipsoid = 0.f) = 0;
- //! Creates a fly straight animator, which lets the attached scene node fly or move along a line between two points.
- /** \param startPoint: Start point of the line.
- \param endPoint: End point of the line.
- \param timeForWay: Time in milliseconds how long the node should need to
- move from the start point to the end point.
- \param loop: If set to false, the node stops when the end point is reached.
- If loop is true, the node begins again at the start.
- \param pingpong Flag to set whether the animator should fly
- back from end to start again.
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will animate it.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createFlyStraightAnimator(const core::vector3df& startPoint,
- const core::vector3df& endPoint, u32 timeForWay, bool loop=false, bool pingpong = false) = 0;
- //! Creates a texture animator, which switches the textures of the target scene node based on a list of textures.
- /** \param textures: List of textures to use.
- \param timePerFrame: Time in milliseconds, how long any texture in the list
- should be visible.
- \param loop: If set to to false, the last texture remains set, and the animation
- stops. If set to true, the animation restarts with the first texture.
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will animate it.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createTextureAnimator(const core::array<video::ITexture*>& textures,
- s32 timePerFrame, bool loop=true) = 0;
- //! Creates a scene node animator, which deletes the scene node after some time automatically.
- /** \param timeMs: Time in milliseconds, after when the node will be deleted.
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will animate it.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createDeleteAnimator(u32 timeMs) = 0;
- //! Creates a special scene node animator for doing automatic collision detection and response.
- /** See ISceneNodeAnimatorCollisionResponse for details.
- \param world: Triangle selector holding all triangles of the world with which
- the scene node may collide. You can create a triangle selector with
- ISceneManager::createTriangleSelector();
- \param sceneNode: SceneNode which should be manipulated. After you added this animator
- to the scene node, the scene node will not be able to move through walls and is
- affected by gravity. If you need to teleport the scene node to a new position without
- it being effected by the collision geometry, then call sceneNode->setPosition(); then
- animator->setTargetNode(sceneNode);
- \param ellipsoidRadius: Radius of the ellipsoid with which collision detection and
- response is done. If you have got a scene node, and you are unsure about
- how big the radius should be, you could use the following code to determine
- it:
- \code
- const core::aabbox3d<f32>& box = yourSceneNode->getBoundingBox();
- core::vector3df radius = box.MaxEdge - box.getCenter();
- \endcode
- \param gravityPerSecond: Sets the gravity of the environment, as an acceleration in
- units per second per second. If your units are equivalent to meters, then
- core::vector3df(0,-10.0f,0) would give an approximately realistic gravity.
- You can disable gravity by setting it to core::vector3df(0,0,0).
- \param ellipsoidTranslation: By default, the ellipsoid for collision detection is created around
- the center of the scene node, which means that the ellipsoid surrounds
- it completely. If this is not what you want, you may specify a translation
- for the ellipsoid.
- \param slidingValue: DOCUMENTATION NEEDED.
- \return The animator. Attach it to a scene node with ISceneNode::addAnimator()
- and the animator will cause it to do collision detection and response.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimatorCollisionResponse* createCollisionResponseAnimator(
- ITriangleSelector* world, ISceneNode* sceneNode,
- const core::vector3df& ellipsoidRadius = core::vector3df(30,60,30),
- const core::vector3df& gravityPerSecond = core::vector3df(0,-10.0f,0),
- const core::vector3df& ellipsoidTranslation = core::vector3df(0,0,0),
- f32 slidingValue = 0.0005f) = 0;
- //! Creates a follow spline animator.
- /** The animator modifies the position of
- the attached scene node to make it follow a Hermite spline.
- It uses a subset of Hermite splines: either cardinal splines
- (tightness != 0.5) or Catmull-Rom-splines (tightness == 0.5).
- The animator moves from one control point to the next in
- 1/speed seconds. This code was sent in by Matthias Gall.
- If you no longer need the animator, you should call ISceneNodeAnimator::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimator* createFollowSplineAnimator(s32 startTime,
- const core::array< core::vector3df >& points,
- f32 speed = 1.0f, f32 tightness = 0.5f, bool loop=true, bool pingpong=false, bool steer=false) = 0;
- //! Creates a simple ITriangleSelector, based on a mesh.
- /** Triangle selectors
- can be used for doing collision detection. Don't use this selector
- for a huge amount of triangles like in Quake3 maps.
- Instead, use for example ISceneManager::createOctreeTriangleSelector().
- Please note that the created triangle selector is not automatically attached
- to the scene node. You will have to call ISceneNode::setTriangleSelector()
- for this. To create and attach a triangle selector is done like this:
- \code
- ITriangleSelector* s = sceneManager->createTriangleSelector(yourMesh,
- yourSceneNode);
- yourSceneNode->setTriangleSelector(s);
- s->drop();
- \endcode
- \param mesh: Mesh of which the triangles are taken.
- \param node: Scene node of which transformation is used.
- \param separateMeshbuffers: When true it's possible to get information which meshbuffer
- got hit in collision tests. But has a slight speed cost.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ITriangleSelector* createTriangleSelector(IMesh* mesh, ISceneNode* node, bool separateMeshbuffers=false) = 0;
- //! Creates a simple ITriangleSelector, based on a meshbuffer.
- /**
- This is a static selector which won't update when the mesh changes.
- \param meshBuffer Triangles of that meshbuffer are used
- \param materialIndex If you pass a material index that index can be returned by the triangle selector.
- \para node: Scene node of which transformation is used.
- */
- virtual ITriangleSelector* createTriangleSelector(const IMeshBuffer* meshBuffer, irr::u32 materialIndex, ISceneNode* node) = 0;
- //! Creates a simple ITriangleSelector, based on an animated mesh scene node.
- /** Details of the mesh associated with the node will be extracted internally.
- \param node The animated mesh scene node from which to build the selector
- \param separateMeshbuffers: When true it's possible to get information which meshbuffer
- got hit in collision tests. But has a slight speed cost.
- */
- virtual ITriangleSelector* createTriangleSelector(IAnimatedMeshSceneNode* node, bool separateMeshbuffers=false) = 0;
- //! Creates a simple dynamic ITriangleSelector, based on a axis aligned bounding box.
- /** Triangle selectors
- can be used for doing collision detection. Every time when triangles are
- queried, the triangle selector gets the bounding box of the scene node,
- an creates new triangles. In this way, it works good with animated scene nodes.
- \param node: Scene node of which the bounding box, visibility and transformation is used.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ITriangleSelector* createTriangleSelectorFromBoundingBox(ISceneNode* node) = 0;
- //! Creates a Triangle Selector, optimized by an octree.
- /** Triangle selectors
- can be used for doing collision detection. This triangle selector is
- optimized for huge amounts of triangle, it organizes them in an octree.
- Please note that the created triangle selector is not automatically attached
- to the scene node. You will have to call ISceneNode::setTriangleSelector()
- for this. To create and attach a triangle selector is done like this:
- \code
- ITriangleSelector* s = sceneManager->createOctreeTriangleSelector(yourMesh,
- yourSceneNode);
- yourSceneNode->setTriangleSelector(s);
- s->drop();
- \endcode
- For more information and examples on this, take a look at the collision
- tutorial in the SDK.
- \param mesh: Mesh of which the triangles are taken.
- \param node: Scene node of which visibility and transformation is used.
- \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node.
- If a node gets less polys than this value, it will not be split into
- smaller nodes.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ITriangleSelector* createOctreeTriangleSelector(IMesh* mesh,
- ISceneNode* node, s32 minimalPolysPerNode=32) = 0;
- //! Creates a Triangle Selector for a single meshbuffer, optimized by an octree.
- /** Triangle selectors
- can be used for doing collision detection. This triangle selector is
- optimized for huge amounts of triangle, it organizes them in an octree.
- Please note that the created triangle selector is not automatically attached
- to the scene node. You will have to call ISceneNode::setTriangleSelector()
- for this. To create and attach a triangle selector is done like this:
- \code
- ITriangleSelector* s = sceneManager->createOctreeTriangleSelector(yourMesh,
- yourSceneNode);
- yourSceneNode->setTriangleSelector(s);
- s->drop();
- \endcode
- For more information and examples on this, take a look at the collision
- tutorial in the SDK.
- \param meshBuffer: Meshbuffer of which the triangles are taken.
- \param materialIndex: Setting this value allows the triangle selector to return the material index
- \param node: Scene node of which visibility and transformation is used.
- \param minimalPolysPerNode: Specifies the minimal polygons contained a octree node.
- If a node gets less polys than this value, it will not be split into
- smaller nodes.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ITriangleSelector* createOctreeTriangleSelector(IMeshBuffer* meshBuffer, irr::u32 materialIndex,
- ISceneNode* node, s32 minimalPolysPerNode=32) = 0;
- //! //! Creates a Triangle Selector, optimized by an octree.
- /** \deprecated Use createOctreeTriangleSelector instead. This method may be removed by Irrlicht 1.9. */
- IRR_DEPRECATED ITriangleSelector* createOctTreeTriangleSelector(IMesh* mesh,
- ISceneNode* node, s32 minimalPolysPerNode=32)
- {
- return createOctreeTriangleSelector(mesh, node, minimalPolysPerNode);
- }
- //! Creates a meta triangle selector.
- /** A meta triangle selector is nothing more than a
- collection of one or more triangle selectors providing together
- the interface of one triangle selector. In this way,
- collision tests can be done with different triangle soups in one pass.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual IMetaTriangleSelector* createMetaTriangleSelector() = 0;
- //! Creates a triangle selector which can select triangles from a terrain scene node.
- /** \param node: Pointer to the created terrain scene node
- \param LOD: Level of detail, 0 for highest detail.
- \return The selector, or null if not successful.
- If you no longer need the selector, you should call ITriangleSelector::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ITriangleSelector* createTerrainTriangleSelector(
- ITerrainSceneNode* node, s32 LOD=0) = 0;
- //! Adds an external mesh loader for extending the engine with new file formats.
- /** If you want the engine to be extended with
- file formats it currently is not able to load (e.g. .cob), just implement
- the IMeshLoader interface in your loading class and add it with this method.
- Using this method it is also possible to override built-in mesh loaders with
- newer or updated versions without the need to recompile the engine.
- \param externalLoader: Implementation of a new mesh loader. */
- virtual void addExternalMeshLoader(IMeshLoader* externalLoader) = 0;
- //! Returns the number of mesh loaders supported by Irrlicht at this time
- virtual u32 getMeshLoaderCount() const = 0;
- //! Retrieve the given mesh loader
- /** \param index The index of the loader to retrieve. This parameter is an 0-based
- array index.
- \return A pointer to the specified loader, 0 if the index is incorrect. */
- virtual IMeshLoader* getMeshLoader(u32 index) const = 0;
- //! Adds an external scene loader for extending the engine with new file formats.
- /** If you want the engine to be extended with
- file formats it currently is not able to load (e.g. .vrml), just implement
- the ISceneLoader interface in your loading class and add it with this method.
- Using this method it is also possible to override the built-in scene loaders
- with newer or updated versions without the need to recompile the engine.
- \param externalLoader: Implementation of a new mesh loader. */
- virtual void addExternalSceneLoader(ISceneLoader* externalLoader) = 0;
- //! Returns the number of scene loaders supported by Irrlicht at this time
- virtual u32 getSceneLoaderCount() const = 0;
- //! Retrieve the given scene loader
- /** \param index The index of the loader to retrieve. This parameter is an 0-based
- array index.
- \return A pointer to the specified loader, 0 if the index is incorrect. */
- virtual ISceneLoader* getSceneLoader(u32 index) const = 0;
- //! Get pointer to the scene collision manager.
- /** \return Pointer to the collision manager
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneCollisionManager* getSceneCollisionManager() = 0;
- //! Get pointer to the mesh manipulator.
- /** \return Pointer to the mesh manipulator
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual IMeshManipulator* getMeshManipulator() = 0;
- //! Adds a scene node to the deletion queue.
- /** The scene node is immediately
- deleted when it's secure. Which means when the scene node does not
- execute animators and things like that. This method is for example
- used for deleting scene nodes by their scene node animators. In
- most other cases, a ISceneNode::remove() call is enough, using this
- deletion queue is not necessary.
- See ISceneManager::createDeleteAnimator() for details.
- \param node: Node to delete. */
- virtual void addToDeletionQueue(ISceneNode* node) = 0;
- //! Posts an input event to the environment.
- /** Usually you do not have to
- use this method, it is used by the internal engine. */
- virtual bool postEventFromUser(const SEvent& event) = 0;
- //! Clears the whole scene.
- /** All scene nodes are removed. */
- virtual void clear() = 0;
- //! Get interface to the parameters set in this scene.
- /** String parameters can be used by plugins and mesh loaders.
- See COLLADA_CREATE_SCENE_INSTANCES and DMF_USE_MATERIALS_DIRS */
- virtual io::IAttributes* getParameters() = 0;
- //! Get current render pass.
- /** All scene nodes are being rendered in a specific order.
- First lights, cameras, sky boxes, solid geometry, and then transparent
- stuff. During the rendering process, scene nodes may want to know what the scene
- manager is rendering currently, because for example they registered for rendering
- twice, once for transparent geometry and once for solid. When knowing what rendering
- pass currently is active they can render the correct part of their geometry. */
- virtual E_SCENE_NODE_RENDER_PASS getSceneNodeRenderPass() const = 0;
- //! Get the default scene node factory which can create all built in scene nodes
- /** \return Pointer to the default scene node factory
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeFactory* getDefaultSceneNodeFactory() = 0;
- //! Adds a scene node factory to the scene manager.
- /** Use this to extend the scene manager with new scene node types which it should be
- able to create automatically, for example when loading data from xml files. */
- virtual void registerSceneNodeFactory(ISceneNodeFactory* factoryToAdd) = 0;
- //! Get amount of registered scene node factories.
- virtual u32 getRegisteredSceneNodeFactoryCount() const = 0;
- //! Get a scene node factory by index
- /** \return Pointer to the requested scene node factory, or 0 if it does not exist.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeFactory* getSceneNodeFactory(u32 index) = 0;
- //! Get the default scene node animator factory which can create all built-in scene node animators
- /** \return Pointer to the default scene node animator factory
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimatorFactory* getDefaultSceneNodeAnimatorFactory() = 0;
- //! Adds a scene node animator factory to the scene manager.
- /** Use this to extend the scene manager with new scene node animator types which it should be
- able to create automatically, for example when loading data from xml files. */
- virtual void registerSceneNodeAnimatorFactory(ISceneNodeAnimatorFactory* factoryToAdd) = 0;
- //! Get amount of registered scene node animator factories.
- virtual u32 getRegisteredSceneNodeAnimatorFactoryCount() const = 0;
- //! Get scene node animator factory by index
- /** \return Pointer to the requested scene node animator factory, or 0 if it does not exist.
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNodeAnimatorFactory* getSceneNodeAnimatorFactory(u32 index) = 0;
- //! Get typename from a scene node type or null if not found
- virtual const c8* getSceneNodeTypeName(ESCENE_NODE_TYPE type) = 0;
- //! Returns a typename from a scene node animator type or null if not found
- virtual const c8* getAnimatorTypeName(ESCENE_NODE_ANIMATOR_TYPE type) = 0;
- //! Adds a scene node to the scene by name
- /** \return Pointer to the scene node added by a factory
- This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
- virtual ISceneNode* addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent=0) = 0;
- //! creates a scene node animator based on its type name
- /** \param typeName: Type of the scene node animator to add.
- \param target: Target scene node of the new animator.
- \return Returns pointer to the new scene node animator or null if not successful. You need to
- drop this pointer after calling this, see IReferenceCounted::drop() for details. */
- virtual ISceneNodeAnimator* createSceneNodeAnimator(const char* typeName, ISceneNode* target=0) = 0;
- //! Creates a new scene manager.
- /** This can be used to easily draw and/or store two
- independent scenes at the same time. The mesh cache will be
- shared between all existing scene managers, which means if you
- load a mesh in the original scene manager using for example
- getMesh(), the mesh will be available in all other scene
- managers too, without loading.
- The original/main scene manager will still be there and
- accessible via IrrlichtDevice::getSceneManager(). If you need
- input event in this new scene manager, for example for FPS
- cameras, you'll need to forward input to this manually: Just
- implement an IEventReceiver and call
- yourNewSceneManager->postEventFromUser(), and return true so
- that the original scene manager doesn't get the event.
- Otherwise, all input will go to the main scene manager
- automatically.
- If you no longer need the new scene manager, you should call
- ISceneManager::drop().
- See IReferenceCounted::drop() for more information. */
- virtual ISceneManager* createNewSceneManager(bool cloneContent=false) = 0;
- //! Saves the current scene into a file.
- /** Scene nodes with the option isDebugObject set to true are
- not being saved. The scene is usually written to an .irr file,
- an xml based format. .irr files can Be edited with the Irrlicht
- Engine Editor, irrEdit (http://www.ambiera.com/irredit/). To
- load .irr files again, see ISceneManager::loadScene().
- \param filename Name of the file.
- \param userDataSerializer If you want to save some user data
- for every scene node into the file, implement the
- ISceneUserDataSerializer interface and provide it as parameter
- here. Otherwise, simply specify 0 as this parameter.
- \param node Node which is taken as the top node of the scene.
- This node and all of its descendants are saved into the scene
- file. Pass 0 or the scene manager to save the full scene (which
- is also the default).
- \return True if successful. */
- virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
- //! Saves the current scene into a file.
- /** Scene nodes with the option isDebugObject set to true are
- not being saved. The scene is usually written to an .irr file,
- an xml based format. .irr files can Be edited with the Irrlicht
- Engine Editor, irrEdit (http://www.ambiera.com/irredit/). To
- load .irr files again, see ISceneManager::loadScene().
- \param file File where the scene is saved into.
- \param userDataSerializer If you want to save some user data
- for every scene node into the file, implement the
- ISceneUserDataSerializer interface and provide it as parameter
- here. Otherwise, simply specify 0 as this parameter.
- \param node Node which is taken as the top node of the scene.
- This node and all of its descendants are saved into the scene
- file. Pass 0 or the scene manager to save the full scene (which
- is also the default).
- \return True if successful. */
- virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
- //! Saves the current scene into a file.
- /** Scene nodes with the option isDebugObject set to true are
- not being saved. The scene is usually written to an .irr file,
- an xml based format. .irr files can Be edited with the Irrlicht
- Engine Editor, irrEdit (http://www.ambiera.com/irredit/). To
- load .irr files again, see ISceneManager::loadScene().
- \param writer XMLWriter with which the scene is saved.
- \param currentPath Path which is used for relative file names.
- Usually the directory of the file written into.
- \param userDataSerializer If you want to save some user data
- for every scene node into the file, implement the
- ISceneUserDataSerializer interface and provide it as parameter
- here. Otherwise, simply specify 0 as this parameter.
- \param node Node which is taken as the top node of the scene.
- This node and all of its descendants are saved into the scene
- file. Pass 0 or the scene manager to save the full scene (which
- is also the default).
- \return True if successful. */
- virtual bool saveScene(io::IXMLWriter* writer, const io::path& currentPath, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
- //! Loads a scene. Note that the current scene is not cleared before.
- /** The scene is usually loaded from an .irr file, an xml based
- format, but other scene formats can be added to the engine via
- ISceneManager::addExternalSceneLoader. .irr files can Be edited
- with the Irrlicht Engine Editor, irrEdit
- (http://www.ambiera.com/irredit/) or saved directly by the engine
- using ISceneManager::saveScene().
- \param filename Name of the file to load from.
- \param userDataSerializer If you want to load user data
- possibily saved in that file for some scene nodes in the file,
- implement the ISceneUserDataSerializer interface and provide it
- as parameter here. Otherwise, simply specify 0 as this
- parameter.
- \param rootNode Node which is taken as the root node of the
- scene. Pass 0 to add the scene directly to the scene manager
- (which is also the default).
- \return True if successful. */
- virtual bool loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0) = 0;
- //! Loads a scene. Note that the current scene is not cleared before.
- /** The scene is usually loaded from an .irr file, an xml based
- format, but other scene formats can be added to the engine via
- ISceneManager::addExternalSceneLoader. .irr files can Be edited
- with the Irrlicht Engine Editor, irrEdit
- (http://www.ambiera.com/irredit/) or saved directly by the engine
- using ISceneManager::saveScene().
- \param file File where the scene is loaded from.
- \param userDataSerializer If you want to load user data
- saved in that file for some scene nodes in the file,
- implement the ISceneUserDataSerializer interface and provide it
- as parameter here. Otherwise, simply specify 0 as this
- parameter.
- \param rootNode Node which is taken as the root node of the
- scene. Pass 0 to add the scene directly to the scene manager
- (which is also the default).
- \return True if successful. */
- virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0) = 0;
- //! Get a mesh writer implementation if available
- /** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
- for details. */
- virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
- //! Get a skinned mesh, which is not available as header-only code
- /** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
- for details. */
- virtual ISkinnedMesh* createSkinnedMesh() = 0;
- //! Sets ambient color of the scene
- virtual void setAmbientLight(const video::SColorf &ambientColor) = 0;
- //! Get ambient color of the scene
- virtual const video::SColorf& getAmbientLight() const = 0;
- //! Register a custom callbacks manager which gets callbacks during scene rendering.
- /** \param[in] lightManager: the new callbacks manager. You may pass 0 to remove the
- current callbacks manager and restore the default behavior. */
- virtual void setLightManager(ILightManager* lightManager) = 0;
- //! Get current render pass.
- virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const =0;
- //! Set current render pass.
- virtual void setCurrentRenderPass(E_SCENE_NODE_RENDER_PASS nextPass) =0;
- //! Get current node sorting algorithm used for transparent nodes
- virtual E_TRANSPARENT_NODE_SORTING getTransparentNodeSorting() const = 0;
- //! Set the node sorting algorithm used for transparent nodes
- virtual void setTransparentNodeSorting(E_TRANSPARENT_NODE_SORTING sorting) = 0;
- //! Get an instance of a geometry creator.
- /** The geometry creator provides some helper methods to create various types of
- basic geometry. This can be useful for custom scene nodes. */
- virtual const IGeometryCreator* getGeometryCreator(void) const = 0;
- //! Check if node is culled in current view frustum
- /** Please note that depending on the used culling method this
- check can be rather coarse, or slow. A positive result is
- correct, though, i.e. if this method returns true the node is
- positively not visible. The node might still be invisible even
- if this method returns false.
- \param node The scene node which is checked for culling.
- \return True if node is not visible in the current scene, else
- false. */
- virtual bool isCulled(const ISceneNode* node) const =0;
- };
- } // end namespace scene
- } // end namespace irr
- #endif
|