OpenSceneGraph/include/osg/ImpostorSprite
Robert Osfield 84d2d01163 Added support for osg::MemoryManager which is based upon Paul Nettle's
memory manager published at flipcode.com.  This can be turned on
with the OSG_USE_MEMORY_MANGER option which then uses custom global
new and delete operators as well as provide osgNew and osgDelete macro's
which add ability to log line and file from which calls are made.

Updated osg,osgUtil,osgDB,osgText and osgPlugins/osg to use osgNew/osgDelete,
and fixed memory leaks highlighted by the new memory manager.
2002-03-26 23:52:52 +00:00

193 lines
6.6 KiB
Plaintext

//C++ header - Open Scene Graph - Copyright (C) 1998-2001 Robert Osfield
//Distributed under the terms of the GNU Library General Public License (LGPL)
//as published by the Free Software Foundation.
#ifndef OSG_ImpostorSprite
#define OSG_ImpostorSprite 1
#include <osg/Vec2>
#include <osg/BoundingSphere>
#include <osg/Drawable>
#include <osg/Camera>
#include <osg/ImpostorSprite>
#include <osg/AlphaFunc>
#include <osg/TexEnv>
namespace osg {
class Texture;
class Impostor;
class ImpostorSpriteManager;
/** An ImposterSprite is a textured quad which is rendered in place a
* 3D geometry. The ImposterSprite is generated by rendering the original
* 3D geometry to a texture as an image cache. The ImpostorSprite is
* automatically generated by the osgUtil::CullVisitor so it not
* necessary to deal with it directly.
*/
class SG_EXPORT ImpostorSprite : public Drawable
{
public:
ImpostorSprite();
/** Clone an object of the same type as an ImpostorSprite.*/
virtual Object* cloneType() const { return osgNew ImpostorSprite(); }
/** Clone on ImpostorSprite just returns a clone of type,
* since it is not appropriate to share data of an ImpostorSprite.*/
virtual Object* clone(const CopyOp&) const { return osgNew ImpostorSprite(); }
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const ImpostorSprite*>(obj)!=NULL; }
virtual const char* className() const { return "ImpostorSprite"; }
/** Set the parent, which must be an Impostor.
* Unlike conventional Drawables, ImpostorSprite's can only ever have
* one parent.
*/
void setParent(Impostor* parent) { _parent = parent; }
/** Get the parent, which is an Impostor. */
Impostor* getParent() { return _parent; }
/** Get the const parent, which is an Impostor. */
const Impostor* getParent() const { return _parent; }
/** Set the eye point for when the ImpsotorSprite was snapped.*/
inline void setStoredLocalEyePoint(const Vec3& v) { _storedLocalEyePoint=v; }
/** Get the eye point for when the ImpsotorSprite was snapped.*/
inline const Vec3& getStoredLocalEyePoint() const { return _storedLocalEyePoint; }
/** Set the frame number for when the ImpostorSprite was last used in rendering.*/
inline void setLastFrameUsed(const int frameNumber) { _lastFrameUsed = frameNumber; }
/** Get the frame number for when the ImpostorSprite was last used in rendering.*/
inline int getLastFrameUsed() const { return _lastFrameUsed; }
/** Get the coordinates of the corners of the quad.
* Stored in the order, [0] - top_left, [1] - bottom_left, [2] - bottom_right, [3] - top_left.
*/
inline Vec3* getCoords() { return _coords; }
/** Get the const coordinates of the corners of the quad.
*/
inline const Vec3* getCoords() const { return _coords; }
/** Get the texture coordinates of the corners of the quad.
* Stored in the order, [0] - top_left, [1] - bottom_left, [2] - bottom_right, [3] - top_left.
*/
inline Vec2* getTexCoords() { return _texcoords; }
/** Get the const texture coordinates of the corners of the quad.*/
inline const Vec2* getTexCoords() const { return _texcoords; }
/** Get the control coordinates of the corners of the quad.
* The control coordinates are the corners of the quad projected
* out onto the front face of bounding box which enclosed the impostor
* geometry when it was pre-rendered into the impostor sprite's texture.
* At the point of creation/or update of the impostor sprite the control
* coords will lie on top of the corners of the quad in screen space - with a pixel error
* or zero. Once the camera moves relative to the impostor sprite the
* control coords will no longer lie on top of the corners of the quad in
* screen space - a pixel error will have accumulated. This pixel error
* can then be used to determine whether the impostor needs to be updated.
* Stored in the order, [0] - top_left, [1] - bottom_left, [2] - bottom_right, [3] - top_left.
*/
inline Vec3* getControlCoords() { return _controlcoords; }
/** Get the const control coordinates of the corners of the quad.*/
inline const Vec3* getControlCoords() const { return _controlcoords; }
/** calculate the pixel error value for current camera position and object position.*/
const float calcPixelError(const Camera& camera,const Viewport& viewport,const osg::Matrix* matrix) const;
void setTexture(Texture* tex,int s,int t);
Texture* getTexture() { return _texture; }
const Texture* getTexture() const { return _texture; }
const int s() const { return _s; }
const int t() const { return _t; }
/** draw ImpostorSprite directly. */
virtual void drawImmediateMode(State& state);
bool getStats(Statistics &stat);
protected:
ImpostorSprite(const ImpostorSprite&):Drawable() {}
ImpostorSprite& operator = (const ImpostorSprite&) { return *this;}
virtual ~ImpostorSprite();
virtual const bool computeBound() const;
Impostor* _parent;
friend class osg::ImpostorSpriteManager;
// support for a double linked list managed by the
// ImposotorSpriteManager.
ImpostorSpriteManager* _ism;
ImpostorSprite* _previous;
ImpostorSprite* _next;
int _lastFrameUsed;
Vec3 _storedLocalEyePoint;
Vec3 _coords[4];
Vec2 _texcoords[4];
Vec3 _controlcoords[4];
Texture* _texture;
int _s;
int _t;
};
/** Helper class for managing the reuse of ImpostorSprite resources.*/
class SG_EXPORT ImpostorSpriteManager : public Referenced
{
public:
ImpostorSpriteManager();
const bool empty() const { return _first==0; }
ImpostorSprite* first() { return _first; }
ImpostorSprite* last() { return _last; }
void push_back(ImpostorSprite* is);
void remove(ImpostorSprite* is);
ImpostorSprite* createOrReuseImpostorSprite(int s,int t,int frameNumber);
protected:
~ImpostorSpriteManager();
ref_ptr<TexEnv> _texenv;
ref_ptr<AlphaFunc> _alphafunc;
ImpostorSprite* _first;
ImpostorSprite* _last;
};
}
#endif