1
2 #include "staticmesh.h"
3 #include "rtt_fbo.h"
4 #include "../resources.h"
5
6
StaticMesh(const unsigned char * data,unsigned int data_size)7 StaticMesh::StaticMesh(const unsigned char* data,unsigned int data_size) :
8 m_vertexcount(0),m_vbo(0),m_texture(0),m_vbo_data(),m_data_ptr(0),m_data(data),m_data_size(data_size)
9 {
10 load();
11 build_vbo();
12 render_to_texture(g_resources.texture_mesh_size);
13 }
14
~StaticMesh()15 StaticMesh::~StaticMesh()
16 {
17 if (m_texture)
18 glDeleteTextures(1,&m_texture);
19 }
20
render_to_texture(int t_size)21 void StaticMesh::render_to_texture(int t_size)
22 {
23 RTT *m_rtt = new RTT_FBO(1,t_size,t_size);
24
25 m_rtt->start_render();
26
27 glClearColor(0.0,0.0,0.0,0.0);
28
29 glViewport(0,0,t_size,t_size);
30 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
31 glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity();
32 //glOrtho(0.0,1.0, 0.0,1.0, -1,1);
33 glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity();
34 glScalef(1.95,1.95,1.0);
35
36 draw();
37
38 m_rtt->end_render();
39 m_texture = m_rtt->get_texid();
40
41 delete m_rtt;
42
43 m_texture = move_texture_red_component(m_texture);
44
45 glMatrixMode(GL_PROJECTION); glPopMatrix();
46 glMatrixMode(GL_MODELVIEW); glPopMatrix();
47 }
48
load(void)49 void StaticMesh::load(void)
50 {
51 path_t path = read_path();
52
53 // create outline
54 SVGpath svgpath = SVGpath(path,true,m_segments);
55 pathset_t pathset = svgpath.get_pathset();
56
57 // tesselate into mesh
58 vec2_ary_t verts = Tesselate::Process(pathset);
59 m_vertexcount = verts.size();
60
61 // copy
62 m_vbo_data = vec2_ary_to_float_ary(verts);
63
64 m_aabb = AABB(verts);
65 }
66
67
build_vbo(void)68 void StaticMesh::build_vbo(void)
69 {
70 my_glGenBuffers(1,&m_vbo);
71 my_glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
72 my_glBufferData(GL_ARRAY_BUFFER, m_vbo_data.size()*sizeof(float), &m_vbo_data[0], GL_STATIC_DRAW);
73 my_glBindBuffer(GL_ARRAY_BUFFER, 0);
74 }
75
76 //public
draw(void)77 void StaticMesh::draw(void)
78 {
79 if (m_texture!=0) {
80 g_resources.shader_staticmesh->use();
81
82 glMatrixMode(GL_MODELVIEW);
83 glPushMatrix();
84
85 glScalef(1.02,1.02,1.00); // adjust for texture border
86 draw_textured_quad(1.0,m_texture,true);
87
88 glPopMatrix();
89
90 g_resources.shader_staticmesh->unuse();
91
92 // m_aabb.draw();
93 } else {
94 my_glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
95 glEnableClientState(GL_VERTEX_ARRAY);
96 glVertexPointer(2,GL_FLOAT,0,0);
97
98 glDrawArrays(GL_TRIANGLES,0,m_vertexcount);
99
100 glDisableClientState(GL_VERTEX_ARRAY);
101 my_glBindBuffer(GL_ARRAY_BUFFER, 0);
102 }
103
104 }
105
get_num(void)106 float StaticMesh::get_num(void)
107 {
108 const unsigned short *num = reinterpret_cast<const unsigned short*>(&m_data[m_data_ptr]);
109 m_data_ptr += 2; // 16-bit
110 return ((float)*num / m_divisor);
111 }
112
get_vec2(void)113 vec2 StaticMesh::get_vec2(void)
114 {
115 float x = get_num();
116 float y = get_num();
117 return vec2(x,y);
118 }
119
get_byte(void)120 int StaticMesh::get_byte(void)
121 {
122 const unsigned char num = m_data[m_data_ptr];
123 m_data_ptr++;
124 return num;
125 }
126
read_path(void)127 path_t StaticMesh::read_path(void)
128 {
129 path_t path;
130 while(true) {
131 vec2_ary_t data;
132
133 if (m_data_ptr >= m_data_size)
134 break;
135
136 char cmd = get_byte();
137
138 switch(cmd) {
139 case 'H':
140 case 'V':
141 data.push_back(vec2(get_num(),0.0));
142 break;
143 case 'C':
144 data.push_back(get_vec2());
145 // fallthrough
146 case 'Q':
147 data.push_back(get_vec2());
148 // fallthrough
149 case 'M':
150 case 'L':
151 case 'T':
152 data.push_back(get_vec2());
153 break;
154 case 'Z':
155 case 'z':
156 // nop
157 break;
158 default:
159 assert(false);
160 }
161 path_token_t pt(cmd,data);
162 path.push_back(pt);
163 }
164 return path;
165 }
166