mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
texture label support
This commit is contained in:
parent
d2e0d89785
commit
7ecb711db6
@ -4,7 +4,9 @@
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
INLINE GuiLabel::GuiLabel(void) : _type(GuiLabel::NONE), _scale(1.),
|
INLINE GuiLabel::GuiLabel(void) : _type(GuiLabel::NONE), _scale(1.),
|
||||||
_pos(0., 0., 0.) {
|
_pos(0., 0., 0.), _tex((Texture*)0L),
|
||||||
|
_arc((RenderRelation*)0L),
|
||||||
|
_internal((RenderRelation*)0L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE Node* GuiLabel::get_geometry(void) const {
|
INLINE Node* GuiLabel::get_geometry(void) const {
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "guiLabel.h"
|
#include "guiLabel.h"
|
||||||
|
|
||||||
#include <textNode.h>
|
#include <textNode.h>
|
||||||
|
#include <transformTransition.h>
|
||||||
|
|
||||||
void GuiLabel::recompute_transform(void) {
|
void GuiLabel::recompute_transform(void) {
|
||||||
switch (_type) {
|
switch (_type) {
|
||||||
@ -17,6 +18,13 @@ void GuiLabel::recompute_transform(void) {
|
|||||||
n->set_transform(mat);
|
n->set_transform(mat);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SIMPLE_TEXTURE:
|
||||||
|
{
|
||||||
|
LMatrix4f mat = LMatrix4f::scale_mat(_scale) *
|
||||||
|
LMatrix4f::translate_mat(_pos);
|
||||||
|
_internal->set_transition(new TransformTransition(mat));
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gui_cat->warning() << "recompute_transform on invalid label type ("
|
gui_cat->warning() << "recompute_transform on invalid label type ("
|
||||||
<< _type << ")" << endl;
|
<< _type << ")" << endl;
|
||||||
@ -26,8 +34,60 @@ void GuiLabel::recompute_transform(void) {
|
|||||||
GuiLabel::~GuiLabel(void) {
|
GuiLabel::~GuiLabel(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiLabel* GuiLabel::make_simple_texture_label(void) {
|
#include <textureTransition.h>
|
||||||
return new GuiLabel();
|
#include <geomTristrip.h>
|
||||||
|
|
||||||
|
GuiLabel* GuiLabel::make_simple_texture_label(Texture* texture) {
|
||||||
|
GuiLabel* ret = new GuiLabel();
|
||||||
|
ret->_type = SIMPLE_TEXTURE;
|
||||||
|
ret->_tex = texture;
|
||||||
|
ret->_geom = new NamedNode("GUI label");
|
||||||
|
GeomNode* n2 = new GeomNode();
|
||||||
|
ret->_internal = new RenderRelation(ret->_geom, n2);
|
||||||
|
ret->_internal->set_transition(new TextureTransition(texture));
|
||||||
|
GeomTristrip *geoset = new GeomTristrip;
|
||||||
|
PTA_int lengths(0);
|
||||||
|
lengths.push_back(4);
|
||||||
|
PTA_Vertexf verts;
|
||||||
|
float l, r, b, t;
|
||||||
|
{
|
||||||
|
// compute {l, r, b, t}
|
||||||
|
int xs = texture->_pbuffer->get_xsize();
|
||||||
|
int ys = texture->_pbuffer->get_ysize();
|
||||||
|
float ratio;
|
||||||
|
|
||||||
|
if (xs > ys) {
|
||||||
|
// horizontally dominant
|
||||||
|
ratio = ((float)ys) / ((float)xs);
|
||||||
|
ratio *= 0.5;
|
||||||
|
l = -0.5;
|
||||||
|
r = 0.5;
|
||||||
|
b = -ratio;
|
||||||
|
t = ratio;
|
||||||
|
} else {
|
||||||
|
// vertically dominant
|
||||||
|
ratio = ((float)xs) / ((float)ys);
|
||||||
|
ratio *= 0.5;
|
||||||
|
l = -ratio;
|
||||||
|
r = ratio;
|
||||||
|
b = -0.5;
|
||||||
|
t = 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verts.push_back(Vertexf::rfu(l, 0., t));
|
||||||
|
verts.push_back(Vertexf::rfu(l, 0., b));
|
||||||
|
verts.push_back(Vertexf::rfu(r, 0., t));
|
||||||
|
verts.push_back(Vertexf::rfu(r, 0., b));
|
||||||
|
geoset->set_num_prims(1);
|
||||||
|
geoset->set_lengths(lengths);
|
||||||
|
geoset->set_coords(verts, G_PER_VERTEX);
|
||||||
|
PTA_TexCoordf uvs;
|
||||||
|
uvs.push_back(TexCoordf(0., 1.));
|
||||||
|
uvs.push_back(TexCoordf(0., 0.));
|
||||||
|
uvs.push_back(TexCoordf(1., 1.));
|
||||||
|
uvs.push_back(TexCoordf(1., 0.));
|
||||||
|
geoset->set_texcoords(uvs, G_PER_VERTEX);
|
||||||
|
n2->add_geom(geoset);
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiLabel* GuiLabel::make_simple_text_label(const string& text, Node* font) {
|
GuiLabel* GuiLabel::make_simple_text_label(const string& text, Node* font) {
|
||||||
@ -60,6 +120,36 @@ void GuiLabel::get_extents(float& l, float& r, float& b, float& t) {
|
|||||||
t = ul.dot(up);
|
t = ul.dot(up);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SIMPLE_TEXTURE:
|
||||||
|
{
|
||||||
|
float xs = _tex->_pbuffer->get_xsize();
|
||||||
|
float ys = _tex->_pbuffer->get_ysize();
|
||||||
|
float ratio;
|
||||||
|
LVector3f ul, lr;
|
||||||
|
|
||||||
|
if (xs > ys) {
|
||||||
|
// horizontally dominant
|
||||||
|
ratio = ((float)ys) / ((float)xs);
|
||||||
|
ratio *= 0.5;
|
||||||
|
ul = LVector3f::rfu(-0.5, 0., ratio);
|
||||||
|
lr = LVector3f::rfu(0.5, 0., -ratio);
|
||||||
|
} else {
|
||||||
|
// vertically dominant
|
||||||
|
ratio = ((float)xs) / ((float)ys);
|
||||||
|
ratio *= 0.5;
|
||||||
|
ul = LVector3f::rfu(-ratio, 0., 0.5);
|
||||||
|
lr = LVector3f::rfu(ratio, 0., -0.5);
|
||||||
|
}
|
||||||
|
LMatrix4f mat = LMatrix4f::scale_mat(_scale) *
|
||||||
|
LMatrix4f::translate_mat(_pos);
|
||||||
|
ul = mat * ul;
|
||||||
|
lr = mat * lr;
|
||||||
|
l = ul.dot(ul.right());
|
||||||
|
r = lr.dot(lr.right());
|
||||||
|
b = lr.dot(lr.up());
|
||||||
|
t = ul.dot(ul.up());
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gui_cat->warning()
|
gui_cat->warning()
|
||||||
<< "trying to get extents from something I don't know how to" << endl;
|
<< "trying to get extents from something I don't know how to" << endl;
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <node.h>
|
#include <node.h>
|
||||||
#include <pt_Node.h>
|
#include <pt_Node.h>
|
||||||
#include <renderRelation.h>
|
#include <renderRelation.h>
|
||||||
|
#include <texture.h>
|
||||||
|
|
||||||
// label-ish behavior for GUI objects (labels, buttons, rollovers)
|
// label-ish behavior for GUI objects (labels, buttons, rollovers)
|
||||||
|
|
||||||
@ -23,6 +24,8 @@ private:
|
|||||||
LabelType _type;
|
LabelType _type;
|
||||||
PT_Node _geom;
|
PT_Node _geom;
|
||||||
RenderRelation* _arc;
|
RenderRelation* _arc;
|
||||||
|
Texture* _tex;
|
||||||
|
RenderRelation* _internal;
|
||||||
|
|
||||||
float _scale;
|
float _scale;
|
||||||
LVector3f _pos;
|
LVector3f _pos;
|
||||||
@ -38,7 +41,7 @@ public:
|
|||||||
INLINE GuiLabel(void);
|
INLINE GuiLabel(void);
|
||||||
virtual ~GuiLabel(void);
|
virtual ~GuiLabel(void);
|
||||||
|
|
||||||
static GuiLabel* make_simple_texture_label(void);
|
static GuiLabel* make_simple_texture_label(Texture*);
|
||||||
static GuiLabel* make_simple_text_label(const string&, Node*);
|
static GuiLabel* make_simple_text_label(const string&, Node*);
|
||||||
|
|
||||||
void get_extents(float&, float&, float&, float&);
|
void get_extents(float&, float&, float&, float&);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user