text: slight perf improvement for TextNode card/frame generation

This commit is contained in:
rdb 2018-09-25 11:08:22 +02:00
parent 3ac50a2347
commit 5457d76b94

View File

@ -255,11 +255,16 @@ is_whitespace(wchar_t character) const {
*/ */
PN_stdfloat TextNode:: PN_stdfloat TextNode::
calc_width(const std::wstring &line) const { calc_width(const std::wstring &line) const {
TextFont *font = get_font();
if (font == nullptr) {
return 0.0f;
}
PN_stdfloat width = 0.0f; PN_stdfloat width = 0.0f;
std::wstring::const_iterator si; std::wstring::const_iterator si;
for (si = line.begin(); si != line.end(); ++si) { for (si = line.begin(); si != line.end(); ++si) {
width += calc_width(*si); width += TextAssembler::calc_width(*si, *this);
} }
return width; return width;
@ -730,15 +735,16 @@ make_frame() {
CPT(RenderState) state = RenderState::make(thick); CPT(RenderState) state = RenderState::make(thick);
PT(GeomVertexData) vdata = new GeomVertexData PT(GeomVertexData) vdata = new GeomVertexData
("text", GeomVertexFormat::get_v3(), get_usage_hint()); ("text", GeomVertexFormat::get_v3(), _usage_hint);
vdata->unclean_set_num_rows(4);
GeomVertexWriter vertex(vdata, InternalName::get_vertex()); GeomVertexWriter vertex(vdata, InternalName::get_vertex());
vertex.add_data3(left, 0.0f, top); vertex.set_data3(left, 0.0f, top);
vertex.add_data3(left, 0.0f, bottom); vertex.set_data3(left, 0.0f, bottom);
vertex.add_data3(right, 0.0f, bottom); vertex.set_data3(right, 0.0f, bottom);
vertex.add_data3(right, 0.0f, top); vertex.set_data3(right, 0.0f, top);
PT(GeomLinestrips) frame = new GeomLinestrips(get_usage_hint()); PT(GeomLinestrips) frame = new GeomLinestrips(_usage_hint);
frame->add_consecutive_vertices(0, 4); frame->add_consecutive_vertices(0, 4);
frame->add_vertex(0); frame->add_vertex(0);
frame->close_primitive(); frame->close_primitive();
@ -772,19 +778,20 @@ make_card() {
PN_stdfloat top = dimensions[3]; PN_stdfloat top = dimensions[3];
PT(GeomVertexData) vdata = new GeomVertexData PT(GeomVertexData) vdata = new GeomVertexData
("text", GeomVertexFormat::get_v3t2(), get_usage_hint()); ("text", GeomVertexFormat::get_v3t2(), _usage_hint);
vdata->unclean_set_num_rows(4);
GeomVertexWriter vertex(vdata, InternalName::get_vertex()); GeomVertexWriter vertex(vdata, InternalName::get_vertex());
GeomVertexWriter texcoord(vdata, InternalName::get_texcoord()); GeomVertexWriter texcoord(vdata, InternalName::get_texcoord());
vertex.add_data3(left, 0.0f, top); vertex.set_data3(left, 0.0f, top);
vertex.add_data3(left, 0.0f, bottom); vertex.set_data3(left, 0.0f, bottom);
vertex.add_data3(right, 0.0f, top); vertex.set_data3(right, 0.0f, top);
vertex.add_data3(right, 0.0f, bottom); vertex.set_data3(right, 0.0f, bottom);
texcoord.add_data2(0.0f, 1.0f); texcoord.set_data2(0.0f, 1.0f);
texcoord.add_data2(0.0f, 0.0f); texcoord.set_data2(0.0f, 0.0f);
texcoord.add_data2(1.0f, 1.0f); texcoord.set_data2(1.0f, 1.0f);
texcoord.add_data2(1.0f, 0.0f); texcoord.set_data2(1.0f, 0.0f);
PT(GeomTristrips) card = new GeomTristrips(get_usage_hint()); PT(GeomTristrips) card = new GeomTristrips(get_usage_hint());
card->add_consecutive_vertices(0, 4); card->add_consecutive_vertices(0, 4);
@ -820,57 +827,59 @@ make_card_with_border() {
*/ */
PT(GeomVertexData) vdata = new GeomVertexData PT(GeomVertexData) vdata = new GeomVertexData
("text", GeomVertexFormat::get_v3t2(), get_usage_hint()); ("text", GeomVertexFormat::get_v3t2(), _usage_hint);
vdata->unclean_set_num_rows(16);
GeomVertexWriter vertex(vdata, InternalName::get_vertex()); GeomVertexWriter vertex(vdata, InternalName::get_vertex());
GeomVertexWriter texcoord(vdata, InternalName::get_texcoord()); GeomVertexWriter texcoord(vdata, InternalName::get_texcoord());
// verts 1,2,3,4 // verts 1,2,3,4
vertex.add_data3(left, 0.02, top); vertex.set_data3(left, 0.02, top);
vertex.add_data3(left, 0.02, top - _card_border_size); vertex.set_data3(left, 0.02, top - _card_border_size);
vertex.add_data3(left + _card_border_size, 0.02, top); vertex.set_data3(left + _card_border_size, 0.02, top);
vertex.add_data3(left + _card_border_size, 0.02, vertex.set_data3(left + _card_border_size, 0.02,
top - _card_border_size); top - _card_border_size);
// verts 5,6,7,8 // verts 5,6,7,8
vertex.add_data3(right - _card_border_size, 0.02, top); vertex.set_data3(right - _card_border_size, 0.02, top);
vertex.add_data3(right - _card_border_size, 0.02, vertex.set_data3(right - _card_border_size, 0.02,
top - _card_border_size); top - _card_border_size);
vertex.add_data3(right, 0.02, top); vertex.set_data3(right, 0.02, top);
vertex.add_data3(right, 0.02, top - _card_border_size); vertex.set_data3(right, 0.02, top - _card_border_size);
// verts 9,10,11,12 // verts 9,10,11,12
vertex.add_data3(left, 0.02, bottom + _card_border_size); vertex.set_data3(left, 0.02, bottom + _card_border_size);
vertex.add_data3(left, 0.02, bottom); vertex.set_data3(left, 0.02, bottom);
vertex.add_data3(left + _card_border_size, 0.02, vertex.set_data3(left + _card_border_size, 0.02,
bottom + _card_border_size); bottom + _card_border_size);
vertex.add_data3(left + _card_border_size, 0.02, bottom); vertex.set_data3(left + _card_border_size, 0.02, bottom);
// verts 13,14,15,16 // verts 13,14,15,16
vertex.add_data3(right - _card_border_size, 0.02, vertex.set_data3(right - _card_border_size, 0.02,
bottom + _card_border_size); bottom + _card_border_size);
vertex.add_data3(right - _card_border_size, 0.02, bottom); vertex.set_data3(right - _card_border_size, 0.02, bottom);
vertex.add_data3(right, 0.02, bottom + _card_border_size); vertex.set_data3(right, 0.02, bottom + _card_border_size);
vertex.add_data3(right, 0.02, bottom); vertex.set_data3(right, 0.02, bottom);
texcoord.add_data2(0.0f, 1.0f); //1 texcoord.set_data2(0.0f, 1.0f); //1
texcoord.add_data2(0.0f, 1.0f - _card_border_uv_portion); //2 texcoord.set_data2(0.0f, 1.0f - _card_border_uv_portion); //2
texcoord.add_data2(0.0f + _card_border_uv_portion, 1.0f); //3 texcoord.set_data2(0.0f + _card_border_uv_portion, 1.0f); //3
texcoord.add_data2(0.0f + _card_border_uv_portion, texcoord.set_data2(0.0f + _card_border_uv_portion,
1.0f - _card_border_uv_portion); //4 1.0f - _card_border_uv_portion); //4
texcoord.add_data2(1.0f -_card_border_uv_portion, 1.0f); //5 texcoord.set_data2(1.0f -_card_border_uv_portion, 1.0f); //5
texcoord.add_data2(1.0f -_card_border_uv_portion, texcoord.set_data2(1.0f -_card_border_uv_portion,
1.0f - _card_border_uv_portion); //6 1.0f - _card_border_uv_portion); //6
texcoord.add_data2(1.0f, 1.0f); //7 texcoord.set_data2(1.0f, 1.0f); //7
texcoord.add_data2(1.0f, 1.0f - _card_border_uv_portion); //8 texcoord.set_data2(1.0f, 1.0f - _card_border_uv_portion); //8
texcoord.add_data2(0.0f, _card_border_uv_portion); //9 texcoord.set_data2(0.0f, _card_border_uv_portion); //9
texcoord.add_data2(0.0f, 0.0f); //10 texcoord.set_data2(0.0f, 0.0f); //10
texcoord.add_data2(_card_border_uv_portion, _card_border_uv_portion); //11 texcoord.set_data2(_card_border_uv_portion, _card_border_uv_portion); //11
texcoord.add_data2(_card_border_uv_portion, 0.0f); //12 texcoord.set_data2(_card_border_uv_portion, 0.0f); //12
texcoord.add_data2(1.0f - _card_border_uv_portion, _card_border_uv_portion);//13 texcoord.set_data2(1.0f - _card_border_uv_portion, _card_border_uv_portion);//13
texcoord.add_data2(1.0f - _card_border_uv_portion, 0.0f);//14 texcoord.set_data2(1.0f - _card_border_uv_portion, 0.0f);//14
texcoord.add_data2(1.0f, _card_border_uv_portion);//15 texcoord.set_data2(1.0f, _card_border_uv_portion);//15
texcoord.add_data2(1.0f, 0.0f);//16 texcoord.set_data2(1.0f, 0.0f);//16
PT(GeomTristrips) card = new GeomTristrips(get_usage_hint()); PT(GeomTristrips) card = new GeomTristrips(_usage_hint);
card->reserve_num_vertices(24);
// tristrip #1 // tristrip #1
card->add_consecutive_vertices(0, 8); card->add_consecutive_vertices(0, 8);