110 lines
3.3 KiB
C
110 lines
3.3 KiB
C
|
#ifndef _H_DNA_SIGNBASELINE_
|
||
|
#define _H_DNA_SIGNBASELINE_
|
||
|
|
||
|
#include "DNANode.h"
|
||
|
|
||
|
#define DUMP_IF_NOT_NULL(X) if (m_##X) INDENTED_OUT << #X " [ " << m_##X << " ]" << std::endl;
|
||
|
|
||
|
class EXPCL_DNA DNASignBaseline : public DNANode
|
||
|
{
|
||
|
PUBLISHED:
|
||
|
DNASignBaseline(const std::string& name);
|
||
|
~DNASignBaseline();
|
||
|
|
||
|
WRITE_PDNA
|
||
|
{
|
||
|
DNANode::write_pdna(dg, false);
|
||
|
|
||
|
dg.add_string(m_text);
|
||
|
dg.add_string(m_code);
|
||
|
PACK_COLOR;
|
||
|
dg.add_string(m_flags);
|
||
|
dg.add_float32(m_indent);
|
||
|
dg.add_float32(m_kern);
|
||
|
dg.add_float32(m_wiggle);
|
||
|
dg.add_float32(m_stumble);
|
||
|
dg.add_float32(m_stomp);
|
||
|
dg.add_float32(m_width);
|
||
|
dg.add_float32(m_height);
|
||
|
|
||
|
if (recursive)
|
||
|
pack_children_pdna(dg);
|
||
|
}
|
||
|
|
||
|
WRITE_DNA
|
||
|
{
|
||
|
DNANode::write_dna(out, false, indent);
|
||
|
indent += 1;
|
||
|
|
||
|
if (m_code.size())
|
||
|
INDENTED_OUT << "code [ \"" << m_code << "\" ]" << std::endl;
|
||
|
|
||
|
if (m_flags.size())
|
||
|
INDENTED_OUT << "flags [ \"" << m_flags << "\" ]" << std::endl;
|
||
|
|
||
|
DUMP_IF_NOT_NULL(indent);
|
||
|
DUMP_IF_NOT_NULL(kern);
|
||
|
DUMP_IF_NOT_NULL(wiggle);
|
||
|
DUMP_IF_NOT_NULL(stumble);
|
||
|
DUMP_IF_NOT_NULL(stomp);
|
||
|
DUMP_IF_NOT_NULL(width);
|
||
|
DUMP_IF_NOT_NULL(height);
|
||
|
|
||
|
for (size_t i = 0; i < m_text.size(); ++i)
|
||
|
INDENTED_OUT << "text [ letters [ \"" << m_text.at(i) << "\" ] ]" << std::endl;
|
||
|
|
||
|
if (m_color != LVecBase4f(1, 1, 1, 1))
|
||
|
INDENTED_OUT << "color [ " << m_color.get_x() << " "
|
||
|
<< m_color.get_y() << " " << m_color.get_z()
|
||
|
<< " " << m_color.get_w() << " ]" << std::endl;
|
||
|
|
||
|
if (recursive)
|
||
|
pack_children_dna(out, indent - 1);
|
||
|
}
|
||
|
|
||
|
COMP_CODE(COMPCODE_SIGN_BASELINE);
|
||
|
COMP_NAME(baseline);
|
||
|
|
||
|
public:
|
||
|
virtual void make_from_dgi(DatagramIterator& dgi, DNAStorage* store);
|
||
|
virtual void traverse(NodePath& np, DNAStorage* store);
|
||
|
|
||
|
std::string m_text;
|
||
|
|
||
|
private:
|
||
|
bool is_first_letter_of_word(const char c);
|
||
|
void line_next_pos_hpr_scale(LVecBase3f& pos, LVecBase3f& hpr, LVecBase3f& scale, LVecBase3f& frame);
|
||
|
void circle_next_pos_hpr_scale(LVecBase3f& pos, LVecBase3f& hpr, LVecBase3f& scale, LVecBase3f& frame);
|
||
|
void center(LVecBase3f& pos, LVecBase3f& hpr);
|
||
|
void reset();
|
||
|
|
||
|
INLINE void baseline_next_pos_hpr_scale(LVecBase3f& pos, LVecBase3f& hpr, LVecBase3f& scale, LVecBase3f& frame)
|
||
|
{
|
||
|
if (0.0 != m_width || 0.0 != m_height)
|
||
|
circle_next_pos_hpr_scale(pos, hpr, scale, frame);
|
||
|
else
|
||
|
line_next_pos_hpr_scale(pos, hpr, scale, frame);
|
||
|
}
|
||
|
|
||
|
LVecBase3f m_curr_pos;
|
||
|
float m_field_252;
|
||
|
float m_angle;
|
||
|
bool m_is_space;
|
||
|
int m_counter;
|
||
|
|
||
|
PROPERTY_STRING(code);
|
||
|
PROPERTY_STRING(flags);
|
||
|
PROPERTY(LVecBase4, color);
|
||
|
PROPERTY(float, indent);
|
||
|
PROPERTY(float, kern);
|
||
|
PROPERTY(float, wiggle);
|
||
|
PROPERTY(float, stumble);
|
||
|
PROPERTY(float, stomp);
|
||
|
PROPERTY(float, width);
|
||
|
PROPERTY(float, height);
|
||
|
|
||
|
TYPE_HANDLE(DNASignBaseline, DNANode);
|
||
|
};
|
||
|
|
||
|
#endif
|