/******************************************************************************** * * * O p e n G L O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2024 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This library 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 Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see * ********************************************************************************/ #ifndef FXGLOBJECT_H #define FXGLOBJECT_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXGLViewer; class FXGLObject; /// Basic OpenGL object class FXAPI FXGLObject : public FXObject { FXDECLARE(FXGLObject) public: enum { ID_LAST=10000 // Leaving ample room for FXGLViewer subclasses }; public: /// Constructors FXGLObject(){} /// Copy constructor FXGLObject(const FXGLObject& orig):FXObject(orig){} /// Called by the viewer to get bounds for this object virtual void bounds(FXRangef& box); /// Draw this object in a viewer virtual void draw(FXGLViewer* viewer); /// Draw this object for hit-testing purposes virtual void hit(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Identify sub-object given path virtual FXGLObject* identify(FXuint* path); /// Return true if this object can be dragged around virtual FXbool canDrag() const; /// Return true if this object can be deleted from the scene virtual FXbool canDelete() const; /// Drag this object from one position to another virtual FXbool drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty); /// Destructor virtual ~FXGLObject(){} }; /// List of GL objects typedef FXObjectListOf FXGLObjectList; /// Group object class FXAPI FXGLGroup : public FXGLObject { FXDECLARE(FXGLGroup) protected: FXGLObjectList list; // List of all objects public: /// Constructor FXGLGroup(){ } /// Copy constructor FXGLGroup(const FXGLGroup& orig):FXGLObject(orig),list(orig.list){ } /// Return list of childern FXGLObjectList& getList(){ return list; } /// Return bounding box virtual void bounds(FXRangef& box); /// Draw into viewer virtual void draw(FXGLViewer* viewer); /// Hit in viewer virtual void hit(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Identify object by means of path virtual FXGLObject* identify(FXuint* path); /// Return true if group can be dragged virtual FXbool canDrag() const; /// Drag group object virtual FXbool drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty); /// Return number of children FXival no() const { return list.no(); } /// Child at position FXGLObject* child(FXival pos) const { return list[pos]; } /// Insert child object at given position void insert(FXival pos,FXGLObject* obj){ list.insert(pos,obj); } /// Insert list of child objects at given position void insert(FXival pos,const FXGLObjectList& objs){ list.insert(pos,objs); } /// Prepend child object void prepend(FXGLObject* obj){ list.prepend(obj); } /// Prepend list of child objects at given position void prepend(const FXGLObjectList& objs){ list.prepend(objs); } /// Append child object void append(FXGLObject* obj){ list.append(obj); } /// Append list of child objects at given position void append(const FXGLObjectList& objs){ list.append(objs); } /// Replace child object void replace(FXival pos,FXGLObject* obj){ list.replace(pos,obj); } /// Remove child object void remove(FXGLObject* obj){ list.remove(obj); } /// Remove child object at given position void erase(FXival pos){ list.erase(pos); } /// Remove all children void clear(){ list.clear(); } /// Stream save and load virtual void save(FXStream& store) const; virtual void load(FXStream& store); /// Destructor virtual ~FXGLGroup(); }; } #endif