mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 06:32:23 +01:00
436 lines
20 KiB
C++
436 lines
20 KiB
C++
// 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
|
|
|
|
#pragma once
|
|
|
|
#include "IReferenceCounted.h"
|
|
#include "irrArray.h"
|
|
#include "vector3d.h"
|
|
#include "dimension2d.h"
|
|
#include "SColor.h"
|
|
#include "ESceneNodeTypes.h"
|
|
#include "SceneParameters.h" // IWYU pragma: export
|
|
|
|
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,
|
|
|
|
//! This is used for sky boxes.
|
|
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 transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves).
|
|
ESNRP_GUI = 128
|
|
|
|
};
|
|
|
|
class IAnimatedMesh;
|
|
class IAnimatedMeshSceneNode;
|
|
class IBillboardSceneNode;
|
|
class ICameraSceneNode;
|
|
class IDummyTransformationSceneNode;
|
|
class IMesh;
|
|
class SkinnedMesh;
|
|
class IMeshBuffer;
|
|
class IMeshCache;
|
|
class ISceneCollisionManager;
|
|
class IMeshLoader;
|
|
class IMeshManipulator;
|
|
class IMeshSceneNode;
|
|
class ISceneNode;
|
|
class ISceneNodeFactory;
|
|
|
|
//! The Scene Manager manages scene nodes, mesh resources, cameras and all the other stuff.
|
|
/** All Scene nodes can be created only here.
|
|
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().
|
|
* If you would like to implement and add your own file format loader to Irrlicht,
|
|
* see addExternalMeshLoader().
|
|
* \param file File handle of the mesh to load.
|
|
* \return Null if failed, otherwise pointer to the mesh.
|
|
* 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;
|
|
|
|
//! 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 camera scene node to the scene graph and sets it as active camera.
|
|
/** This camera does not react on user input.
|
|
If you want to move or animate it, use 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 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 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;
|
|
|
|
//! 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;
|
|
|
|
//! 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;
|
|
|
|
//! 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;
|
|
|
|
//! 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;
|
|
|
|
//! 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;
|
|
|
|
//! 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 SkinnedMesh *createSkinnedMesh() = 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;
|
|
|
|
//! 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
|