leocad/common/object.h
2011-09-07 21:06:51 +00:00

213 lines
5.4 KiB
C++
Executable file

#ifndef _OBJECT_H_
#define _OBJECT_H_
class File;
class Matrix;
class Object;
/*
#define LC_OBJECT_NAME_LEN 80
#define LC_OBJECT_HIDDEN 0x01
#define LC_OBJECT_SELECTED 0x02
#define LC_OBJECT_FOCUSED 0x04
*/
typedef enum
{
LC_OBJECT_PIECE,
LC_OBJECT_CAMERA,
LC_OBJECT_CAMERA_TARGET,
LC_OBJECT_LIGHT,
LC_OBJECT_LIGHT_TARGET,
LC_OBJECT_CURVE,
LC_OBJECT_CURVE_POINT,
// LC_OBJECT_GROUP,
// LC_OBJECT_GROUP_PIVOT,
} LC_OBJECT_TYPE;
// key handling
typedef struct LC_OBJECT_KEY
{
unsigned short time;
float param[4];
unsigned char type;
LC_OBJECT_KEY* next;
} LC_OBJECT_KEY;
typedef struct
{
const char *description;
unsigned char size; // number of floats
unsigned char type;
} LC_OBJECT_KEY_INFO;
// rendering parameters
typedef struct
{
bool lighting;
bool edges;
float fLineWidth;
unsigned char lastcolor;
bool transparent;
} LC_RENDER_INFO;
// Callback "closure" struct, used to make the necessary parameters known to
// the callback function.
typedef struct LC_CLICKLINE
{
float a1, b1, c1;
float a2, b2, c2;
float mindist;
Object *pClosest;
double PointDistance (float *point);
} LC_CLICKLINE;
class Object
{
public:
Object (LC_OBJECT_TYPE nType);
virtual ~Object ();
public:
// Move the object.
virtual void Move(unsigned short nTime, bool bAnimation, bool bAddKey, float dx, float dy, float dz) = 0;
// Check if the object intersects the ray.
virtual void MinIntersectDist(LC_CLICKLINE* pLine) = 0;
// bSelecting is the action (add/remove), bFocus means "add focus if selecting"
// or "remove focus only if deselecting", bMultiple = Ctrl key is down
virtual void Select(bool bSelecting, bool bFocus, bool bMultiple) = 0;
// Check if the object intersects the volume specified by a given set of planes.
virtual bool IntersectsVolume(const class Vector4* Planes, int NumPlanes) = 0;
/*
virtual void UpdatePosition (unsigned short nTime, bool bAnimation) = 0;
virtual void CompareBoundingBox (float *box) { };
virtual void Render (LC_RENDER_INFO* pInfo) = 0;
// Query functions
virtual bool IsSelected () const
{ return (m_nState & LC_OBJECT_SELECTED) != 0; };
virtual bool IsFocused () const
{ return (m_nState & LC_OBJECT_FOCUSED) != 0; };
virtual bool IsVisible (unsigned short nTime, bool bAnimation) const
{ return (m_nState & LC_OBJECT_HIDDEN) == 0; }
const char* GetName() const
{ return m_strName; }
// State change, most classes will have to replace these functions
virtual void SetSelection (bool bSelect, void *pParam = NULL)
{
if (bSelect)
m_nState |= LC_OBJECT_SELECTED;
else
m_nState &= ~(LC_OBJECT_SELECTED | LC_OBJECT_FOCUSED);
};
virtual void SetFocus (bool bFocus, void *pParam = NULL)
{
if (bFocus)
m_nState |= (LC_OBJECT_SELECTED | LC_OBJECT_FOCUSED);
else
m_nState &= ~LC_OBJECT_FOCUSED;
};
virtual void SetVisible (bool bVisible)
{
if (bVisible)
m_nState &= ~LC_OBJECT_HIDDEN;
else
{
m_nState |= LC_OBJECT_HIDDEN;
SetSelection (false, NULL);
}
}
virtual bool SetColor (int nColor)
{ return false; };
*/
// determine the object type
bool IsPiece () const
{ return m_nObjectType == LC_OBJECT_PIECE; }
bool IsCamera () const
{ return m_nObjectType == LC_OBJECT_CAMERA; }
bool IsLight () const
{ return m_nObjectType == LC_OBJECT_LIGHT; }
bool IsCurve () const
{ return m_nObjectType == LC_OBJECT_CURVE; }
LC_OBJECT_TYPE GetType () const
{ return m_nObjectType; }
virtual const char* GetName() const = 0;
/*
// For linked lists
Object* m_pNext;
Object* m_pNextRender;
Object* m_pParent;
Object* GetTopAncestor () const
{ return m_pParent ? m_pParent->GetTopAncestor () : this; }
*/
protected:
// Str m_strName;
// unsigned char m_nState;
virtual bool FileLoad (File& file);
virtual void FileSave (File& file) const;
// Key handling stuff
public:
void CalculateSingleKey (unsigned short nTime, bool bAnimation, int keytype, float *value) const;
void ChangeKey (unsigned short time, bool animation, bool addkey, const float *param, unsigned char keytype);
virtual void InsertTime (unsigned short start, bool animation, unsigned short time);
virtual void RemoveTime (unsigned short start, bool animation, unsigned short time);
int GetKeyTypeCount () const
{ return m_nKeyInfoCount; }
const LC_OBJECT_KEY_INFO* GetKeyTypeInfo (int index) const
{ return &m_pKeyInfo[index]; };
const float* GetKeyTypeValue (int index) const
{ return m_pKeyValues[index]; };
protected:
void RegisterKeys (float *values[], LC_OBJECT_KEY_INFO* info, int count);
void CalculateKeys (unsigned short nTime, bool bAnimation);
private:
void RemoveKeys ();
LC_OBJECT_KEY* m_pAnimationKeys;
LC_OBJECT_KEY* m_pInstructionKeys;
float **m_pKeyValues;
LC_OBJECT_KEY_INFO *m_pKeyInfo;
int m_nKeyInfoCount;
// Bounding box stuff
protected:
double BoundingBoxIntersectDist (LC_CLICKLINE* pLine) const;
void BoundingBoxCalculate (float pos[3]);
void BoundingBoxCalculate (Matrix *mat);
void BoundingBoxCalculate (Matrix *mat, float Dimensions[6]);
private:
bool BoundingBoxIntersectionbyLine (double a1, double b1, double c1, double a2, double b2, double c2,
double *x, double *y, double *z) const;
bool BoundingBoxPointInside (double x, double y, double z) const;
float m_fBoxPlanes[4][6];
// Object type
private:
LC_OBJECT_TYPE m_nObjectType;
};
#endif