72 if(m_mesh.vertex_count() == 0)
76 const std::vector<vec3>& positions= m_mesh.positions();
77 std::vector<unsigned> indices= m_mesh.indices();
80 std::map<vec3, unsigned, vec3_less>
vertex;
81 std::vector<unsigned> remap( indices.size() );
82 for(
unsigned i= 0; i < positions.size(); i++)
84 auto v=
vertex.insert( { positions[i], i } );
85 remap[i]= v.first->second;
88 for(
unsigned i= 0; i < indices.size(); i++)
89 indices[i]= remap[ indices[i] ];
91 printf(
"remap %u/%u vertices...\n",
unsigned(
vertex.size()),
unsigned(remap.size()));
94 std::set<unsigned> cluster;
95 std::vector<unsigned> cluster_id(indices.size(), -1);
96 std::vector<unsigned> triangle_id;
97 triangle_id.reserve(indices.size()/3);
100 for(
unsigned i= 0; i < indices.size(); i++)
103 unsigned a= indices[i];
110 if(cluster.size() >= 32)
116 triangle_id.push_back(
id);
118 unsigned count=
id+1;
122 std::vector<vec3> colors( count );
124 std::random_device hwseed;
125 std::default_random_engine rng( hwseed() );
126 std::uniform_real_distribution<float> uniform;
128 for(
unsigned i= 0; i < colors.size(); i++)
129 colors[i]= { uniform(rng), uniform(rng), uniform(rng) };
132 std::vector<vec3> vertex_colors;
133 std::vector<vec3> vertex_positions;
134 vertex_colors.reserve( indices.size() );
135 vertex_positions.reserve( indices.size() );
136 for(
unsigned i= 0; i +2 < indices.size(); i+= 3)
138 unsigned a= indices[i];
139 unsigned b= indices[i+1];
140 unsigned c= indices[i+2];
142 vertex_positions.push_back( positions[ a ] );
143 vertex_positions.push_back( positions[ b ] );
144 vertex_positions.push_back( positions[ c ] );
146 vertex_colors.push_back( colors[ triangle_id[i/3] ] );
147 vertex_colors.push_back( colors[ triangle_id[i/3] ] );
148 vertex_colors.push_back( colors[ triangle_id[i/3] ] );
151 glGenVertexArrays(1, &vao);
152 glBindVertexArray(vao);
154 glGenBuffers(1, &vertex_buffer);
155 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
156 glBufferData(GL_ARRAY_BUFFER, vertex_positions.size() *
sizeof(
vec3), vertex_positions.data(), GL_STATIC_DRAW);
157 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
158 glEnableVertexAttribArray(0);
160 glGenBuffers(1, &cluster_buffer);
161 glBindBuffer(GL_ARRAY_BUFFER, cluster_buffer);
162 glBufferData(GL_ARRAY_BUFFER, vertex_colors.size() *
sizeof(
vec3), vertex_colors.data(), GL_STATIC_DRAW);
163 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
164 glEnableVertexAttribArray(1);
168 m_mesh.bounds(pmin, pmax);
175 m_program_display=
read_program(
"gkit2_tutos/M2/mesh_display.glsl");
179 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
182 glDepthFunc(GL_LESS);
183 glEnable(GL_DEPTH_TEST);
202 reload_program(m_program,
"gkit2_tutos/M2/mesh.glsl");
205 reload_program(m_program_display,
"gkit2_tutos/M2/mesh_display.glsl");
210 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
216 Transform mvp= projection * view * model;
219 glBindVertexArray(vao);
220 glUseProgram(m_program_display);
221 program_uniform(m_program_display,
"mvpMatrix", mvp);
223 glDrawArrays(GL_TRIANGLES, 0, m_mesh.index_count());
226 float r= float(
int(
global_time() / 40) % 40) / float(40);
228 glBindVertexArray(0);
229 glUseProgram(m_program);
230 program_uniform(m_program,
"color",
Color(r,0,0));
231 program_uniform(m_program,
"mvpMatrix", mvp);
233 glDrawMeshTasksEXT(1, 1, 1);