diff --git a/panda/src/gui/guiBackground.cxx b/panda/src/gui/guiBackground.cxx index 8e3710df08..393a6a20d9 100644 --- a/panda/src/gui/guiBackground.cxx +++ b/panda/src/gui/guiBackground.cxx @@ -9,10 +9,21 @@ TypeHandle GuiBackground::_type_handle; void GuiBackground::recompute_frame(void) { + _item->recompute(); + _bg->recompute(); GuiItem::recompute_frame(); } -GuiBackground::GuiBackground(const string& name) : GuiItem(name) { +GuiBackground::GuiBackground(const string& name, GuiItem* item) + : GuiItem(name), _item(item) { + _bg = GuiLabel::make_simple_card_label(); + _bg->set_depth(0.1); +} + +GuiBackground::GuiBackground(const string& name, GuiItem* item, Texture* tex) + : GuiItem(name), _item(item) { + _bg = GuiLabel::make_simple_texture_label(tex); + _bg->set_depth(0.1); } GuiBackground::~GuiBackground(void) { @@ -23,6 +34,8 @@ void GuiBackground::manage(GuiManager* mgr, EventHandler& eh) { if (!_added_hooks) _added_hooks = true; if (_mgr == (GuiManager*)0L) { + _mgr->add_label(_bg); + _item->manage(mgr, eh); GuiItem::manage(mgr, eh); } else gui_cat->warning() << "tried to manage background (0x" << (void*)this @@ -30,23 +43,31 @@ void GuiBackground::manage(GuiManager* mgr, EventHandler& eh) { } void GuiBackground::unmanage(void) { + if (_mgr != (GuiManager*)0L) { + _mgr->remove_label(_bg); + _item->unmanage(); + } GuiItem::unmanage(); } int GuiBackground::freeze(void) { - return 0; + return _item->freeze(); } int GuiBackground::thaw(void) { - return 0; + return _item->thaw(); } void GuiBackground::set_scale(float f) { + _bg->set_scale(f); + _item->set_scale(f); GuiItem::set_scale(f); recompute_frame(); } void GuiBackground::set_pos(const LVector3f& p) { + _bg->set_pos(p); + _item->set_pos(p); GuiItem::set_pos(p); recompute_frame(); } @@ -54,6 +75,7 @@ void GuiBackground::set_pos(const LVector3f& p) { void GuiBackground::output(ostream& os) const { GuiItem::output(os); os << " Background data:" << endl; - os << " item - 0x" << (void*)0L << endl; - // then output the item + os << " bg - 0x" << (void*)_bg << endl; + os << " item - 0x" << (void*)_item << endl; + os << *_item; } diff --git a/panda/src/gui/guiBackground.h b/panda/src/gui/guiBackground.h index e53e9e50f1..fd73727b12 100644 --- a/panda/src/gui/guiBackground.h +++ b/panda/src/gui/guiBackground.h @@ -11,10 +11,14 @@ class EXPCL_PANDA GuiBackground : public GuiItem { private: + PT(GuiLabel) _bg; + PT(GuiItem) _item; + INLINE GuiBackground(void); virtual void recompute_frame(void); PUBLISHED: - GuiBackground(const string&); + GuiBackground(const string&, GuiItem*); + GuiBackground(const string&, GuiItem*, Texture*); ~GuiBackground(void); virtual void manage(GuiManager*, EventHandler&); diff --git a/panda/src/gui/guiLabel.I b/panda/src/gui/guiLabel.I index eab1c39c50..5f0dd97204 100644 --- a/panda/src/gui/guiLabel.I +++ b/panda/src/gui/guiLabel.I @@ -6,13 +6,15 @@ INLINE GuiLabel::GuiLabel(void) : _type(GuiLabel::NONE), _arc((RenderRelation*)0L), _tex((Texture*)0L), - _internal((RenderRelation*)0L), _scale(1.), + _internal((RenderRelation*)0L), + _gset((Geom*)0L), _scale(1.), _pos(0., 0., 0.), _foreground(1., 1., 1., 1.), _have_background(false), _background(0., 0., 0., 0.), _have_width(false), _width(0.), - _have_height(false), _height(0.) { + _have_height(false), _height(0.), + _depth(0.) { } INLINE Node* GuiLabel::get_geometry(void) const { @@ -63,6 +65,18 @@ INLINE void GuiLabel::set_pos(const LVector3f& p) { recompute_transform(); } +INLINE void GuiLabel::set_depth(float x) { + float r = _pos.dot(_pos.right()); + float u = _pos.dot(_pos.up()); + _pos = LVector3f::rfu(r, x, u); + _depth = x; + recompute_transform(); +} + +INLINE float GuiLabel::get_depth(void) const { + return _pos.dot(_pos.forward()); +} + INLINE float GuiLabel::get_scale(void) const { return _scale; } diff --git a/panda/src/gui/guiLabel.cxx b/panda/src/gui/guiLabel.cxx index ecdc4529f1..9f5fb891ed 100644 --- a/panda/src/gui/guiLabel.cxx +++ b/panda/src/gui/guiLabel.cxx @@ -22,6 +22,7 @@ void GuiLabel::recompute_transform(void) { } break; case SIMPLE_TEXTURE: + case SIMPLE_CARD: { LMatrix4f mat = LMatrix4f::scale_mat(_scale) * LMatrix4f::translate_mat(_pos); @@ -85,6 +86,20 @@ void GuiLabel::set_properties(void) { case SIMPLE_TEXTURE: _internal->set_transition(new ColorTransition(_foreground)); break; + case SIMPLE_CARD: + _internal->set_transition(new ColorTransition(_foreground)); + { + float w, h; + w = _have_width?(_width * 0.5):0.5; + h = _have_height?(_height * 0.5):0.5; + PTA_Vertexf verts; + verts.push_back(Vertexf::rfu(-w, 0., h)); + verts.push_back(Vertexf::rfu(-w, 0., -h)); + verts.push_back(Vertexf::rfu(w, 0., h)); + verts.push_back(Vertexf::rfu(w, 0., -h)); + _gset->set_coords(verts, G_PER_VERTEX); + } + break; default: gui_cat->warning() << "recompute_transform on invalid label type (" << (int)_type << ")" << endl; @@ -150,6 +165,7 @@ GuiLabel* GuiLabel::make_simple_texture_label(Texture* texture) { uvs.push_back(TexCoordf(1., 0.)); geoset->set_texcoords(uvs, G_PER_VERTEX); n2->add_geom(geoset); + ret->_gset = geoset; return ret; } @@ -176,6 +192,30 @@ GuiLabel* GuiLabel::make_simple_text_label(const string& text, Node* font, return ret; } +GuiLabel* GuiLabel::make_simple_card_label(void) { + GuiLabel* ret = new GuiLabel(); + ret->_type = SIMPLE_CARD; + ret->_geom = new NamedNode("GUI label"); + GeomNode* n2 = new GeomNode(); + ret->_internal = new RenderRelation(ret->_geom, n2); + ret->_internal->set_transition( + new ColorTransition(Colorf(ret->_foreground))); + GeomTristrip *geoset = new GeomTristrip; + PTA_int lengths(0); + lengths.push_back(4); + PTA_Vertexf verts; + verts.push_back(Vertexf::rfu(-0.5, 0., 0.5)); + verts.push_back(Vertexf::rfu(-0.5, 0., -0.5)); + verts.push_back(Vertexf::rfu(0.5, 0., 0.5)); + verts.push_back(Vertexf::rfu(0.5, 0., -0.5)); + geoset->set_num_prims(1); + geoset->set_lengths(lengths); + geoset->set_coords(verts, G_PER_VERTEX); + n2->add_geom(geoset); + ret->_gset = geoset; + return ret; +} + int GuiLabel::freeze() { switch (_type) { case SIMPLE_TEXT: @@ -255,6 +295,14 @@ void GuiLabel::get_extents(float& l, float& r, float& b, float& t) { t = ul.dot(ul.up()); } break; + case SIMPLE_CARD: + { + l = _have_width?-(_width*0.5):-0.5; + r = _have_width?(_width*0.5):0.5; + b = _have_height?-(_height*0.5):-0.5; + t = _have_height?(_height*0.5):0.5; + } + break; default: gui_cat->warning() << "trying to get extents from something I don't know how to" << endl; @@ -311,6 +359,9 @@ void GuiLabel::set_text(const string& val) { case SIMPLE_TEXTURE: gui_cat->warning() << "tried to set text on a texture label" << endl; break; + case SIMPLE_CARD: + gui_cat->warning() << "tried to set text on a card label" << endl; + break; default: gui_cat->warning() << "trying to set text on an unknown label type (" << (int)_type << ")" << endl; diff --git a/panda/src/gui/guiLabel.h b/panda/src/gui/guiLabel.h index a810b94212..a6a2186608 100644 --- a/panda/src/gui/guiLabel.h +++ b/panda/src/gui/guiLabel.h @@ -14,6 +14,7 @@ #include #include #include +#include // label-ish behavior for GUI objects (labels, buttons, rollovers) @@ -21,12 +22,13 @@ class GuiManager; class EXPCL_PANDA GuiLabel : public TypedReferenceCount { private: - enum LabelType { NONE, SIMPLE_TEXTURE, SIMPLE_TEXT }; + enum LabelType { NONE, SIMPLE_TEXTURE, SIMPLE_TEXT, SIMPLE_CARD }; LabelType _type; PT_Node _geom; RenderRelation* _arc; PT(Texture) _tex; RenderRelation* _internal; + Geom* _gset; float _scale; LVector3f _pos; @@ -37,6 +39,7 @@ private: float _width; bool _have_height; float _height; + float _depth; INLINE Node* get_geometry(void) const; INLINE void set_arc(RenderRelation*); @@ -54,6 +57,7 @@ PUBLISHED: static GuiLabel* make_simple_texture_label(Texture*); static GuiLabel* make_simple_text_label(const string&, Node*, Texture* = (Texture*)0L); + static GuiLabel* make_simple_card_label(void); int freeze(); int thaw(); @@ -61,6 +65,7 @@ PUBLISHED: void get_extents(float&, float&, float&, float&); float get_width(void); float get_height(void); + INLINE float get_depth(void) const; INLINE void set_width(float); INLINE void set_height(float); @@ -68,6 +73,7 @@ PUBLISHED: INLINE void set_scale(float); INLINE void set_pos(float, float, float); INLINE void set_pos(const LVector3f&); + INLINE void set_depth(float); INLINE float get_scale(void) const; INLINE LVector3f get_pos(void) const;