1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-27 07:06:00 +00:00
Aquaria/BBGE/RenderObject.h

368 lines
8.5 KiB
C
Raw Normal View History

/*
Copyright (C) 2007, 2010 - Bit-Blot
This file is part of Aquaria.
Aquaria is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __render_object__
#define __render_object__
#include "Base.h"
#include "Texture.h"
#include "Flags.h"
Script interface improvements & extensions. - Pointer typechecks are now enabled by default. - enabled all script warnings for non-FULL or DEMO builds by default - Added generic obj_* functions that operate on any type of RenderObject. These give quite low-level control about the renderer, and are quite dangerous too. Subsequently, many functions sharing the same code (*_setPosition, for example) could be removed, and simply call the generic functions after a type check. - Added interface function deathNotify(). The original logic of death notifiers was never used, so i thought i'd make use of it. This is useful in scripts to safely drop dangling pointers. - removed sendEntityMessage, entity_setCollideWithAvatar, entity_setTouchDamage, which were essentially no-ops. - Replaced all unnecessary luaReturnNum(0) and luaReturnInt(0), now it does only push a return value on the stack if the function is actually supposed to have a retun value. - Allow variadic calling of entity_msg(). Now any parameters can be passed to the function, and the target entity will receive all of them. Any values returned from the entity's msg() callback will be returned by entity_msg() to the original caller. This allows nice RPC-like entity communication. - fixed possible crash in debugLog, bone_update, entity_debugText - added an override function for loadfile() that is case-insensitive like dofile() - entity_createEntity returns the created entity now - spawnParticleEffect returns the associated RenderObject - Added some text rendering functions - Added beam_setFirer() - removed the underflow check in avatar_decrLeaches() I added earlier - added a panic function for Lua. - added the Lua debug library - fixed a stupid typo in ScriptObject::isType() that made the type checks a lot less accurate - misc stuff I forgot
2012-02-05 19:22:54 +00:00
#include "ScriptObject.h"
class Core;
class StateData;
enum RenderObjectFlags
{
RO_CLEAR = 0x00,
RO_RENDERBORDERS = 0x01,
RO_NEXT = 0x02,
RO_MOTIONBLUR = 0x04
};
enum AutoSize
{
AUTO_VIRTUALWIDTH = -101,
AUTO_VIRTUALHEIGHT = -102
};
enum ParentManaged
{
PM_NONE = 0,
PM_POINTER = 1,
PM_STATIC = 2
};
enum ChildOrder
{
CHILD_BACK = 0,
CHILD_FRONT = 1
};
enum RenderBeforeParent
{
RBP_NONE = -1,
RBP_OFF = 0,
RBP_ON = 1
};
struct MotionBlurFrame
{
Vector position;
float rotz;
};
typedef std::vector<RectShape> CollideRects;
class RenderObjectLayer;
Script interface improvements & extensions. - Pointer typechecks are now enabled by default. - enabled all script warnings for non-FULL or DEMO builds by default - Added generic obj_* functions that operate on any type of RenderObject. These give quite low-level control about the renderer, and are quite dangerous too. Subsequently, many functions sharing the same code (*_setPosition, for example) could be removed, and simply call the generic functions after a type check. - Added interface function deathNotify(). The original logic of death notifiers was never used, so i thought i'd make use of it. This is useful in scripts to safely drop dangling pointers. - removed sendEntityMessage, entity_setCollideWithAvatar, entity_setTouchDamage, which were essentially no-ops. - Replaced all unnecessary luaReturnNum(0) and luaReturnInt(0), now it does only push a return value on the stack if the function is actually supposed to have a retun value. - Allow variadic calling of entity_msg(). Now any parameters can be passed to the function, and the target entity will receive all of them. Any values returned from the entity's msg() callback will be returned by entity_msg() to the original caller. This allows nice RPC-like entity communication. - fixed possible crash in debugLog, bone_update, entity_debugText - added an override function for loadfile() that is case-insensitive like dofile() - entity_createEntity returns the created entity now - spawnParticleEffect returns the associated RenderObject - Added some text rendering functions - Added beam_setFirer() - removed the underflow check in avatar_decrLeaches() I added earlier - added a panic function for Lua. - added the Lua debug library - fixed a stupid typo in ScriptObject::isType() that made the type checks a lot less accurate - misc stuff I forgot
2012-02-05 19:22:54 +00:00
class RenderObject : public ScriptObject
{
public:
friend class Core;
RenderObject();
virtual ~RenderObject();
virtual void render();
static RenderObjectLayer *rlayer;
enum AddRefChoice { NO_ADD_REF = 0, ADD_REF = 1};
void setTexturePointer(Texture *t, AddRefChoice addRefChoice)
{
this->texture = t;
if (addRefChoice == ADD_REF)
texture->addRef();
onSetTexture();
}
void setStateDataObject(StateData *state);
void setTexture(const std::string &name);
void toggleAlpha(float t = 0.2);
void matrixChain();
virtual void update(float dt);
bool isDead() const {return _dead;}
bool isHidden() const {return _hidden || (parent && parent->isHidden());}
bool isStatic() const {return _static;}
// Set whether the object is hidden. If hidden, no updates (except
// lifetime checks) or render operations will be performed, and no
// child objects will be updated or rendered.
void setHidden(bool hidden) {_hidden = hidden;}
// Set whether the object is static. If static, the object's data
// (including position, scale, rotation, color, etc.) are assumed
// not to change over the lifetime of the object, to allow for
// optimized rendering.
void setStatic(bool staticFlag) {_static = staticFlag;}
void setLife(float life)
{
maxLife = this->life = life;
}
void setDecayRate(float decayRate)
{
this->decayRate = decayRate;
}
void setBlendType (int bt)
{
blendType = bt;
}
//enum DestroyType { RANDOM=0, REMOVE_STATE };
virtual void destroy();
virtual void flipHorizontal();
virtual void flipVertical();
bool isfh() { return _fh; }
bool isfv() { return _fv; }
// recursive
bool isfhr();
bool isfvr();
int getIdx() const { return idx; }
void setIdx(int idx) { this->idx = idx; }
void moveToFront();
void moveToBack();
inline float getCullRadiusSqr() const
{
if (overrideCullRadiusSqr)
return overrideCullRadiusSqr;
if (width == 0 || height == 0)
return 0;
const float w = width*scale.x;
const float h = height*scale.y;
return w*w + h*h;
}
int getTopLayer();
void setColorMult(const Vector &color, const float alpha);
void clearColorMult();
void enableMotionBlur(int sz=10, int off=5);
void disableMotionBlur();
void addChild(RenderObject *r, ParentManaged pm, RenderBeforeParent rbp = RBP_NONE, ChildOrder order = CHILD_BACK);
void removeChild(RenderObject *r);
void removeAllChildren();
void recursivelyRemoveEveryChild();
Vector getRealPosition();
Vector getRealScale();
virtual float getSortDepth();
StateData *getStateData();
void setPositionSnapTo(InterpolatedVector *positionSnapTo);
// HACK: This is defined in RenderObject_inline.h because it needs
// the class Core definition. --achurch
inline bool isOnScreen();
bool isCoordinateInRadius(const Vector &pos, float r);
void copyProperties(RenderObject *target);
const RenderObject &operator=(const RenderObject &r);
void toggleCull(bool value);
void safeKill();
void enqueueChildDeletion(RenderObject *r);
Vector getWorldPosition();
Vector getWorldCollidePosition(const Vector &vec=Vector(0,0,0));
Vector getInvRotPosition(const Vector &vec);
bool isPieceFlippedHorizontal();
RenderObject *getTopParent();
virtual void onAnimationKeyPassed(int key){}
Vector getAbsoluteRotation();
float getWorldRotation();
Vector getWorldPositionAndRotation(); // more efficient shortcut, returns rotation in vector z component
Vector getNormal();
Vector getForward();
void setOverrideCullRadius(float ovr);
void setRenderPass(int pass) { renderPass = pass; }
int getRenderPass() { return renderPass; }
void setOverrideRenderPass(int pass) { overrideRenderPass = pass; }
int getOverrideRenderPass() { return overrideRenderPass; }
enum { RENDER_ALL=314, OVERRIDE_NONE=315 };
// Defined in RenderObject_inline.h
inline Vector getFollowCameraPosition() const;
void lookAt(const Vector &pos, float t, float minAngle, float maxAngle, float offset=0);
inline RenderObject *getParent() const {return parent;}
void applyBlendType();
void fhTo(bool fh);
void addDeathNotify(RenderObject *r);
virtual void unloadDevice();
virtual void reloadDevice();
Vector getCollisionMaskNormal(int index);
//-------------------------------- Methods above, fields below
static bool renderCollisionShape;
static bool renderPaths;
static int lastTextureApplied;
static bool lastTextureRepeat;
float width, height; // Only used by Quads, but stored here for getCullRadius()
InterpolatedVector position, scale, color, alpha, rotation;
InterpolatedVector offset, rotationOffset, internalOffset, beforeScaleOffset;
InterpolatedVector velocity, gravity;
Texture *texture;
//int mode;
bool fadeAlphaWithLife;
bool blendEnabled;
enum BlendTypes { BLEND_DEFAULT = 0, BLEND_ADD, BLEND_SUB, BLEND_MULT };
unsigned char blendType;
float life;
//float lifeAlphaFadeMultiplier;
float followCamera;
//bool useColor;
bool renderBeforeParent;
bool updateAfterParent;
//bool followXOnly;
//bool renderOrigin;
//float updateMultiplier;
//EventPtr deathEvent;
bool colorIsSaved; // Used for both color and alpha
Vector savedColor; // Saved values from setColorMult()
float savedAlpha;
bool shareAlphaWithChildren;
bool shareColorWithChildren;
bool cull;
int updateCull;
int layer;
InterpolatedVector *positionSnapTo;
//DestroyType destroyType;
typedef std::list<RenderObject*> Children;
Children children, childGarbage;
//Flags flags;
#ifdef BBGE_BUILD_DIRECTX
bool useDXTransform;
//D3DXMATRIX matrix;
#endif
2013-07-20 18:17:57 +00:00
float collideRadius;
Vector collidePosition;
std::vector<Vector> collisionMask;
std::vector<Vector> transformedCollisionMask;
CollideRects collisionRects;
2013-07-20 18:17:57 +00:00
float collisionMaskRadius;
float alphaMod;
bool ignoreUpdate;
bool useOldDT;
protected:
virtual void onFH(){}
virtual void onFV(){}
virtual void onDestroy(){}
virtual void onSetTexture(){}
virtual void onRender(){}
virtual void onUpdate(float dt);
virtual void deathNotify(RenderObject *r);
virtual void onEndOfLife() {}
// spread parentManagedStatic flag to the entire child tree
void propogateParentManagedStatic();
void propogateAlpha();
inline void updateLife(float dt)
{
if (decayRate > 0)
{
life -= decayRate*dt;
if (life<=0)
{
safeKill();
}
}
if (fadeAlphaWithLife && !alpha.isInterpolating())
{
//alpha = ((life*lifeAlphaFadeMultiplier)/maxLife);
alpha = life/maxLife;
}
}
// Is this object or any of its children rendered in pass "pass"?
bool hasRenderPass(const int pass);
inline void renderCall();
void renderCollision();
bool repeatTexture;
//ParentManaged pm;
unsigned char pm; // unsigned char to save space
typedef std::list<RenderObject*> RenderObjectList;
RenderObjectList deathNotifications;
int overrideRenderPass;
int renderPass;
float overrideCullRadiusSqr;
float motionBlurTransitionTimer;
int motionBlurFrameOffsetCounter, motionBlurFrameOffset;
std::vector<MotionBlurFrame>motionBlurPositions;
bool motionBlur, motionBlurTransition;
bool _dead;
bool _hidden;
bool _static;
bool _fv, _fh;
//bool rotateFirst;
int idx;
RenderObject *parent;
StateData *stateData;
float decayRate;
float maxLife;
};
#endif