1 #include "ocme_definition.h"
2 #include "impostor_definition.h"
3 
Verify()4 void OCME::Verify(){
5 
6 	/* */
7 	CellsIterator ci;
8 
9 	{
10 		lgn->Append("CHECK IF: ecd/rd exists for each cell");lgn->Push();
11 		for(ci = cells.begin(); ci != cells.end(); ++ci){
12 			RAssert( (*ci).second->ecd);
13 			RAssert( (*ci).second->rd);
14 		}
15 	}
16 
17 	{
18 		lgn->Append("CHECK IF: load/unload work");lgn->Push();
19 		for(ci = cells.begin(); ci != cells.end(); ++ci){
20 			Chain<OVertex> * vert = (*ci).second->vert;
21 			Chain<OFace> * face = (*ci).second->face;
22 			vert->LoadAll();
23 			face->LoadAll();
24 			vert->FreeAll();
25 			face->FreeAll();
26 		}
27 	}
28 
29 	{
30 		lgn->Append("CHECK IF: faces point to vertex inside the cells");lgn->Push();
31 		for(ci = cells.begin(); ci != cells.end(); ++ci){
32 			Chain<OVertex> * vert = (*ci).second->vert;
33 			Chain<OFace> * face = (*ci).second->face;
34 
35 			for(unsigned int fi = 0 ; fi < face->Size();++fi)
36 				for(unsigned int vi = 0 ; vi <3;++vi)
37 					RAssert((*face)[fi][vi] < vert->Size());
38 		}
39 	}
40 
41 	{
42 		lgn->Append("CHECK IF: dependent cells exist and dependence is symmetric");lgn->Push();
43 		std::set<CellKey>::iterator cki;
44 		for(ci = cells.begin(); ci != cells.end(); ++ci)
45 			for(cki = (*ci).second->dependence_set.begin(); cki != (*ci).second->dependence_set.end(); ++cki)
46 				{
47 					Cell *  c = GetCell((*cki),false);
48 					if(!c){
49 						sprintf(lgn->Buf(),"%d %d %d %d does not exist",(*cki).x,(*cki).y,(*cki).z,(*cki).h);
50 						lgn->Push();
51 					}else
52 					{
53 						if(c->dependence_set.find((*ci).second->key)== c->dependence_set.end())
54 							sprintf(lgn->Buf(),"%d %d %d %d Asymmetric",(*cki).x,(*cki).y,(*cki).z,(*cki).h);
55 					}
56 
57 
58 				}
59 	}
60 
61 	{
62 		lgn->Append("CHECK IF: pointers to boundary (uniquely) refer to existing vertices");lgn->Push();
63 		std::set<CellKey>::iterator cki;
64 		for(ci = cells.begin(); ci != cells.end(); ++ci){
65 			std::set<unsigned int> bv;
66 			Chain<OVertex> * vert = (*ci).second->vert;
67 			Chain<BorderIndex > * border = (*ci).second->border;
68 			for(unsigned int bi = 0 ; bi < border->Size();++bi)
69 				{
70 					if((*border)[bi].vi > vert->Size()){
71 						sprintf(lgn->Buf(),"(vi,bi)= (%d,%d) , vs = %d",(*border)[bi].vi,(*border)[bi].bi,vert->Size());
72 						lgn->Push();
73 					}
74 
75 					std::pair<std::set<unsigned int>::iterator, bool > res =  bv.insert((*border)[bi].vi);
76 
77 					if(!res.second){
78 						Cell * c = (*ci).second;
79 						sprintf(lgn->Buf(),"%d %d %d %d :: ii %d,  vi %d , bv.size() %d",
80 							c->key.x,c->key.y,c->key.z,c->key.h,
81 							bi,(*border)[bi].vi,bv.size());
82 						lgn->Push();
83 
84 					}
85 				}
86 		}
87 	}
88 
89 
90 }
91 
ComputeStatistics()92 void OCME::ComputeStatistics(){
93 lgn->off = false;
94 
95 	std::vector<unsigned int> distr,distrD;
96 	unsigned int max_tri = 0;
97 	unsigned int max_dep = 0;
98 	CellsIterator ci;
99 	stat = Statistics();
100 	unsigned int com =0;
101 	{
102 		stat.n_cells = cells.size();
103 
104 		for(ci = cells.begin(); ci != cells.end(); ++ci){
105 			distr.push_back( ((*ci).second->face->Size()));
106 			distrD.push_back( (*ci).second->dependence_set.size());
107 			if (max_tri< 	(*ci).second->face->Size()) max_tri = (*ci).second->face->Size();
108 			if (max_dep< 	(*ci).second->dependence_set.size()) max_dep = (*ci).second->dependence_set.size();
109 
110 			stat.n_triangles += (*ci).second->face->Size();
111 			stat.n_vertices  += (*ci).second->vert->Size();
112 			stat.n_proxies   += (*ci).second->impostor->centroids.data.size();
113 			com   += (*ci).second->impostor->positionsV.size();
114 		}
115 	}
116 
117 	sprintf(lgn->Buf(),"n_cells %d, n_tri %d, n_vert %d, n_pro(compact) %d,n_pro(sparse) %d",
118 		stat.n_cells,stat.n_triangles,stat.n_vertices,com,stat.n_proxies
119 		);
120 	lgn->Push();
121 	{
122 		std::sort(distr.begin(),distr.end());
123 
124 		unsigned int j =0;
125 		for(unsigned int i = 1; i < 100;++i){
126 			unsigned int h = 0;
127 			while(distr[j]< max_tri*i/100.f){++j;++h;}
128 			sprintf(lgn->Buf(),"%f, %d",max_tri*i/100.f,h);
129 			lgn->Push();
130 		}
131 	}
132 	sprintf(lgn->Buf(),"-------------------------------------");lgn->Push();
133 	{
134 		std::sort(distrD.begin(),distrD.end());
135 
136 		unsigned int j =0;
137 		for(unsigned int i = 1; i < 20;++i){
138 			unsigned int h = 0;
139 			while(distrD[j]< max_dep*i/20.f){++j;++h;}
140 			sprintf(lgn->Buf(),"%f, %d",max_dep*i/20.f,h);
141 			lgn->Push();
142 		}
143 	}
144 }
145 
CheckFaceVertDeletions(Cell * c)146 bool OCME::CheckFaceVertDeletions(Cell *c){ return true;
147 
148 	c->ecd->deleted_face.SetAsVectorOfBool();
149 	c->ecd->deleted_vertex.SetAsVectorOfBool();
150 	for(unsigned int fi = 0; fi < c->face->Size(); ++fi)
151 		if(!c->ecd->deleted_face.IsMarked(fi))
152 			{
153 				OFace of = (*(c->face))[fi];
154 				for(unsigned int vpi = 0; vpi < 3; ++vpi)
155 					RAssert(!c->ecd->deleted_vertex.IsMarked(of[vpi]));
156 			}
157 	return true;
158 }
159 
CheckFaceVertexAdj(Cell * c)160 bool OCME::CheckFaceVertexAdj(Cell *c){
161 	for(unsigned int fi = 0; fi < c->face->Size(); ++fi){
162 
163 		OFace of = (*(c->face))[fi];
164 
165 		for(unsigned int vpi = 0; vpi < 3; ++vpi){
166  			if( (*(c->vert)).Size() <=  of[vpi])
167 			{
168 				sprintf(lgn->Buf(),"wrong face-vert adj  cell: %d %d %d %d", c->key);lgn->Push();
169 				sprintf(lgn->Buf(),"wrong face-vert adj  face: %d", fi);lgn->Push();
170 				sprintf(lgn->Buf(),"wrong face-vert adj  ov[]: %d %d %d ",of[0],of[1],of[2]);lgn->Push();
171 
172 
173 				return false;}
174 //			if( 0 >  of[vpi] )
175 //			{ lgn->Append("negative face-vert adj ");lgn->Push(); return false;}
176 		}
177 	}
178 	return true;
179 }
180 
CheckDependentSet(std::vector<Cell * > &)181 bool OCME:: CheckDependentSet(std::vector<Cell*> &  ){return true;
182 
183 }
184 
BorderExists(Cell * c,unsigned int vi)185 bool OCME:: BorderExists(Cell* c,unsigned int vi){
186 	for(unsigned int vii = 0; vii < c->border->Size(); ++vii)
187 		if((*c->border)[vii].vi == vi)
188 			return  true;
189 	return false;
190 }
191