From f77ea1fecac49c420e3473df0f9b86d58e68ef8e Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 4 Jul 2001 01:07:30 +0000 Subject: [PATCH] add bevel support --- panda/src/pgui/pgButton.cxx | 27 +++-- panda/src/pgui/pgFrameStyle.I | 19 ++- panda/src/pgui/pgFrameStyle.cxx | 201 ++++++++++++++++++++++++++++++-- panda/src/pgui/pgFrameStyle.h | 13 ++- 4 files changed, 230 insertions(+), 30 deletions(-) diff --git a/panda/src/pgui/pgButton.cxx b/panda/src/pgui/pgButton.cxx index f275262816..0e1dbc211c 100644 --- a/panda/src/pgui/pgButton.cxx +++ b/panda/src/pgui/pgButton.cxx @@ -172,28 +172,33 @@ setup(const string &label) { text_node->set_text(label); PT_Node geom = text_node->generate(); + LVecBase4f frame = text_node->get_card_actual(); + set_frame(frame[0] - 0.4, frame[1] + 0.4, frame[2] - 0.15, frame[3] + 0.15); + new RenderRelation(get_state_def(S_ready), geom); - NodeRelation *dep = new RenderRelation(get_state_def(S_depressed), geom); + new RenderRelation(get_state_def(S_depressed), geom); new RenderRelation(get_state_def(S_rollover), geom); - new RenderRelation(get_state_def(S_inactive), geom); + NodeRelation *inact = new RenderRelation(get_state_def(S_inactive), geom); PGFrameStyle style; - style.set_type(PGFrameStyle::T_flat); - style.set_color(1.0, 1.0, 1.0, 1.0); + style.set_color(0.8, 0.8, 0.8, 1.0); + style.set_width(0.1, 0.1); + + style.set_type(PGFrameStyle::T_bevel_out); set_frame_style(S_ready, style); - style.set_color(0.0, 0.0, 0.0, 1.0); - set_frame_style(S_depressed, style); - ColorTransition *col_trans = new ColorTransition(Colorf(0.0, 1.0, 1.0, 1.0)); - dep->set_transition(col_trans); - - style.set_color(1.0, 1.0, 0.0, 1.0); + style.set_color(0.9, 0.9, 0.9, 1.0); set_frame_style(S_rollover, style); + ColorTransition *col_trans = new ColorTransition(Colorf(0.8, 0.8, 0.8, 1.0)); + inact->set_transition(col_trans); style.set_color(0.6, 0.6, 0.6, 1.0); set_frame_style(S_inactive, style); - set_frame(text_node->get_card_actual()); + style.set_type(PGFrameStyle::T_bevel_in); + style.set_color(0.8, 0.8, 0.8, 1.0); + style.set_width(0.05, 0.05); + set_frame_style(S_depressed, style); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pgui/pgFrameStyle.I b/panda/src/pgui/pgFrameStyle.I index 8b367997e6..f51fa658dd 100644 --- a/panda/src/pgui/pgFrameStyle.I +++ b/panda/src/pgui/pgFrameStyle.I @@ -26,7 +26,7 @@ INLINE PGFrameStyle:: PGFrameStyle() { _type = T_none; _color.set(1.0, 1.0, 1.0, 1.0); - _width = 0.01; + _width.set(0.1, 0.1); } //////////////////////////////////////////////////////////////////// @@ -122,7 +122,20 @@ get_color() const { // units are in screen units. //////////////////////////////////////////////////////////////////// INLINE void PGFrameStyle:: -set_width(float width) { +set_width(float x, float y) { + set_width(LVecBase2f(x, y)); +} + +//////////////////////////////////////////////////////////////////// +// Function: PGFrameStyle::set_width +// Access: Published +// Description: Sets the width parameter, which has meaning only for +// certain frame types. For instance, this is the width +// of the bevel for T_bevel_in or T_bevel_out. The +// units are in screen units. +//////////////////////////////////////////////////////////////////// +INLINE void PGFrameStyle:: +set_width(const LVecBase2f &width) { _width = width; } @@ -134,7 +147,7 @@ set_width(float width) { // width of the bevel for T_bevel_in or T_bevel_out. // The units are in screen units. //////////////////////////////////////////////////////////////////// -INLINE float PGFrameStyle:: +INLINE const LVecBase2f &PGFrameStyle:: get_width() const { return _width; } diff --git a/panda/src/pgui/pgFrameStyle.cxx b/panda/src/pgui/pgFrameStyle.cxx index 358927a369..2e7fb793d2 100644 --- a/panda/src/pgui/pgFrameStyle.cxx +++ b/panda/src/pgui/pgFrameStyle.cxx @@ -18,10 +18,12 @@ #include "pgFrameStyle.h" #include "geomTristrip.h" +#include "geomTrifan.h" #include "geomNode.h" #include "transparencyProperty.h" #include "transparencyTransition.h" #include "renderRelation.h" +#include "pointerTo.h" ostream & operator << (ostream &out, PGFrameStyle::Type type) { @@ -65,24 +67,30 @@ output(ostream &out) const { NodeRelation *PGFrameStyle:: generate_into(Node *node, const LVecBase4f &frame) { NodeRelation *arc = (NodeRelation *)NULL; - PT(Geom) geom; + PT_Node gnode; switch (_type) { case T_none: return (NodeRelation *)NULL; case T_flat: - geom = generate_flat_geom(frame); + gnode = generate_flat_geom(frame); + break; + + case T_bevel_out: + gnode = generate_bevel_geom(frame, false); + break; + + case T_bevel_in: + gnode = generate_bevel_geom(frame, true); break; default: break; } - if (geom != (Geom *)NULL) { - // We've got a basic Geom; create a GeomNode for it. - PT(GeomNode) gnode = new GeomNode("frame"); - gnode->add_geom(geom); + if (gnode != (GeomNode *)NULL) { + // We've got a GeomNode. arc = new RenderRelation(node, gnode, -1); } @@ -99,12 +107,14 @@ generate_into(Node *node, const LVecBase4f &frame) { //////////////////////////////////////////////////////////////////// // Function: PGFrameStyle::generate_flat_geom // Access: Public -// Description: Generates the Geom object appropriate to a T_flat +// Description: Generates the GeomNode appropriate to a T_flat // frame. //////////////////////////////////////////////////////////////////// -PT(Geom) PGFrameStyle:: +PT_Node PGFrameStyle:: generate_flat_geom(const LVecBase4f &frame) { - PT(Geom) geom = new GeomTristrip; + PT(GeomNode) gnode = new GeomNode("flat"); + Geom *geom = new GeomTristrip; + gnode->add_geom(geom); float left = frame[0]; float right = frame[1]; @@ -129,5 +139,176 @@ generate_flat_geom(const LVecBase4f &frame) { colors.push_back(_color); geom->set_colors(colors, G_OVERALL); - return geom; + return gnode.p(); +} + +//////////////////////////////////////////////////////////////////// +// Function: PGFrameStyle::generate_bevel_geom +// Access: Public +// Description: Generates the GeomNode appropriate to a T_bevel_in or +// T_bevel_out frame. +//////////////////////////////////////////////////////////////////// +PT_Node PGFrameStyle:: +generate_bevel_geom(const LVecBase4f &frame, bool in) { + // + // Colors: + // + // + // * * * * * * * * * * * * * * * * * * * * * * * + // * * * * + // * * ctop * * + // * * * * + // * * * * * * * * * * * * * * * * * + // * * * * + // * * * * + // * cleft * _color * cright* + // * * * * + // * * * * + // * * * * * * * * * * * * * * * * * + // * * * * + // * * cbottom * * + // * * * * + // * * * * * * * * * * * * * * * * * * * * * * * + // + // + // Vertices: + // + // fan: + // 2 * * * * * * * * * * * * * * * * * * * * * 1 + // * * * + // * * * + // * * * + // 3 * * * * * * * * * * * * * 0 * + // * * * + // * * * + // * * * + // * * * + // * * * + // 4 * * * * * * * * * * * * * 5 * + // * * + // tristrip: * * + // 4 * * + // * * 6 + // * * + // * * + // * 5 + // * * + // * * + // * * + // * * + // * * + // * 3 * * * * * * * * * * * * * 1 + // * * * + // * * * + // * * * + // 2 * * * * * * * * * * * * * * * * * * * * * 0 + + PT(GeomNode) gnode = new GeomNode("bevel"); + + float left = frame[0]; + float right = frame[1]; + float bottom = frame[2]; + float top = frame[3]; + + float inner_left = left + _width[0]; + float inner_right = right - _width[0]; + float inner_bottom = bottom + _width[1]; + float inner_top = top - _width[1]; + + float left_color_scale = 1.2; + float right_color_scale = 0.8; + float bottom_color_scale = 0.7; + float top_color_scale = 1.3; + + if (in) { + right_color_scale = 1.2; + left_color_scale = 0.8; + top_color_scale = 0.7; + bottom_color_scale = 1.3; + } + + // Clamp all colors at white, and don't scale the alpha. + Colorf cleft(min(_color[0] * left_color_scale, 1.0f), + min(_color[1] * left_color_scale, 1.0f), + min(_color[2] * left_color_scale, 1.0f), + _color[3]); + + Colorf cright(min(_color[0] * right_color_scale, 1.0f), + min(_color[1] * right_color_scale, 1.0f), + min(_color[2] * right_color_scale, 1.0f), + _color[3]); + + Colorf cbottom(min(_color[0] * bottom_color_scale, 1.0f), + min(_color[1] * bottom_color_scale, 1.0f), + min(_color[2] * bottom_color_scale, 1.0f), + _color[3]); + + Colorf ctop(min(_color[0] * top_color_scale, 1.0f), + min(_color[1] * top_color_scale, 1.0f), + min(_color[2] * top_color_scale, 1.0f), + _color[3]); + + { + // First, the fan. + Geom *geom = new GeomTrifan; + gnode->add_geom(geom); + + PTA_int lengths(0); + lengths.push_back(8); + + PTA_Vertexf verts; + verts.push_back(Vertexf(inner_right, 0.0, inner_top)); + verts.push_back(Vertexf(right, 0.0, top)); + verts.push_back(Vertexf(left, 0.0, top)); + verts.push_back(Vertexf(inner_left, 0.0, inner_top)); + verts.push_back(Vertexf(inner_left, 0.0, inner_bottom)); + verts.push_back(Vertexf(inner_right, 0.0, inner_bottom)); + verts.push_back(Vertexf(right, 0.0, bottom)); + verts.push_back(Vertexf(right, 0.0, top)); + + geom->set_num_prims(1); + geom->set_lengths(lengths); + + geom->set_coords(verts, G_PER_VERTEX); + + PTA_Colorf colors; + colors.push_back(ctop); + colors.push_back(ctop); + colors.push_back(_color); + colors.push_back(_color); + colors.push_back(cright); + colors.push_back(cright); + geom->set_colors(colors, G_PER_COMPONENT); + } + + { + // Now, the strip. + Geom *geom = new GeomTristrip; + gnode->add_geom(geom); + + PTA_int lengths(0); + lengths.push_back(6); + + PTA_Vertexf verts; + verts.push_back(Vertexf(right, 0.0, bottom)); + verts.push_back(Vertexf(inner_right, 0.0, inner_bottom)); + verts.push_back(Vertexf(left, 0.0, bottom)); + verts.push_back(Vertexf(inner_left, 0.0, inner_bottom)); + verts.push_back(Vertexf(left, 0.0, top)); + verts.push_back(Vertexf(inner_left, 0.0, inner_top)); + + geom->set_num_prims(1); + geom->set_lengths(lengths); + + geom->set_coords(verts, G_PER_VERTEX); + + PTA_Colorf colors; + colors.push_back(cbottom); + colors.push_back(cbottom); + colors.push_back(cleft); + colors.push_back(cleft); + geom->set_colors(colors, G_PER_COMPONENT); + } + + return gnode.p(); } diff --git a/panda/src/pgui/pgFrameStyle.h b/panda/src/pgui/pgFrameStyle.h index f5aa2d7985..89a55eab9f 100644 --- a/panda/src/pgui/pgFrameStyle.h +++ b/panda/src/pgui/pgFrameStyle.h @@ -22,8 +22,7 @@ #include "pandabase.h" #include "luse.h" -#include "geom.h" -#include "pointerTo.h" +#include "pt_Node.h" class NodeRelation; class Node; @@ -54,8 +53,9 @@ PUBLISHED: INLINE void set_color(const Colorf &color); INLINE const Colorf &get_color() const; - INLINE void set_width(float width); - INLINE float get_width() const; + INLINE void set_width(float x, float y); + INLINE void set_width(const LVecBase2f &width); + INLINE const LVecBase2f &get_width() const; void output(ostream &out) const; @@ -63,12 +63,13 @@ public: NodeRelation *generate_into(Node *node, const LVecBase4f &frame); private: - PT(Geom) generate_flat_geom(const LVecBase4f &frame); + PT_Node generate_flat_geom(const LVecBase4f &frame); + PT_Node generate_bevel_geom(const LVecBase4f &frame, bool in); private: Type _type; Colorf _color; - float _width; + LVecBase2f _width; }; INLINE ostream &operator << (ostream &out, const PGFrameStyle &pfs);