14 void Graphic::build(unsigned wd, unsigned ht, GL::PrimitiveBuilder &bld) const
17 create_coords(0.0f-shadow.left, wd+shadow.right, border.left, border.right, slice.w-border.left-border.right, x);
18 create_coords(0.0f-shadow.bottom, ht+shadow.top, border.bottom, border.top, slice.h-border.bottom-border.top, y);
21 create_texcoords(slice.x, slice.x+slice.w, border.left, border.right, texture->get_width(), u);
22 create_texcoords(slice.y, slice.y+slice.h, border.bottom, border.top, texture->get_height(), v);
24 unsigned xmin = border.left ? 0 : 1;
25 unsigned xmax = x.size()-(border.right ? 2 : 3);
26 unsigned ymin = border.bottom ? 0 : 1;
27 unsigned ymax = y.size()-(border.top ? 2 : 3);
29 bld.color(1.0f, 1.0f, 1.0f);
30 for(unsigned i=ymin; i<=ymax; ++i)
32 unsigned i2 = (i==0 ? 0 : i==y.size()-2 ? 2 : 1);
33 for(unsigned j=xmin; j<=xmax; ++j)
35 unsigned j2 = (j==0 ? 0 : j==x.size()-2 ? 2 : 1);
36 if(j==xmin || (j>1 && j<x.size()-2))
40 bld.begin(GL::TRIANGLE_STRIP);
41 bld.texcoord(u[j2], v[i2+1]);
42 bld.vertex(x[j], y[i+1]);
43 bld.texcoord(u[j2], v[i2]);
44 bld.vertex(x[j], y[i]);
46 bld.texcoord(u[j2+1], v[i2+1]);
47 bld.vertex(x[j+1], y[i+1]);
48 bld.texcoord(u[j2+1], v[i2]);
49 bld.vertex(x[j+1], y[i]);
55 void Graphic::create_coords(float low, float high, float brd1, float brd2, float block, vector<float> &coords) const
57 coords.push_back(low);
58 coords.push_back(low+brd1);
61 float space = high-low-brd1-brd2;
62 unsigned div = max(static_cast<unsigned>(space/block), 1U);
63 float delta = space/div;
64 for(unsigned i=1; i<div; ++i)
65 coords.push_back(low+brd1+delta*i);
67 coords.push_back(high-brd2);
68 coords.push_back(high);
71 void Graphic::create_texcoords(float low, float high, float brd1, float brd2, float scale, vector<float> &coords) const
73 coords.push_back(low/scale);
74 coords.push_back((low+brd1)/scale);
75 coords.push_back((high-brd2)/scale);
76 coords.push_back(high/scale);
80 Graphic::Loader::Loader(Graphic &g, Resources &r):
81 DataFile::CollectionObjectLoader<Graphic, Resources>(g, &r)
83 add("texture", &Loader::texture);
84 add("slice", &Loader::slice);
85 add("border", &Loader::border);
86 add("repeat", &Graphic::repeat);
87 add("shadow", &Loader::shadow);
90 void Graphic::Loader::texture(const string &n)
92 obj.texture = &get_collection().get<GL::Texture2D>(n);
93 obj.slice = Geometry(0, 0, obj.texture->get_width(), obj.texture->get_height());
96 void Graphic::Loader::slice(unsigned x, unsigned y, unsigned w, unsigned h)
98 obj.slice = Geometry(x, y, w, h);
101 void Graphic::Loader::border()
103 load_sub(obj.border);
106 void Graphic::Loader::shadow()
108 load_sub(obj.shadow);