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