00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef TEXTNODE_H
00016 #define TEXTNODE_H
00017
00018 #include "pandabase.h"
00019
00020 #include "config_text.h"
00021 #include "textEncoder.h"
00022 #include "textProperties.h"
00023 #include "textFont.h"
00024 #include "textAssembler.h"
00025 #include "pandaNode.h"
00026 #include "luse.h"
00027 #include "geom.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 class EXPCL_PANDA_TEXT TextNode : public PandaNode, public TextEncoder, public TextProperties {
00053 PUBLISHED:
00054 TextNode(const string &name);
00055 TextNode(const string &name, const TextProperties ©);
00056 protected:
00057 TextNode(const TextNode ©);
00058 virtual PandaNode *make_copy() const;
00059
00060 PUBLISHED:
00061 ~TextNode();
00062
00063 enum FlattenFlags {
00064 FF_none = 0x0000,
00065 FF_light = 0x0001,
00066 FF_medium = 0x0002,
00067 FF_strong = 0x0004,
00068 FF_dynamic_merge = 0x0008,
00069 };
00070
00071 INLINE PN_stdfloat get_line_height() const;
00072
00073 INLINE void set_max_rows(int max_rows);
00074 INLINE void clear_max_rows();
00075 INLINE bool has_max_rows() const;
00076 INLINE int get_max_rows() const;
00077 INLINE bool has_overflow() const;
00078
00079 INLINE void set_frame_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
00080 INLINE void set_frame_color(const LColor &frame_color);
00081 INLINE LColor get_frame_color() const;
00082
00083 INLINE void set_card_border(PN_stdfloat size, PN_stdfloat uv_portion);
00084 INLINE void clear_card_border();
00085 INLINE PN_stdfloat get_card_border_size() const;
00086 INLINE PN_stdfloat get_card_border_uv_portion() const;
00087 INLINE bool has_card_border() const;
00088
00089 INLINE void set_card_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
00090 INLINE void set_card_color(const LColor &card_color);
00091 INLINE LColor get_card_color() const;
00092
00093 INLINE void set_card_texture(Texture *card_texture);
00094 INLINE void clear_card_texture();
00095 INLINE bool has_card_texture() const;
00096 INLINE Texture *get_card_texture() const;
00097
00098 INLINE void set_frame_as_margin(PN_stdfloat left, PN_stdfloat right,
00099 PN_stdfloat bottom, PN_stdfloat top);
00100 INLINE void set_frame_actual(PN_stdfloat left, PN_stdfloat right,
00101 PN_stdfloat bottom, PN_stdfloat top);
00102 INLINE void clear_frame();
00103 INLINE bool has_frame() const;
00104 INLINE bool is_frame_as_margin() const;
00105 INLINE LVecBase4 get_frame_as_set() const;
00106 INLINE LVecBase4 get_frame_actual() const;
00107
00108 INLINE void set_frame_line_width(PN_stdfloat line_width);
00109 INLINE PN_stdfloat get_frame_line_width() const;
00110 INLINE void set_frame_corners(bool corners);
00111 INLINE bool get_frame_corners() const;
00112
00113 INLINE void set_card_as_margin(PN_stdfloat left, PN_stdfloat right,
00114 PN_stdfloat bottom, PN_stdfloat top);
00115 INLINE void set_card_actual(PN_stdfloat left, PN_stdfloat right,
00116 PN_stdfloat bottom, PN_stdfloat top);
00117 INLINE void set_card_decal(bool card_decal);
00118 INLINE void clear_card();
00119 INLINE bool has_card() const;
00120 INLINE bool get_card_decal() const;
00121 INLINE bool is_card_as_margin() const;
00122 INLINE LVecBase4 get_card_as_set() const;
00123 INLINE LVecBase4 get_card_actual() const;
00124 INLINE LVecBase4 get_card_transformed() const;
00125
00126 INLINE void set_transform(const LMatrix4 &transform);
00127 INLINE LMatrix4 get_transform() const;
00128
00129 INLINE void set_coordinate_system(CoordinateSystem cs);
00130 INLINE CoordinateSystem get_coordinate_system() const;
00131
00132 INLINE void set_usage_hint(Geom::UsageHint usage_hint);
00133 INLINE Geom::UsageHint get_usage_hint() const;
00134
00135 INLINE void set_flatten_flags(int flatten_flags);
00136 INLINE int get_flatten_flags() const;
00137
00138
00139
00140
00141
00142 INLINE void set_font(TextFont *font);
00143 INLINE void clear_font();
00144
00145 INLINE void set_small_caps(bool small_caps);
00146 INLINE void clear_small_caps();
00147
00148 INLINE void set_small_caps_scale(PN_stdfloat small_caps_scale);
00149 INLINE void clear_small_caps_scale();
00150
00151 INLINE void set_slant(PN_stdfloat slant);
00152 INLINE void clear_slant();
00153
00154 INLINE void set_align(Alignment align_type);
00155 INLINE void clear_align();
00156
00157 INLINE void set_indent(PN_stdfloat indent);
00158 INLINE void clear_indent();
00159
00160 INLINE void set_wordwrap(PN_stdfloat wordwrap);
00161 INLINE void clear_wordwrap();
00162
00163 INLINE void set_text_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
00164 INLINE void set_text_color(const LColor &text_color);
00165 INLINE void clear_text_color();
00166
00167 INLINE void set_shadow_color(PN_stdfloat r, PN_stdfloat g, PN_stdfloat b, PN_stdfloat a);
00168 INLINE void set_shadow_color(const LColor &shadow_color);
00169 INLINE void clear_shadow_color();
00170
00171 INLINE void set_shadow(PN_stdfloat xoffset, PN_stdfloat yoffset);
00172 INLINE void set_shadow(const LVecBase2 &shadow_offset);
00173 INLINE void clear_shadow();
00174
00175 INLINE void set_bin(const string &bin);
00176 INLINE void clear_bin();
00177
00178 INLINE int set_draw_order(int draw_order);
00179 INLINE void clear_draw_order();
00180
00181 INLINE void set_tab_width(PN_stdfloat tab_width);
00182 INLINE void clear_tab_width();
00183
00184 INLINE void set_glyph_scale(PN_stdfloat glyph_scale);
00185 INLINE void clear_glyph_scale();
00186
00187 INLINE void set_glyph_shift(PN_stdfloat glyph_shift);
00188 INLINE void clear_glyph_shift();
00189
00190
00191
00192
00193 INLINE void set_text(const string &text);
00194 INLINE void set_text(const string &text, Encoding encoding);
00195 INLINE void clear_text();
00196 INLINE void append_text(const string &text);
00197 INLINE void append_unicode_char(wchar_t character);
00198
00199
00200
00201 INLINE string get_wordwrapped_text() const;
00202
00203
00204
00205 PN_stdfloat calc_width(wchar_t character) const;
00206 INLINE PN_stdfloat calc_width(const string &line) const;
00207
00208 bool has_exact_character(wchar_t character) const;
00209 bool has_character(wchar_t character) const;
00210 bool is_whitespace(wchar_t character) const;
00211
00212
00213 INLINE void set_wtext(const wstring &wtext);
00214 INLINE void append_wtext(const wstring &text);
00215
00216 INLINE wstring get_wordwrapped_wtext() const;
00217 PN_stdfloat calc_width(const wstring &line) const;
00218
00219 virtual void output(ostream &out) const;
00220 virtual void write(ostream &out, int indent_level = 0) const;
00221
00222
00223
00224 INLINE PN_stdfloat get_left() const;
00225 INLINE PN_stdfloat get_right() const;
00226 INLINE PN_stdfloat get_bottom() const;
00227 INLINE PN_stdfloat get_top() const;
00228 INLINE PN_stdfloat get_height() const;
00229 INLINE PN_stdfloat get_width() const;
00230
00231 INLINE LPoint3 get_upper_left_3d() const;
00232 INLINE LPoint3 get_lower_right_3d() const;
00233
00234 INLINE int get_num_rows() const;
00235
00236 PT(PandaNode) generate();
00237 INLINE void update();
00238 INLINE void force_update();
00239
00240 PandaNode *get_internal_geom() const;
00241
00242 public:
00243
00244 virtual int get_unsafe_to_apply_attribs() const;
00245 virtual void apply_attribs_to_vertices(const AccumulatedAttribs &attribs,
00246 int attrib_types,
00247 GeomTransformer &transformer);
00248 virtual CPT(TransformState)
00249 calc_tight_bounds(LPoint3 &min_point, LPoint3 &max_point,
00250 bool &found_any,
00251 const TransformState *transform,
00252 Thread *current_thread) const;
00253
00254 virtual bool cull_callback(CullTraverser *trav, CullTraverserData &data);
00255 virtual bool is_renderable() const;
00256
00257 virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
00258 int &internal_vertices,
00259 int pipeline_stage,
00260 Thread *current_thread) const;
00261
00262 virtual void r_prepare_scene(GraphicsStateGuardianBase *gsg,
00263 const RenderState *node_state,
00264 GeomTransformer &transformer,
00265 Thread *current_thread);
00266
00267 private:
00268 INLINE void invalidate_no_measure();
00269 INLINE void invalidate_with_measure();
00270 INLINE void check_rebuild() const;
00271 INLINE void check_measure() const;
00272
00273 void do_rebuild();
00274 void do_measure();
00275
00276 PT(PandaNode) make_frame();
00277 PT(PandaNode) make_card();
00278 PT(PandaNode) make_card_with_border();
00279
00280 static int count_geoms(PandaNode *node);
00281
00282 PT(PandaNode) _internal_geom;
00283
00284 PT(Texture) _card_texture;
00285 LColor _frame_color;
00286 LColor _card_color;
00287
00288 enum Flags {
00289 F_has_frame = 0x0001,
00290 F_frame_as_margin = 0x0002,
00291 F_has_card = 0x0004,
00292 F_card_as_margin = 0x0008,
00293 F_has_card_texture = 0x0010,
00294 F_frame_corners = 0x0020,
00295 F_card_transp = 0x0040,
00296 F_has_card_border = 0x0080,
00297 F_needs_rebuild = 0x0100,
00298 F_needs_measure = 0x0200,
00299 F_has_overflow = 0x0400,
00300 F_card_decal = 0x0800,
00301 };
00302
00303 int _flags;
00304 int _max_rows;
00305 GeomEnums::UsageHint _usage_hint;
00306 int _flatten_flags;
00307 bool _dynamic_merge;
00308 PN_stdfloat _frame_width;
00309 PN_stdfloat _card_border_size;
00310 PN_stdfloat _card_border_uv_portion;
00311
00312 LVector2 _frame_ul, _frame_lr;
00313 LVector2 _card_ul, _card_lr;
00314
00315 LMatrix4 _transform;
00316 CoordinateSystem _coordinate_system;
00317
00318 LPoint3 _ul3d, _lr3d;
00319
00320
00321 LVector2 _text_ul, _text_lr;
00322 int _num_rows;
00323 wstring _wordwrapped_wtext;
00324
00325 static PStatCollector _text_generate_pcollector;
00326
00327 public:
00328 static TypeHandle get_class_type() {
00329 return _type_handle;
00330 }
00331 static void init_type() {
00332 PandaNode::init_type();
00333 TextProperties::init_type();
00334 register_type(_type_handle, "TextNode",
00335 PandaNode::get_class_type(),
00336 TextProperties::get_class_type());
00337 }
00338 virtual TypeHandle get_type() const {
00339 return get_class_type();
00340 }
00341 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00342
00343 private:
00344 static TypeHandle _type_handle;
00345 };
00346
00347 #include "textNode.I"
00348
00349 #endif