diff --git a/direct/src/gui/DirectGuiBase.py b/direct/src/gui/DirectGuiBase.py index 64375d0fcd..49113e5698 100644 --- a/direct/src/gui/DirectGuiBase.py +++ b/direct/src/gui/DirectGuiBase.py @@ -700,6 +700,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath): # Widget's frame characteristics ('relief', DGG.FLAT, self.setRelief), ('borderWidth', (.1, .1), self.setBorderWidth), + ('borderUvWidth', (.1, .1), self.setBorderUvWidth), ('frameSize', None, self.setFrameSize), ('frameColor', (.8, .8, .8, 1), self.setFrameColor), ('frameTexture', None, self.setFrameTexture), @@ -1028,6 +1029,12 @@ class DirectGuiWidget(DirectGuiBase, NodePath): self.frameStyle[i].setWidth(width[0], width[1]) self.updateFrameStyle() + def setBorderUvWidth(self): + uvWidth = self['borderUvWidth'] + for i in range(self['numStates']): + self.frameStyle[i].setUvWidth(uvWidth[0], uvWidth[1]) + self.updateFrameStyle() + def destroy(self): if hasattr(self, "frameStyle"): if __dev__: diff --git a/direct/src/gui/DirectGuiGlobals.py b/direct/src/gui/DirectGuiGlobals.py index f4bb23ac4e..ba6de56013 100644 --- a/direct/src/gui/DirectGuiGlobals.py +++ b/direct/src/gui/DirectGuiGlobals.py @@ -37,9 +37,11 @@ RAISED = PGFrameStyle.TBevelOut SUNKEN = PGFrameStyle.TBevelIn GROOVE = PGFrameStyle.TGroove RIDGE = PGFrameStyle.TRidge +TEXTUREBORDER = PGFrameStyle.TTextureBorder FrameStyleDict = {'flat': FLAT, 'raised': RAISED, 'sunken': SUNKEN, - 'groove': GROOVE, 'ridge': RIDGE + 'groove': GROOVE, 'ridge': RIDGE, + 'texture_border': TEXTUREBORDER, } # Orientation of DirectSlider and DirectScrollBar diff --git a/panda/src/pgui/pgFrameStyle.I b/panda/src/pgui/pgFrameStyle.I index 10fe4fa0c7..107426d36c 100644 --- a/panda/src/pgui/pgFrameStyle.I +++ b/panda/src/pgui/pgFrameStyle.I @@ -23,6 +23,7 @@ PGFrameStyle() { _type = T_none; _color.set(1.0f, 1.0f, 1.0f, 1.0f); _width.set(0.1f, 0.1f); + _uv_width.set(0.1f, 0.1f); _visible_scale.set(1.0f, 1.0f); } @@ -37,6 +38,7 @@ PGFrameStyle(const PGFrameStyle ©) : _color(copy._color), _texture(copy._texture), _width(copy._width), + _uv_width(copy._uv_width), _visible_scale(copy._visible_scale) { } @@ -52,6 +54,7 @@ operator = (const PGFrameStyle ©) { _color = copy._color; _texture = copy._texture; _width = copy._width; + _uv_width = copy._uv_width; _visible_scale = copy._visible_scale; } @@ -196,6 +199,42 @@ get_width() const { return _width; } +//////////////////////////////////////////////////////////////////// +// Function: PGFrameStyle::set_uv_width +// Access: Published +// Description: Sets the uv_width parameter, which indicates the +// amount of the texture that is consumed by the inner +// bevel--the width in texture space of the amount +// indicated by set_width. +//////////////////////////////////////////////////////////////////// +INLINE void PGFrameStyle:: +set_uv_width(float u, float v) { + set_uv_width(LVecBase2f(u, v)); +} + +//////////////////////////////////////////////////////////////////// +// Function: PGFrameStyle::set_uv_width +// Access: Published +// Description: Sets the uv_width parameter, which indicates the +// amount of the texture that is consumed by the inner +// bevel--the width in texture space of the amount +// indicated by set_width. +//////////////////////////////////////////////////////////////////// +INLINE void PGFrameStyle:: +set_uv_width(const LVecBase2f &uv_width) { + _uv_width = uv_width; +} + +//////////////////////////////////////////////////////////////////// +// Function: PGFrameStyle::get_uv_width +// Access: Published +// Description: See set_uv_width(). +//////////////////////////////////////////////////////////////////// +INLINE const LVecBase2f &PGFrameStyle:: +get_uv_width() const { + return _uv_width; +} + //////////////////////////////////////////////////////////////////// // Function: PGFrameStyle::set_visible_scale // Access: Published diff --git a/panda/src/pgui/pgFrameStyle.cxx b/panda/src/pgui/pgFrameStyle.cxx index 82efa8be22..e34b68849c 100644 --- a/panda/src/pgui/pgFrameStyle.cxx +++ b/panda/src/pgui/pgFrameStyle.cxx @@ -52,6 +52,9 @@ operator << (ostream &out, PGFrameStyle::Type type) { case PGFrameStyle::T_ridge: return out << "ridge"; + + case PGFrameStyle::T_texture_border: + return out << "texture_border"; } return out << "**unknown(" << (int)type << ")**"; @@ -138,6 +141,7 @@ xform(const LMatrix4f &mat) { case T_bevel_in: case T_groove: case T_ridge: + case T_texture_border: return true; } @@ -177,11 +181,11 @@ generate_into(const NodePath &parent, const LVecBase4f &frame, break; case T_bevel_out: - new_node = generate_bevel_geom(scaled_frame, false); + new_node = generate_bevel_geom(scaled_frame, false, false); break; case T_bevel_in: - new_node = generate_bevel_geom(scaled_frame, true); + new_node = generate_bevel_geom(scaled_frame, true, false); break; case T_groove: @@ -192,6 +196,10 @@ generate_into(const NodePath &parent, const LVecBase4f &frame, new_node = generate_groove_geom(scaled_frame, false); break; + case T_texture_border: + new_node = generate_bevel_geom(scaled_frame, false, true); + break; + default: break; } @@ -271,11 +279,11 @@ generate_flat_geom(const LVecBase4f &frame) { //////////////////////////////////////////////////////////////////// // Function: PGFrameStyle::generate_bevel_geom // Access: Private -// Description: Generates the GeomNode appropriate to a T_bevel_in or -// T_bevel_out frame. +// Description: Generates the GeomNode appropriate to a T_bevel_in, +// T_bevel_out, or T_texture_border frame. //////////////////////////////////////////////////////////////////// PT(PandaNode) PGFrameStyle:: -generate_bevel_geom(const LVecBase4f &frame, bool in) { +generate_bevel_geom(const LVecBase4f &frame, bool in, bool flat_color) { // // Colors: // @@ -356,6 +364,12 @@ generate_bevel_geom(const LVecBase4f &frame, bool in) { top_color_scale = 0.7; bottom_color_scale = 1.3; } + if (flat_color) { + left_color_scale = 1.0; + right_color_scale = 1.0; + bottom_color_scale = 1.0; + top_color_scale = 1.0; + } // Clamp all colors at white, and don't scale the alpha. Colorf cleft(min(_color[0] * left_color_scale, 1.0f), @@ -378,7 +392,13 @@ generate_bevel_geom(const LVecBase4f &frame, bool in) { min(_color[2] * top_color_scale, 1.0f), _color[3]); - CPT(GeomVertexFormat) format = GeomVertexFormat::get_v3cp(); + CPT(GeomVertexFormat) format; + if (has_texture()) { + format = GeomVertexFormat::get_v3cpt2(); + } else { + format = GeomVertexFormat::get_v3cp(); + } + PT(GeomVertexData) vdata = new GeomVertexData ("PGFrame", format, Geom::UH_static); @@ -423,18 +443,55 @@ generate_bevel_geom(const LVecBase4f &frame, bool in) { strip->add_next_vertices(6); strip->close_primitive(); - strip->set_shade_model(Geom::SM_flat_last_vertex); - + + if (!flat_color) { + strip->set_shade_model(Geom::SM_flat_last_vertex); + } + + if (has_texture()) { + // Generate UV's. + float left = uv_range[0]; + float right = uv_range[1]; + float bottom = uv_range[2]; + float top = uv_range[3]; + float inner_left = left + _uv_width[0]; + float inner_right = right - _uv_width[0]; + float inner_bottom = bottom + _uv_width[1]; + float inner_top = top - _uv_width[1]; + + GeomVertexWriter texcoord(vdata, InternalName::get_texcoord()); + texcoord.add_data2f(right, bottom); + texcoord.add_data2f(inner_right, inner_bottom); + texcoord.add_data2f(left, bottom); + texcoord.add_data2f(inner_left, inner_bottom); + texcoord.add_data2f(left, top); + texcoord.add_data2f(inner_left, inner_top); + texcoord.add_data2f(right, top); + texcoord.add_data2f(inner_right, inner_top); + + texcoord.add_data2f(right, bottom); + texcoord.add_data2f(right, top); + texcoord.add_data2f(inner_right, inner_bottom); + texcoord.add_data2f(inner_right, inner_top); + texcoord.add_data2f(inner_left, inner_bottom); + texcoord.add_data2f(inner_left, inner_top); + } + vdata->write(cerr); PT(Geom) geom = new Geom(vdata); geom->add_primitive(strip); - CPT(RenderState) state = RenderState::make(ShadeModelAttrib::make(ShadeModelAttrib::M_flat), - ColorAttrib::make_vertex()); + CPT(RenderState) state; + if (flat_color) { + state = RenderState::make(ColorAttrib::make_flat(_color)); + } else { + state = RenderState::make(ShadeModelAttrib::make(ShadeModelAttrib::M_flat), + ColorAttrib::make_vertex()); + } + if (has_texture()) { + state = state->set_attrib(TextureAttrib::make(get_texture())); + } gnode->add_geom(geom, state); - // For now, beveled and grooved geoms don't support textures. Easy - // to add if anyone really wants this. - return gnode.p(); } diff --git a/panda/src/pgui/pgFrameStyle.h b/panda/src/pgui/pgFrameStyle.h index b46322c997..af15a3e107 100644 --- a/panda/src/pgui/pgFrameStyle.h +++ b/panda/src/pgui/pgFrameStyle.h @@ -42,7 +42,8 @@ PUBLISHED: T_bevel_out, T_bevel_in, T_groove, - T_ridge + T_ridge, + T_texture_border }; INLINE void set_type(Type type); @@ -61,6 +62,10 @@ PUBLISHED: INLINE void set_width(const LVecBase2f &width); INLINE const LVecBase2f &get_width() const; + INLINE void set_uv_width(float u, float v); + INLINE void set_uv_width(const LVecBase2f &uv_width); + INLINE const LVecBase2f &get_uv_width() const; + INLINE void set_visible_scale(float x, float y); INLINE void set_visible_scale(const LVecBase2f &visible_scale); INLINE const LVecBase2f &get_visible_scale() const; @@ -76,7 +81,7 @@ public: private: PT(PandaNode) generate_flat_geom(const LVecBase4f &frame); - PT(PandaNode) generate_bevel_geom(const LVecBase4f &frame, bool in); + PT(PandaNode) generate_bevel_geom(const LVecBase4f &frame, bool in, bool flat_color); PT(PandaNode) generate_groove_geom(const LVecBase4f &frame, bool in); private: @@ -84,6 +89,7 @@ private: Colorf _color; PT(Texture) _texture; LVecBase2f _width; + LVecBase2f _uv_width; LVecBase2f _visible_scale; };