GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
VertexArray.hh
Go to the documentation of this file.
1
2#ifndef VERTEXARRAY_HH
3#define VERTEXARRAY_HH
4
5#define NO_PREPARE_RENDER 1
6
7#include <vector>
8#include <map>
9#include "MyMap.hh"
10#include "VectorTools.hh"
11#include "Effect.hh"
12#include "GameApi.hh"
13
14#include "Tasks.hh"
15//#include "GameApi_low.hh"
16#ifndef HAS_PTHREAD
17#define HAS_PTHREAD 1
18#include <pthread.h>
19#undef PTW32_LEVEL
20#undef PTW32_SCHED_LEVEL
21#endif
22struct LowApi;
23extern LowApi *g_low;
24
25#ifdef NO_PREPARE_RENDER
26
27class Dyn : public VertexArrayDyn
28{
29public:
30 Dyn(VertexArrays *arr);
31 void prepare(int i);
32 void update(int i);
33 void ready();
34 void render();
35 void set_texture(std::vector<GameApi::TXID> vec);
36private:
37 VertexArrays *arr;
38 bool firsttime;
39 unsigned int vao[1];
40 unsigned int buffers[11];
41 unsigned int indices_buffer;
42 bool enabled[11];
43 std::vector<GameApi::TXID> textures;
44};
45#endif
46
47
49{
50public:
52 std::vector<int> texture_many_ids;
53 int bm_id;
54 bool is_texture() { return texture_id!=-1; }
55 bool is_array_texture() { return texture_id>= 700000; }
56 bool is_many_texture() { return texture_many_ids.size()!=0; }
57 VertexArraySet() : texture_id(-1),bm_id(0) { ref.numfaces=0;
58 ref.color=0;
59 ref.facepoint=0;
60 ref.facepoint2=0;
61 ref.texcoords=0;
62 ref.joints=0;
63 ref.weights=0;
64
65 }
67 {
68 ref.numfaces=0;
69 ref.color=0;
70 ref.facepoint=0;
71 ref.facepoint2=0;
72 ref.texcoords=0;
73 ref.joints=0;
74 ref.weights=0;
75 std::mymap<int, Polys*>::iterator it = s.m_set.begin();
76 for(;it!=s.m_set.end();it++)
77 {
78 m_set[(*it).first] = (*it).second; //new Polys(*(*it).second);
79 }
80 const VertexArraySet *curr = &s;
81 while (curr->m_ref) { curr=curr->m_ref; }
82 curr->ref_count++;
83 ref_count=0;
84 m_ref = &s;
85 bm_id = 0;
86 texture_id = s.texture_id;
87 texture_many_ids = s.texture_many_ids;
88 has_normal = s.has_normal;
89 has_attrib = s.has_attrib;
90 has_color = s.has_color;
91 has_texcoord = s.has_texcoord;
92 has_skeleton = s.has_skeleton;
93 }
94 void SetRef(FaceBufferRef r) { ref = r; }
95 void clear_poly_and_poly2(int id);
96 void clear_vectors(int id);
98 {
99 std::mymap<int, Polys*>::iterator it = m_set.begin();
100 for(;it!=m_set.end();it++)
101 {
102 delete m_set[(*it).first];
103 m_set[(*it).first] = new Polys;
104 }
105 }
106 void set_bm_id(int id) { bm_id=0; }
107 int get_bm_id() const { return bm_id; }
109 void set_reserve(int id, int tri_count, int quad_count, int poly_count);
110 void free_reserve(int id);
111 // id is the vertex array num to be used 0 = beginning, 1 = end
112 // num is the number of points (all calls should share same num)
113 void push_poly_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num);
114 void push_poly2_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num);
115
116 void push_normal_with_indices(int id, int num, Vector *vectors, unsigned int *indexes, int points_num);
117 void push_attrib_with_indices(int id, int attrib_id, int num, float *attribs, unsigned int *indexes);
118 void push_attribi_with_indices(int id, int attrib_id, int num, int *attribi, unsigned int *indexes);
119 void push_color_with_indices(int id, int num, unsigned int *colors, unsigned int *indexes, int points_num);
120 void push_texcoord_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num);
121 void push_joint_with_indices(int id, int num, VEC4 *points, unsigned int *indexes, int points_num);
122 void push_weight_with_indices(int id, int num, VEC4 *points, unsigned int *indexes, int points_num);
123
124 void push_poly(int id, int num, Point *points);
125 void push_poly2(int id, int num, Point *points);
126 void push_normal(int id, int num, Vector *vectors);
127 void push_attrib(int id, int attrib_id, int num, float *attribs);
128 void push_attribi(int id, int attrib_id, int num, int *attribi);
129 void push_color(int id, int num, unsigned int *colors);
130 void push_texcoord(int id, int num, Point *points);
131 void push_joint(int id, int num, VEC4 *points);
132 void push_weight(int id, int num, VEC4 *points);
133
134 void split_color(std::vector<float> &vec, unsigned int color);
135 void split_color2(std::vector<float> &vec, unsigned int color);
136
137 // way to get data out
138 int tri_count(int id) const {
139 //if (ref.numfaces!=0) return ref.numvertices;
140 return m_set[id]->tri_polys.size(); }
141 int tri_count2(int id) const {
142 //if (ref.numfaces!=0) return ref.numvertices;
143 return m_set[id]->tri_polys2.size(); }
144 Point *tri_polys(int id) {
145 //if (ref.numfaces!=0) return ref.facepoint;
146 return tri_count(id) ? &m_set[id]->tri_polys[0] : NULL;
147 }
148 const Point *tri_polys2(int id) const {
149 //if (ref.numfaces!=0) return ref.facepoint2;
150 return tri_count2(id) ? &m_set[id]->tri_polys2[0] : NULL; }
151 int quad_count(int id) const {
152 //if (ref.numfaces!=0) return 0; // QUADS NOT SUPPORTED IN GLTF
153 return m_set[id]->quad_polys.size(); }
154 int quad_count2(int id) const {
155 //if (ref.numfaces!=0) return 0;
156 return m_set[id]->quad_polys2.size(); }
157 const Point *quad_polys(int id) const { return quad_count(id) ? &m_set[id]->quad_polys[0] : NULL; }
158 const Point *quad_polys2(int id) const { return quad_count2(id) ? &m_set[id]->quad_polys2[0] : NULL; }
159 int poly_count_f(int id) const { return m_set[id]->poly_polys.size(); }
160 const Point *poly_polys(int id) const { return poly_count_f(id)? &m_set[id]->poly_polys[0] : NULL; }
161 int poly_count2(int id) const { return m_set[id]->poly_polys2.size(); }
162 const Point *poly_polys2(int id) const { return poly_count2(id)? &m_set[id]->poly_polys2[0] : NULL; }
163
164#if 0
165 int poly2_count(int id, int i) const { return m_set[id]->poly_polys[i].size(); }
166#endif
167
168 const unsigned char *indices_char() const { return ref.indices_char; }
169 const unsigned short *indices_short() const { return ref.indices_short; }
170 const unsigned int *indices_int() const { return ref.indices_int; }
171
172 int tri_normal_count(int id) const {
173 //if (ref.numfaces!=0) return ref.numvertices;
174 return m_set[id]->tri_normals.size(); }
175 const Vector *tri_normal_polys(int id) const {
176 //if (ref.numfaces!=0) return ref.pointnormal;
177 return tri_normal_count(id) ? &m_set[id]->tri_normals[0] : NULL; }
178 int quad_normal_count(int id) const { return m_set[id]->quad_normals.size(); }
179 const Vector *quad_normal_polys(int id) const { return quad_normal_count(id) ? &m_set[id]->quad_normals[0] : NULL; }
180 int poly_normal_count(int id) const { return m_set[id]->poly_normals.size(); }
181 const Vector *poly_normal_polys(int id) const { return poly_normal_count(id) ? &m_set[id]->poly_normals[0] : NULL; }
182
183#if 0
184 int poly2_normal_count(int id, int i) const { return m_set[id]->poly_normals[i].size(); }
185#endif
186
187#if 1
188 int tri_attrib_count(int id, int attrib_id) const { return m_set[id]->tri_attribs[attrib_id].size(); }
189 const float *tri_attrib_polys(int id, int attrib_id) const { return tri_attrib_count(id,attrib_id) ? &m_set[id]->tri_attribs[attrib_id][0] : NULL; }
190 int quad_attrib_count(int id, int attrib_id) const { return m_set[id]->quad_attribs[attrib_id].size(); }
191 const float *quad_attrib_polys(int id, int attrib_id) const { return quad_attrib_count(id, attrib_id) ? &m_set[id]->quad_attribs[attrib_id][0] : NULL; }
192 int poly_attrib_count(int id, int attrib_id) const { return m_set[id]->poly_attribs[attrib_id].size(); }
193 int poly2_attrib_count(int id, int attrib_id) const { return m_set[id]->poly_attribs[attrib_id].size(); }
194 const float *poly_attrib_polys(int id, int attrib_id) const { return poly2_attrib_count(id, attrib_id) ? &m_set[id]->poly_attribs[attrib_id][0] : NULL; }
195
196 int tri_attribi_count(int id, int attrib_id) const { return m_set[id]->tri_attribsi[attrib_id].size(); }
197 const int *tri_attribi_polys(int id, int attrib_id) const { return tri_attribi_count(id,attrib_id) ? &m_set[id]->tri_attribsi[attrib_id][0] : NULL; }
198 int quad_attribi_count(int id, int attrib_id) const { return m_set[id]->quad_attribsi[attrib_id].size(); }
199 const int *quad_attribi_polys(int id, int attrib_id) const { return quad_attribi_count(id,attrib_id) ? &m_set[id]->quad_attribsi[attrib_id][0] : NULL; }
200 int poly_attribi_count(int id, int attrib_id) const { return m_set[id]->poly_attribsi[attrib_id].size(); }
201 int poly2_attribi_count(int id, int attrib_id) const { return m_set[id]->poly_attribsi[attrib_id].size(); }
202 const int *poly_attribi_polys(int id, int attrib_id) const { return poly2_attribi_count(id, attrib_id) ? &m_set[id]->poly_attribsi[attrib_id][0] : NULL; }
203
204#endif
205
206 int tri_color_count(int id) const {
207 //if (ref.numfaces!=0) return ref.numvertices; TODO, COLOURS NOT GOING OK IN GLTF
208 return m_set[id]->tri_color.size(); }
209 const float *tri_color_polys(int id) const {
210 //if (ref.numfaces!=0) return ref.color; TODO, COLOURS NOT GOING OK IN GLTF
211 return tri_color_count(id) ? &m_set[id]->tri_color[0] : NULL; }
212 int quad_color_count(int id) const { return m_set[id]->quad_color.size(); }
213 const float *quad_color_polys(int id) const { return quad_color_count(id) ? &m_set[id]->quad_color[0] : NULL; }
214 int poly_color_count(int id) const { return m_set[id]->poly_color.size(); }
215 const float *poly_color_polys(int id) const { return poly_color_count(id) ? &m_set[id]->poly_color[0] : NULL; }
216
217
218
219 int tri_joint_count(int id) const {
220 //if (ref.numfaces!=0) return ref.numvertices;
221 return m_set[id]->tri_joint.size(); }
222 const VEC4 *tri_joint_polys(int id) const {
223 //if (ref.numfaces!=0) return ref.joints;
224
225 return tri_joint_count(id) ? &m_set[id]->tri_joint[0] : NULL; }
226 int quad_joint_count(int id) const { return m_set[id]->quad_joint.size(); }
227 const VEC4 *quad_joint_polys(int id) const { return quad_joint_count(id) ? &m_set[id]->quad_joint[0] : NULL; }
228 int poly_joint_count(int id) const { return m_set[id]->poly_joint.size(); }
229 const VEC4 *poly_joint_polys(int id) const { return poly_joint_count(id) ? &m_set[id]->poly_joint[0] : NULL; }
230
231
232 int tri_weight_count(int id) const {
233 //if (ref.numfaces!=0) return ref.numvertices;
234 return m_set[id]->tri_weight.size(); }
235 const VEC4 *tri_weight_polys(int id) const {
236 //if (ref.numfaces!=0) return ref.weights;
237 return tri_weight_count(id) ? &m_set[id]->tri_weight[0] : NULL; }
238 int quad_weight_count(int id) const { return m_set[id]->quad_weight.size(); }
239 const VEC4 *quad_weight_polys(int id) const { return quad_weight_count(id) ? &m_set[id]->quad_weight[0] : NULL; }
240 int poly_weight_count(int id) const { return m_set[id]->poly_weight.size(); }
241 const VEC4 *poly_weight_polys(int id) const { return poly_weight_count(id) ? &m_set[id]->poly_weight[0] : NULL; }
242
243
244
245
246#if 0
247 int poly2_color_count(int id, int i) const { return m_set[id]->poly_color[i].size(); }
248#endif
249
250 int tri_texcoord_count(int id) const { return m_set[id]->tri_texcoord.size(); }
252 //if (ref.numfaces!=0) return ref.texcoords;
253 return tri_texcoord_count(id) ? &m_set[id]->tri_texcoord[0] : NULL; }
254 int quad_texcoord_count(int id) const { return m_set[id]->quad_texcoord.size(); }
255 Point *quad_texcoord_polys(int id) { return quad_texcoord_count(id) ? &m_set[id]->quad_texcoord[0] : NULL; }
256 int poly_texcoord_count(int id) const { return m_set[id]->poly_texcoord.size(); }
257 const Point *poly_texcoord_polys(int id) const { return poly_texcoord_count(id) ? &m_set[id]->poly_texcoord[0] : NULL; }
258
259
260 void check_m_set(int id);
261 void free_memory();
262 void explode(int id, Point p, float dist);
263 void print_stat(int id);
264 void clone(int id_source, int id_target);
265 void apply_change(DynamicChange *change, int id_source, int id_target, MainLoopEnv &e);
266public:
267 struct Polys {
268 std::vector<Point> tri_polys;
269 std::vector<Point> quad_polys;
270 std::vector<Point> poly_polys;
271 std::vector<Point> tri_polys2;
272 std::vector<Point> quad_polys2;
273 std::vector<Point> poly_polys2;
274
275 std::vector<Vector> tri_normals;
276 std::vector<Vector> quad_normals;
277 std::vector<Vector> poly_normals;
278
279 std::vector<float> tri_color;
280 std::vector<float> quad_color;
281 std::vector<float> poly_color;
282
283 std::vector<Point> tri_texcoord;
284 std::vector<Point> quad_texcoord;
285 std::vector<Point> poly_texcoord;
286
287 std::vector<VEC4> tri_joint;
288 std::vector<VEC4> quad_joint;
289 std::vector<VEC4> poly_joint;
290
291 std::vector<VEC4> tri_weight;
292 std::vector<VEC4> quad_weight;
293 std::vector<VEC4> poly_weight;
294
295
296
300
304
305 };
306public:
307 static void append_to_polys(VertexArraySet::Polys &target, const VertexArraySet::Polys &source);
308
310 mutable int ref_count=0;
311 mutable const VertexArraySet *m_ref=0;
312 bool has_normal=true;
313 bool has_attrib=false;
314 bool has_color=true;
315 bool has_texcoord=true;
316 bool has_skeleton=false;
318};
319
321{
322 unsigned int buffers[7];
323 unsigned int vao[3];
324 unsigned int buffers2[7];
325 unsigned int buffers3[7];
326 unsigned int pos_buffer;
327 unsigned int pos_buffer_matrix;
328 unsigned int normals_buffer;
330 unsigned int color_buffer;
332 std::vector<unsigned int> attrib_buffer;
333 std::vector<unsigned int> attrib_buffer2;
334 std::vector<unsigned int> attrib_buffer3;
335 std::vector<unsigned int> attribi_buffer;
336 std::vector<unsigned int> attribi_buffer2;
337 std::vector<unsigned int> attribi_buffer3;
338 unsigned int indices_buffer;
339};
340
341struct Counts {
345};
346
347Counts CalcOffsets(FaceCollection *coll, int start);
348Counts CalcCounts(FaceCollection *coll, int start, int end);
349
351{
352public:
354 : s(s2), nodelete(false) {
355 int ss = 7;
356 for(int i=0;i<ss;i++)
357 {
358 if (i<3) vao[i]=rend.vao[i];
359 buffers[i]=rend.buffers[i];
360 buffers2[i]=rend.buffers2[i];
361 buffers3[i]=rend.buffers3[i];
362 }
363 tri_count = rend.tri_count;
364 quad_count = rend.quad_count;
365 poly_count = rend.poly_count;
366 pos_buffer = rend.pos_buffer;
378 }
381 GameApi::PinIn prepare(int id, bool isnull=false, int tri_count=-1, int quad_count=-1, int poly_count=-1);
382 GameApi::PinIn update(int id);
383 GameApi::PinIn update_tri(int id, int buffer_id, int start, int end);
384 GameApi::PinIn render(int id);
385 void sort_blit(int id, Matrix in_MV);
386 GameApi::PinIn prepare_instanced(int id, Point *positions, Vector *normals, float *colors, int size, int colour_divisor);
387 GameApi::PinIn prepare_instanced_matrix(int id, Matrix *positions, Vector *normals, float *colors, int size, int colour_divisor);
388 GameApi::PinIn prepare_indices(int id, const unsigned char *ind1, const unsigned short *ind2, const unsigned int *ind3, int facecount);
389 GameApi::PinIn render_instanced(int id, Point *positions, Vector *normals, float *colors, int size, int colours_divisor);
390 GameApi::PinIn render_instanced_matrix(int id, Matrix *positions, Vector *normals, float *colors, int size, int colours_divisor);
393 void set_no_delete(bool b) { nodelete=b; }
394 void del();
396public:
397 //LowApi *g_low; // doesnt work because ctor is run before global variable is initialized
399 unsigned int buffers[7];
400 unsigned int vao[3];
401 unsigned int buffers2[7];
402 unsigned int buffers3[7];
406 unsigned int pos_buffer;
407 unsigned int pos_buffer_matrix;
408 unsigned int normals_buffer;
410 unsigned int color_buffer;
412 std::vector<unsigned int> attrib_buffer;
413 std::vector<unsigned int> attrib_buffer2;
414 std::vector<unsigned int> attrib_buffer3;
415 std::vector<unsigned int> attribi_buffer;
416 std::vector<unsigned int> attribi_buffer2;
417 std::vector<unsigned int> attribi_buffer3;
418 unsigned int indices_buffer;
420 bool bufferdata_done=false;
421};
422
424{
425public:
426 RenderVertexArray2(VertexArraySet &s1, VertexArraySet &s2) : s1(s1), s2(s2) { }
427 void prepare(int id);
428 void render(int id, int a1, int a2, int a3, int a4,
429 int aa1, int aa2, int aa3, int aa4);
430private:
431 VertexArraySet &s1;
432 VertexArraySet &s2;
433};
434
436{
437public:
438 FaceCollectionVertexArray2(const FaceCollection &coll, VertexArraySet &s) : coll(coll), s(s) { }
439 void reserve_fixed2(int id, int count_tri, int count_quad, int count_poly)
440 {
441 int tri_count=count_tri*3;
442 int quad_count=count_quad*6;
443 int poly_count=count_poly*3;
444 s.set_reserve(id, tri_count, quad_count, poly_count);
445 }
446 void reserve_fixed(int id, int count) {
447 //int ss = coll.NumFaces();
448 int tri_count=count*3;
449 int quad_count=count*4;
450 int poly_count=count*3;
451 s.set_reserve(id, tri_count, quad_count, poly_count);
452 }
453 void reserve(int id)
454 {
455 int ss = coll.NumFaces();
456 int tri_count=4;
457 int quad_count=4;
458 int poly_count=4;
459 for(int i=0;i<ss;i++)
460 {
461 int w = coll.NumPoints(i);
462 if (w==3)
463 {
464 tri_count+=3;
465 }
466 else if (w==4)
467 {
468 quad_count+=4;
469 }
470 else
471 {
472 poly_count+=3;
473 }
474 }
475 s.set_reserve(id, tri_count, quad_count, poly_count);
476 }
477 void copy(int start_range, int end_range, std::vector<int> attribs = std::vector<int>(), std::vector<int> attribsi = std::vector<int>());
478private:
479 Point p[200];
480 Point p2[200];
481 Vector v[200];
482#if 1
483 float a[30][200];
484 int ai[30][200];
485#endif
486 unsigned int c[200];
487 Point tex[200];
488 VEC4 joints[200];
489 VEC4 weights[200];
490
491 const FaceCollection &coll;
493};
494
495#ifndef ARM
496class ThreadedPrepare;
498{
500 pthread_t thread_id;
505 std::vector<int> attrib;
506 std::vector<int> attribi;
510 pthread_mutex_t *mutex1;
511 pthread_mutex_t *mutex2;
512 pthread_mutex_t *mutex3;
513 pthread_mutex_t *gmutex;
514 pthread_mutex_t *gmutex2;
515 pthread_cond_t *g_cond;
516 pthread_cond_t *g_cond2;
519};
520void *thread_func(void *data);
521extern long long g_copy_total;
522extern long long g_copy_progress;
523extern int g_pthread_count;
524
526{
527public:
528 ThreadedPrepare(FaceCollection *faces) : faces(faces) { }
529 int push_thread(int start_range, int end_range, std::vector<int> attrib=std::vector<int>(), std::vector<int> attribi=std::vector<int>())
530 {
531 g_copy_total += end_range-start_range;
532
533 //std::cout << "Thread " << start_range << " " << end_range << std::endl;
535 s->set_reserve(0, end_range-start_range, end_range-start_range, 0 /*end_range-start_range*/);
536 sets.push_back(s);
538 va2.push_back(va);
540 info->set = s;
541 info->va = va;
542 info->start_range = start_range;
543 info->end_range = end_range;
544 info->attrib = attrib;
545 info->attribi = attribi;
546 info->r = 0;
547 info->faces = 0;
548 info->prep = 0;
549 ti.push_back(info);
550
551 //pthread_attr_t attr;
552
553 // pthread_attr_init(&attr);
554 //pthread_attr_setstacksize(&attr, 300000);
555 //std::cout << "phread_create" << std::endl;
557 //pthread_create(&info->thread_id, &attr, &thread_func, (void*)info);
558 tasks_add(3000,&thread_func,(void*)info);
559 //std::cout << "pthread_create_return: " << val << std::endl;
560 //pthread_attr_destroy(&attr);
561 //std::cout << "returning: " << sets.size()-1 << std::endl;
562 return sets.size()-1;
563 }
564
565 int push_thread2(int start_range, int end_range, RenderVertexArray *r, pthread_mutex_t *mutex1, pthread_mutex_t *mutex2, pthread_mutex_t *mutex3, pthread_mutex_t *gmutex, pthread_mutex_t *gmutex2, pthread_cond_t *g_cond, pthread_cond_t *g_cond2,std::vector<int> attrib=std::vector<int>(), std::vector<int> attribi=std::vector<int>())
566 {
567 g_copy_total += end_range-start_range;
568 //std::cout << "Thread " << start_range << " " << end_range << std::endl;
570 //s->set_reserve(0, (end_range-start_range)/10+1, (end_range-start_range)/10+1, (end_range-start_range)/10+1);
571 sets.push_back(s);
573 va2.push_back(va);
575 info->set = s;
576 info->va = va;
577 info->start_range = start_range;
578 info->end_range = end_range;
579 info->attrib = attrib;
580 info->attribi = attribi;
581 info->r = r;
582 info->faces = faces;
583 info->prep = this;
584 info->mutex1 = mutex1;
585 info->mutex2 = mutex2;
586 info->mutex3 = mutex3;
587 info->gmutex = gmutex;
588 info->gmutex2 = gmutex2;
589 info->g_cond = g_cond;
590 info->g_cond2 = g_cond2;
591 ti.push_back(info);
592
593
594 tasks_add(3003,&thread_func,(void*)info);
595#if 0
596 pthread_attr_t attr;
597
598 pthread_attr_init(&attr);
599 pthread_attr_setstacksize(&attr, 3000000);
600 //std::cout << "phread_create" << std::endl;
601 pthread_create(&info->thread_id, &attr, &thread_func, (void*)info);
602 //std::cout << "pthread_create_return: " << val << std::endl;
603 pthread_attr_destroy(&attr);
604#endif
605 //std::cout << "returning: " << sets.size()-1 << std::endl;
606 return sets.size()-1;
607 }
608
609 void join(int id)
610 {
611 tasks_join(3003);
612#if 0
613 void *res;
614 //std::cout << "phread_join" << id << std::endl;
615 pthread_join(ti[id]->thread_id, &res);
616#endif
617 g_copy_total=0;
619 //ti.clear();
620 //sets.clear();
621 //va2.clear();
622 delete ti[id];
623 delete sets[id];
624 delete va2[id];
625 ti[id]=0;
626 sets[id]=0;
627 va2[id]=0;
628 }
629 void transfer_to_gpu_mem(VertexArraySet *set, RenderVertexArray &r, int rend_id, int buf, int start, int end) {
631 r.fetch_buffers(ids);
632 VertexArraySet * vs = set;
633 RenderVertexArray rend(*vs, r /*g_low, *vs*/);
634 rend.update_buffers(ids);
635 rend.set_no_delete(true);
636 rend.update_tri(rend_id, buf, start,end);
637 }
639 {
640 //std::cout << "collect" << std::endl;
641
643 res->set_reserve(0, 1,1,1);
644 int s = sets.size();
645 for(int i=0;i<s;i++)
646 {
647 VertexArraySet * vs = sets[i];
649 }
650 return res;
651 }
653 {
654 //std::cout << "threaded_prepare dtor" << std::endl;
655
656 //int s2 = ti.size();
657 //for(int i2=0;i2<s2;i2++)
658 // {
659 // if (ti[i2])
660 // join(i2);
661 //}
662
663 int s = sets.size();
664 for(int i=0;i<s;i++)
665 {
666 delete sets[i];
667 delete va2[i];
668 delete ti[i];
669 }
670 }
671private:
672 std::vector<VertexArraySet *> sets;
673 std::vector<FaceCollectionVertexArray2 *> va2;
674 std::vector<ThreadInfo *> ti;
675 FaceCollection *faces;
676};
677#endif
678
679#endif
680
Env e
Definition Common.cc:2
Color2 colors[]
Definition Effect.cc:56
LowApi * g_low
Definition GameApi_low.cc:1684
int g_pthread_count
Definition GameApi_dep_arr_render.cc:9
IMPORT void tasks_add(int id, void *(*fptr)(void *), void *data)
Definition GameApi_dep_env.cc:484
IMPORT void tasks_join(int id)
Definition GameApi_dep_env.cc:518
EditorGuiWidgetAtlas GuiWidgetForward render()
Definition GameApi_gui.cc:1412
long long g_copy_progress
Definition VertexArray.cc:4178
pthread_cond_t * g_cond
Definition GameApi_pl.cc:6340
long long g_copy_total
Definition VertexArray.cc:4177
LowApi * g_low
Definition GameApi_low.cc:1684
long long g_copy_progress
Definition VertexArray.cc:4178
Counts CalcOffsets(FaceCollection *coll, int start)
Definition VertexArray.cc:4157
int g_pthread_count
Definition GameApi_dep_arr_render.cc:9
void * thread_func(void *data)
Definition VertexArray.cc:4058
Counts CalcCounts(FaceCollection *coll, int start, int end)
Definition VertexArray.cc:4137
long long g_copy_total
Definition VertexArray.cc:4177
void info(std::string info)
Definition check.cc:24
void ready()
Definition VertexArray.cc:4492
void prepare(int i)
Definition VertexArray.cc:4312
void render()
Definition VertexArray.cc:4523
Dyn(VertexArrays *arr)
Definition VertexArray.cc:4306
void update(int i)
Definition VertexArray.cc:4458
void set_texture(std::vector< GameApi::TXID > vec)
Definition VertexArray.cc:4307
Definition GraphI.hh:2495
Definition VertexArray.hh:436
void copy(int start_range, int end_range, std::vector< int > attribs=std::vector< int >(), std::vector< int > attribsi=std::vector< int >())
Definition VertexArray.cc:4184
void reserve_fixed(int id, int count)
Definition VertexArray.hh:446
void reserve_fixed2(int id, int count_tri, int count_quad, int count_poly)
Definition VertexArray.hh:439
void reserve(int id)
Definition VertexArray.hh:453
FaceCollectionVertexArray2(const FaceCollection &coll, VertexArraySet &s)
Definition VertexArray.hh:438
Definition EffectI.hh:212
Definition VectorTools.hh:279
RenderVertexArray2(VertexArraySet &s1, VertexArraySet &s2)
Definition VertexArray.hh:426
void prepare(int id)
Definition VertexArray.hh:351
void set_no_delete(bool b)
Definition VertexArray.hh:393
void update_buffers(RenderVertexArray_bufferids ids)
Definition VertexArray.cc:2127
bool bufferdata_done
Definition VertexArray.hh:420
std::vector< unsigned int > attribi_buffer2
Definition VertexArray.hh:416
VertexArraySet & s
Definition VertexArray.hh:398
bool nodelete
Definition VertexArray.hh:419
GameApi::PinIn update_tri(int id, int buffer_id, int start, int end)
Definition VertexArray.cc:1431
std::vector< unsigned int > attribi_buffer
Definition VertexArray.hh:415
std::vector< unsigned int > attrib_buffer
Definition VertexArray.hh:412
unsigned int buffers[7]
Definition VertexArray.hh:399
void del()
Definition VertexArray.cc:2700
unsigned int normals_buffer
Definition VertexArray.hh:408
std::vector< unsigned int > attrib_buffer3
Definition VertexArray.hh:414
std::vector< unsigned int > attribi_buffer3
Definition VertexArray.hh:417
unsigned int color_buffer
Definition VertexArray.hh:410
GameApi::PinIn prepare(int id, bool isnull=false, int tri_count=-1, int quad_count=-1, int poly_count=-1)
Definition VertexArray.cc:2255
GameApi::PinIn prepare_indices(int id, const unsigned char *ind1, const unsigned short *ind2, const unsigned int *ind3, int facecount)
Definition VertexArray.cc:2793
void sort_blit(int id, Matrix in_MV)
Definition VertexArray.cc:2019
RenderVertexArray(VertexArraySet &s2, RenderVertexArray &rend)
Definition VertexArray.hh:353
GameApi::PinIn render_instanced_matrix(int id, Matrix *positions, Vector *normals, float *colors, int size, int colours_divisor)
Definition VertexArray.cc:2945
int quad_count
Definition VertexArray.hh:404
GameApi::PinIn prepare_instanced(int id, Point *positions, Vector *normals, float *colors, int size, int colour_divisor)
Definition VertexArray.cc:2823
GameApi::PinIn prepare_instanced_matrix(int id, Matrix *positions, Vector *normals, float *colors, int size, int colour_divisor)
Definition VertexArray.cc:2740
unsigned int buffers2[7]
Definition VertexArray.hh:401
GameApi::PinIn update(int id)
Definition VertexArray.cc:2044
unsigned int color_buffer_matrix
Definition VertexArray.hh:411
RenderVertexArray(LowApi *g_low, VertexArraySet &s)
Definition VertexArray.hh:379
int poly_count
Definition VertexArray.hh:405
~RenderVertexArray()
Definition VertexArray.hh:395
unsigned int vao[3]
Definition VertexArray.hh:400
unsigned int pos_buffer
Definition VertexArray.hh:406
void fetch_buffers(RenderVertexArray_bufferids &ids)
Definition VertexArray.cc:2191
GameApi::PinIn render_instanced(int id, Point *positions, Vector *normals, float *colors, int size, int colours_divisor)
Definition VertexArray.cc:3316
unsigned int buffers3[7]
Definition VertexArray.hh:402
unsigned int indices_buffer
Definition VertexArray.hh:418
unsigned int normals_buffer_matrix
Definition VertexArray.hh:409
unsigned int pos_buffer_matrix
Definition VertexArray.hh:407
int tri_count
Definition VertexArray.hh:403
std::vector< unsigned int > attrib_buffer2
Definition VertexArray.hh:413
Definition VertexArray.hh:526
int push_thread(int start_range, int end_range, std::vector< int > attrib=std::vector< int >(), std::vector< int > attribi=std::vector< int >())
Definition VertexArray.hh:529
~ThreadedPrepare()
Definition VertexArray.hh:652
void transfer_to_gpu_mem(VertexArraySet *set, RenderVertexArray &r, int rend_id, int buf, int start, int end)
Definition VertexArray.hh:629
int push_thread2(int start_range, int end_range, RenderVertexArray *r, pthread_mutex_t *mutex1, pthread_mutex_t *mutex2, pthread_mutex_t *mutex3, pthread_mutex_t *gmutex, pthread_mutex_t *gmutex2, pthread_cond_t *g_cond, pthread_cond_t *g_cond2, std::vector< int > attrib=std::vector< int >(), std::vector< int > attribi=std::vector< int >())
Definition VertexArray.hh:565
void join(int id)
Definition VertexArray.hh:609
ThreadedPrepare(FaceCollection *faces)
Definition VertexArray.hh:528
VertexArraySet * collect()
Definition VertexArray.hh:638
Definition VectorTools.hh:119
Definition VectorTools.hh:125
Definition EffectI.hh:68
Definition VertexArray.hh:49
const Point * poly_polys(int id) const
Definition VertexArray.hh:160
const float * tri_attrib_polys(int id, int attrib_id) const
Definition VertexArray.hh:189
int quad_color_count(int id) const
Definition VertexArray.hh:212
const unsigned short * indices_short() const
Definition VertexArray.hh:169
VertexArraySet()
Definition VertexArray.hh:57
const float * tri_color_polys(int id) const
Definition VertexArray.hh:209
int poly_count_f(int id) const
Definition VertexArray.hh:159
const Vector * poly_normal_polys(int id) const
Definition VertexArray.hh:181
const unsigned int * indices_int() const
Definition VertexArray.hh:170
void push_joint_with_indices(int id, int num, VEC4 *points, unsigned int *indexes, int points_num)
Definition VertexArray.cc:783
Point * tri_texcoord_polys(int id)
Definition VertexArray.hh:251
void push_attrib_with_indices(int id, int attrib_id, int num, float *attribs, unsigned int *indexes)
const VEC4 * quad_joint_polys(int id) const
Definition VertexArray.hh:227
int quad_attrib_count(int id, int attrib_id) const
Definition VertexArray.hh:190
int quad_weight_count(int id) const
Definition VertexArray.hh:238
void push_attribi(int id, int attrib_id, int num, int *attribi)
Definition VertexArray.cc:596
void set_reserve(int id, int tri_count, int quad_count, int poly_count)
Definition VertexArray.cc:169
int quad_normal_count(int id) const
Definition VertexArray.hh:178
bool is_texture()
Definition VertexArray.hh:54
int tri_color_count(int id) const
Definition VertexArray.hh:206
void push_poly2_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num)
Definition VertexArray.cc:344
const VEC4 * tri_joint_polys(int id) const
Definition VertexArray.hh:222
int tri_weight_count(int id) const
Definition VertexArray.hh:232
static void append_to_polys(VertexArraySet::Polys &target, const VertexArraySet::Polys &source)
Definition VertexArray.cc:1254
const Point * poly_polys2(int id) const
Definition VertexArray.hh:162
void push_normal_with_indices(int id, int num, Vector *vectors, unsigned int *indexes, int points_num)
Definition VertexArray.cc:448
VertexArraySet(const VertexArraySet &s)
Definition VertexArray.hh:66
const float * poly_attrib_polys(int id, int attrib_id) const
Definition VertexArray.hh:194
int tri_attribi_count(int id, int attrib_id) const
Definition VertexArray.hh:196
void push_joint(int id, int num, VEC4 *points)
Definition VertexArray.cc:841
void push_attribi_with_indices(int id, int attrib_id, int num, int *attribi, unsigned int *indexes)
const unsigned char * indices_char() const
Definition VertexArray.hh:168
void clear_poly_and_poly2(int id)
Definition VertexArray.cc:121
void SetRef(FaceBufferRef r)
Definition VertexArray.hh:94
int tri_attrib_count(int id, int attrib_id) const
Definition VertexArray.hh:188
int quad_count2(int id) const
Definition VertexArray.hh:154
void push_weight(int id, int num, VEC4 *points)
Definition VertexArray.cc:946
int poly_joint_count(int id) const
Definition VertexArray.hh:228
const VEC4 * poly_weight_polys(int id) const
Definition VertexArray.hh:241
void push_texcoord_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num)
Definition VertexArray.cc:994
FaceBufferRef ref
Definition VertexArray.hh:317
bool has_color
Definition VertexArray.hh:314
const VEC4 * poly_joint_polys(int id) const
Definition VertexArray.hh:229
const VEC4 * tri_weight_polys(int id) const
Definition VertexArray.hh:235
const VertexArraySet * m_ref
Definition VertexArray.hh:311
bool has_attrib
Definition VertexArray.hh:313
void check_m_set(int id)
Definition VertexArray.cc:25
void push_texcoord(int id, int num, Point *points)
Definition VertexArray.cc:1051
int poly2_attribi_count(int id, int attrib_id) const
Definition VertexArray.hh:201
const int * poly_attribi_polys(int id, int attrib_id) const
Definition VertexArray.hh:202
const int * tri_attribi_polys(int id, int attrib_id) const
Definition VertexArray.hh:197
int quad_attribi_count(int id, int attrib_id) const
Definition VertexArray.hh:198
const Point * quad_polys(int id) const
Definition VertexArray.hh:157
const Point * tri_polys2(int id) const
Definition VertexArray.hh:148
bool is_many_texture()
Definition VertexArray.hh:56
void push_attrib(int id, int attrib_id, int num, float *attribs)
Definition VertexArray.cc:551
const Vector * quad_normal_polys(int id) const
Definition VertexArray.hh:179
void push_color_with_indices(int id, int num, unsigned int *colors, unsigned int *indexes, int points_num)
Definition VertexArray.cc:684
void push_poly_with_indices(int id, int num, Point *points, unsigned int *indexes, int points_num)
Definition VertexArray.cc:243
void push_normal(int id, int num, Vector *vectors)
Definition VertexArray.cc:505
int texture_id
Definition VertexArray.hh:51
void print_stat(int id)
Definition VertexArray.cc:34
int poly_attribi_count(int id, int attrib_id) const
Definition VertexArray.hh:200
~VertexArraySet()
Definition VertexArray.cc:1165
std::mymap< int, Polys * > m_set
Definition VertexArray.hh:309
void apply_change(DynamicChange *change, int id_source, int id_target, MainLoopEnv &e)
Definition VertexArray.cc:1152
const float * poly_color_polys(int id) const
Definition VertexArray.hh:215
void clear_arrays()
Definition VertexArray.hh:97
const VEC4 * quad_weight_polys(int id) const
Definition VertexArray.hh:239
int ref_count
Definition VertexArray.hh:310
int quad_texcoord_count(int id) const
Definition VertexArray.hh:254
bool is_array_texture()
Definition VertexArray.hh:55
int tri_count2(int id) const
Definition VertexArray.hh:141
void free_reserve(int id)
Definition VertexArray.cc:137
void push_weight_with_indices(int id, int num, VEC4 *points, unsigned int *indexes, int points_num)
Definition VertexArray.cc:889
void push_poly2(int id, int num, Point *points)
Definition VertexArray.cc:401
void explode(int id, Point p, float dist)
Definition VertexArray.cc:47
std::vector< int > texture_many_ids
Definition VertexArray.hh:52
int bm_id
Definition VertexArray.hh:53
int poly_count2(int id) const
Definition VertexArray.hh:161
int poly_normal_count(int id) const
Definition VertexArray.hh:180
void split_color2(std::vector< float > &vec, unsigned int color)
Definition VertexArray.cc:660
int poly_attrib_count(int id, int attrib_id) const
Definition VertexArray.hh:192
int poly2_attrib_count(int id, int attrib_id) const
Definition VertexArray.hh:193
void clear_vectors(int id)
Definition VertexArray.cc:85
const Point * quad_polys2(int id) const
Definition VertexArray.hh:158
const Point * poly_texcoord_polys(int id) const
Definition VertexArray.hh:257
bool has_skeleton
Definition VertexArray.hh:316
int poly_color_count(int id) const
Definition VertexArray.hh:214
int quad_joint_count(int id) const
Definition VertexArray.hh:226
const int * quad_attribi_polys(int id, int attrib_id) const
Definition VertexArray.hh:199
bool has_normal
Definition VertexArray.hh:312
void free_memory()
Definition VertexArray.cc:1180
int tri_texcoord_count(int id) const
Definition VertexArray.hh:250
int tri_count(int id) const
Definition VertexArray.hh:138
Point * tri_polys(int id)
Definition VertexArray.hh:144
const float * quad_attrib_polys(int id, int attrib_id) const
Definition VertexArray.hh:191
void push_color(int id, int num, unsigned int *colors)
Definition VertexArray.cc:738
int tri_joint_count(int id) const
Definition VertexArray.hh:219
int poly_texcoord_count(int id) const
Definition VertexArray.hh:256
void clone(int id_source, int id_target)
Definition VertexArray.cc:1114
int get_bm_id() const
Definition VertexArray.hh:107
void set_bm_id(int id)
Definition VertexArray.hh:106
const Vector * tri_normal_polys(int id) const
Definition VertexArray.hh:175
void push_poly(int id, int num, Point *points)
Definition VertexArray.cc:299
int poly_weight_count(int id) const
Definition VertexArray.hh:240
Point * quad_texcoord_polys(int id)
Definition VertexArray.hh:255
int quad_count(int id) const
Definition VertexArray.hh:151
int tri_normal_count(int id) const
Definition VertexArray.hh:172
void split_color(std::vector< float > &vec, unsigned int color)
Definition VertexArray.cc:638
const float * quad_color_polys(int id) const
Definition VertexArray.hh:213
bool has_texcoord
Definition VertexArray.hh:315
Definition EffectI.hh:102
Definition MyMap.hh:15
background color
Definition gameapi_example.php:46
lazy data
Definition meshpage.php:1583
n< br > font size
Definition meshpage.php:3536
Definition VertexArray.hh:341
int tri_count
Definition VertexArray.hh:342
int poly_count
Definition VertexArray.hh:344
int quad_count
Definition VertexArray.hh:343
Definition EffectI.hh:171
Definition GameApi.hh:46
Definition GameApi_low.hh:812
Definition GraphI.hh:1502
Definition Parser.cc:60
Definition VertexArray.hh:321
std::vector< unsigned int > attrib_buffer3
Definition VertexArray.hh:334
std::vector< unsigned int > attribi_buffer2
Definition VertexArray.hh:336
unsigned int vao[3]
Definition VertexArray.hh:323
unsigned int buffers3[7]
Definition VertexArray.hh:325
unsigned int buffers2[7]
Definition VertexArray.hh:324
unsigned int indices_buffer
Definition VertexArray.hh:338
unsigned int pos_buffer_matrix
Definition VertexArray.hh:327
std::vector< unsigned int > attribi_buffer3
Definition VertexArray.hh:337
unsigned int normals_buffer_matrix
Definition VertexArray.hh:329
unsigned int pos_buffer
Definition VertexArray.hh:326
std::vector< unsigned int > attribi_buffer
Definition VertexArray.hh:335
std::vector< unsigned int > attrib_buffer2
Definition VertexArray.hh:333
unsigned int normals_buffer
Definition VertexArray.hh:328
unsigned int color_buffer
Definition VertexArray.hh:330
unsigned int color_buffer_matrix
Definition VertexArray.hh:331
unsigned int buffers[7]
Definition VertexArray.hh:322
std::vector< unsigned int > attrib_buffer
Definition VertexArray.hh:332
Definition VertexArray.hh:498
ThreadInfo()
Definition VertexArray.hh:499
pthread_cond_t * g_cond2
Definition VertexArray.hh:516
pthread_mutex_t * gmutex
Definition VertexArray.hh:513
pthread_mutex_t * mutex2
Definition VertexArray.hh:511
std::vector< int > attrib
Definition VertexArray.hh:505
ThreadedPrepare * prep
Definition VertexArray.hh:509
VertexArraySet * set
Definition VertexArray.hh:501
pthread_mutex_t * mutex3
Definition VertexArray.hh:512
pthread_mutex_t * mutex1
Definition VertexArray.hh:510
int end_range
Definition VertexArray.hh:504
std::vector< int > attribi
Definition VertexArray.hh:506
RenderVertexArray * r
Definition VertexArray.hh:507
FaceCollection * faces
Definition VertexArray.hh:508
Counts ct2_offsets
Definition VertexArray.hh:517
Counts ct2_counts
Definition VertexArray.hh:518
FaceCollectionVertexArray2 * va
Definition VertexArray.hh:502
pthread_cond_t * g_cond
Definition VertexArray.hh:515
int start_range
Definition VertexArray.hh:503
pthread_t thread_id
Definition VertexArray.hh:500
pthread_mutex_t * gmutex2
Definition VertexArray.hh:514
Definition VertexArray.hh:267
std::vector< Point > tri_polys2
Definition VertexArray.hh:271
std::vector< Vector > tri_normals
Definition VertexArray.hh:275
std::vector< VEC4 > tri_weight
Definition VertexArray.hh:291
std::vector< VEC4 > poly_joint
Definition VertexArray.hh:289
std::vector< Point > tri_texcoord
Definition VertexArray.hh:283
std::mymap< int, std::vector< float > > quad_attribs
Definition VertexArray.hh:298
std::vector< float > poly_color
Definition VertexArray.hh:281
std::vector< Point > poly_texcoord
Definition VertexArray.hh:285
std::vector< Point > quad_texcoord
Definition VertexArray.hh:284
std::vector< Vector > poly_normals
Definition VertexArray.hh:277
std::mymap< int, std::vector< int > > tri_attribsi
Definition VertexArray.hh:301
std::vector< float > quad_color
Definition VertexArray.hh:280
std::vector< Point > poly_polys
Definition VertexArray.hh:270
std::vector< Point > quad_polys
Definition VertexArray.hh:269
std::vector< Point > poly_polys2
Definition VertexArray.hh:273
std::vector< VEC4 > tri_joint
Definition VertexArray.hh:287
std::vector< VEC4 > poly_weight
Definition VertexArray.hh:293
std::mymap< int, std::vector< float > > poly_attribs
Definition VertexArray.hh:299
std::vector< float > tri_color
Definition VertexArray.hh:279
std::mymap< int, std::vector< int > > quad_attribsi
Definition VertexArray.hh:302
std::mymap< int, std::vector< int > > poly_attribsi
Definition VertexArray.hh:303
std::mymap< int, std::vector< float > > tri_attribs
Definition VertexArray.hh:297
std::vector< Vector > quad_normals
Definition VertexArray.hh:276
std::vector< VEC4 > quad_weight
Definition VertexArray.hh:292
std::vector< Point > quad_polys2
Definition VertexArray.hh:272
std::vector< VEC4 > quad_joint
Definition VertexArray.hh:288
std::vector< Point > tri_polys
Definition VertexArray.hh:268
num
Definition view.php:2821