TextGraphic::set_instance_flag()

This commit is contained in:
David Rose 2008-10-28 21:36:26 +00:00
parent d2c5866507
commit 6db2257ca1
7 changed files with 108 additions and 23 deletions

View File

@ -32,21 +32,34 @@ ModelNode(const string &name) :
// Access: Public // Access: Public
// Description: Sets the preserve_transform flag. This restricts the // Description: Sets the preserve_transform flag. This restricts the
// ability of a flatten operation to affect the // ability of a flatten operation to affect the
// transform stored on this node. If the flag is: // transform stored on this node, and/or the node
// itself. In the order from weakest to strongest
// restrictions, the possible flags are:
// //
// PT_none - the transform may be adjusted at will. // PT_drop_node - This node should be removed at the
// next flatten call.
// //
// PT_local - the local (and net) transform should not // PT_none - The transform may be adjusted at will. The
// node itself will not be removed. This is the
// default.
//
// PT_net - Preserve the net transform from the root,
// but it's acceptable to modify the local transform
// stored on this particular node if necessary, so long
// as the net transform is not changed. This eliminates
// the need to drop an extra transform on the node
// above.
//
// PT_local - The local (and net) transform should not
// be changed in any way. If necessary, an extra // be changed in any way. If necessary, an extra
// transform will be left on the node above to guarantee // transform will be left on the node above to guarantee
// this. This is the strongest restriction. // this. This is a stronger restriction than PT_net.
// //
// PT_net - preserve the net transform from the // PT_no_touch - The local transform will not be
// root, but it's acceptable to modify the local // changed, the node will not be removed, and
// transform stored on this particular node if // furthermore any flatten operation will not continue
// necessary, so long as the net transform is not // below this node--this node and all descendents are
// changed. This eliminates the need to drop an extra // protected from the effects of flatten.
// transform on the node above.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void ModelNode:: INLINE void ModelNode::
set_preserve_transform(ModelNode::PreserveTransform preserve_transform) { set_preserve_transform(ModelNode::PreserveTransform preserve_transform) {

View File

@ -74,6 +74,18 @@ safe_to_flatten() const {
return _preserve_transform == PT_drop_node; return _preserve_transform == PT_drop_node;
} }
////////////////////////////////////////////////////////////////////
// Function: ModelNode::safe_to_flatten_below
// Access: Public, Virtual
// Description: Returns true if a flatten operation may safely
// continue past this node, or false if nodes below this
// node may not be molested.
////////////////////////////////////////////////////////////////////
bool ModelNode::
safe_to_flatten_below() const {
return _preserve_transform != PT_no_touch;
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: ModelNode::safe_to_transform // Function: ModelNode::safe_to_transform
// Access: Public, Virtual // Access: Public, Virtual
@ -101,7 +113,7 @@ safe_to_transform() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool ModelNode:: bool ModelNode::
safe_to_modify_transform() const { safe_to_modify_transform() const {
return _preserve_transform != PT_local; return _preserve_transform != PT_local && _preserve_transform != PT_no_touch;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -128,7 +140,7 @@ safe_to_combine() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool ModelNode:: bool ModelNode::
preserve_name() const { preserve_name() const {
return _preserve_transform != PT_drop_node; return _preserve_transform != PT_drop_node && _preserve_transform != PT_no_touch;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -43,6 +43,7 @@ public:
virtual PandaNode *combine_with(PandaNode *other); virtual PandaNode *combine_with(PandaNode *other);
virtual bool safe_to_flatten() const; virtual bool safe_to_flatten() const;
virtual bool safe_to_flatten_below() const;
virtual bool safe_to_transform() const; virtual bool safe_to_transform() const;
virtual bool safe_to_modify_transform() const; virtual bool safe_to_modify_transform() const;
virtual bool safe_to_combine() const; virtual bool safe_to_combine() const;
@ -55,6 +56,7 @@ PUBLISHED:
PT_local, PT_local,
PT_net, PT_net,
PT_drop_node, PT_drop_node,
PT_no_touch,
}; };
INLINE void set_preserve_transform(PreserveTransform preserve_transform); INLINE void set_preserve_transform(PreserveTransform preserve_transform);

View File

@ -290,6 +290,16 @@ r_apply_attribs(PandaNode *node, const AccumulatedAttribs &attribs,
// Check to see if we can't propagate any of these attribs past // Check to see if we can't propagate any of these attribs past
// this node for some reason. // this node for some reason.
if (!node->safe_to_flatten_below()) {
if (pgraph_cat.is_spam()) {
pgraph_cat.spam()
<< "Not applying further; " << *node
<< " doesn't allow flattening below itself.\n";
}
next_attribs.apply_to_node(node, attrib_types);
return;
}
int apply_types = 0; int apply_types = 0;
const RenderEffects *effects = node->get_effects(); const RenderEffects *effects = node->get_effects();
@ -414,7 +424,7 @@ r_flatten(PandaNode *grandparent_node, PandaNode *parent_node,
if (!parent_node->safe_to_flatten_below()) { if (!parent_node->safe_to_flatten_below()) {
if (pgraph_cat.is_spam()) { if (pgraph_cat.is_spam()) {
pgraph_cat.spam() pgraph_cat.spam()
<< "Not traversing farther; " << *parent_node << "Not traversing further; " << *parent_node
<< " doesn't allow flattening below itself.\n"; << " doesn't allow flattening below itself.\n";
} }

View File

@ -27,6 +27,7 @@
#include "geomVertexFormat.h" #include "geomVertexFormat.h"
#include "geomVertexData.h" #include "geomVertexData.h"
#include "geom.h" #include "geom.h"
#include "modelNode.h"
#include <ctype.h> #include <ctype.h>
@ -1208,12 +1209,13 @@ assemble_row(TextAssembler::TextRow &row,
// We get the row's alignment property from that of the last // We get the row's alignment property from that of the last
// character to be placed in the row (or the newline character). // character to be placed in the row (or the newline character).
//[fabius] differently as stated above this is not a sure way to get it so we'll set it as soon as we found it
if ( //[fabius] differently as stated above this is not a sure way to
(align == TextProperties::A_left) && //get it so we'll set it as soon as we found it
(properties->get_align() != TextProperties::A_left) if ((align == TextProperties::A_left) &&
) (properties->get_align() != TextProperties::A_left)) {
align = properties->get_align(); align = properties->get_align();
}
// And the height of the row is the maximum of all the fonts used // And the height of the row is the maximum of all the fonts used
// within the row. // within the row.
@ -1242,7 +1244,20 @@ assemble_row(TextAssembler::TextRow &row,
GlyphPlacement *placement = new GlyphPlacement; GlyphPlacement *placement = new GlyphPlacement;
row_placed_glyphs.push_back(placement); row_placed_glyphs.push_back(placement);
placement->_graphic_model = graphic->get_model().node(); PT(PandaNode) model = graphic->get_model().node();
if (graphic->get_instance_flag()) {
// Instance the model in. Create a ModelNode so it doesn't
// get flattened.
PT(ModelNode) model_node = new ModelNode("");
model_node->set_preserve_transform(ModelNode::PT_no_touch);
model_node->add_child(model);
placement->_graphic_model = model_node.p();
} else {
// Copy the model in. This the preferred way; it's a little
// cheaper to render than instancing (because flattening is
// more effective).
placement->_graphic_model = model->copy_subgraph();
}
LVecBase4f frame = graphic->get_frame(); LVecBase4f frame = graphic->get_frame();
float glyph_scale = properties->get_glyph_scale() * properties->get_text_scale(); float glyph_scale = properties->get_glyph_scale() * properties->get_text_scale();
@ -2061,7 +2076,7 @@ copy_graphic_to(PandaNode *node, const RenderState *state,
intermediate_node->set_transform(TransformState::make_mat(new_xform)); intermediate_node->set_transform(TransformState::make_mat(new_xform));
intermediate_node->set_state(state); intermediate_node->set_state(state);
intermediate_node->add_child(_graphic_model->copy_subgraph()); intermediate_node->add_child(_graphic_model);
} }
} }

View File

@ -21,6 +21,7 @@
INLINE TextGraphic:: INLINE TextGraphic::
TextGraphic() { TextGraphic() {
_frame = LVecBase4f::zero(); _frame = LVecBase4f::zero();
_instance_flag = false;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -31,7 +32,8 @@ TextGraphic() {
INLINE TextGraphic:: INLINE TextGraphic::
TextGraphic(const NodePath &model, const LVecBase4f &frame) : TextGraphic(const NodePath &model, const LVecBase4f &frame) :
_model(model), _model(model),
_frame(frame) _frame(frame),
_instance_flag(false)
{ {
} }
@ -43,7 +45,8 @@ TextGraphic(const NodePath &model, const LVecBase4f &frame) :
INLINE TextGraphic:: INLINE TextGraphic::
TextGraphic(const NodePath &model, float left, float right, float bottom, float top) : TextGraphic(const NodePath &model, float left, float right, float bottom, float top) :
_model(model), _model(model),
_frame(left, right, bottom, top) _frame(left, right, bottom, top),
_instance_flag(false)
{ {
} }
@ -110,3 +113,29 @@ INLINE void TextGraphic::
set_frame(float left, float right, float bottom, float top) { set_frame(float left, float right, float bottom, float top) {
_frame.set(left, right, bottom, top); _frame.set(left, right, bottom, top);
} }
////////////////////////////////////////////////////////////////////
// Function: TextGraphic::get_instance_flag
// Access: Published
// Description: Returns the instance_flag. See set_instance_flag().
////////////////////////////////////////////////////////////////////
INLINE bool TextGraphic::
get_instance_flag() const {
return _instance_flag;
}
////////////////////////////////////////////////////////////////////
// Function: TextGraphic::set_instance_flag
// Access: Published
// Description: Sets the instance_flag. When this is true, the
// graphic is directly instanced to the scene graph
// whenever it appears; when it is false, the graphic is
// copied. The default is false, which is best for most
// applications. You might need to set it true for
// special kinds of "graphics" like interactive
// elements, for instance a PGEntry.
////////////////////////////////////////////////////////////////////
INLINE void TextGraphic::
set_instance_flag(bool instance_flag) {
_instance_flag = instance_flag;
}

View File

@ -53,9 +53,13 @@ PUBLISHED:
INLINE void set_frame(const LVecBase4f &frame); INLINE void set_frame(const LVecBase4f &frame);
INLINE void set_frame(float left, float right, float bottom, float top); INLINE void set_frame(float left, float right, float bottom, float top);
INLINE bool get_instance_flag() const;
INLINE void set_instance_flag(bool instance_flag);
private: private:
NodePath _model; NodePath _model;
LVecBase4f _frame; LVecBase4f _frame;
bool _instance_flag;
}; };
#include "textGraphic.I" #include "textGraphic.I"