Subversion Repositories gelsvn

Rev

Rev 311 | Rev 314 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 311 Rev 313
Line 117... Line 117...
117
      vector<TriAccel*> tri_left_objects;
117
      vector<TriAccel*> tri_left_objects;
118
      vector<TriAccel*> tri_right_objects;
118
      vector<TriAccel*> tri_right_objects;
119
      
119
      
120
      node.left = left_node;
120
      node.left = left_node;
121
      node.right = right_node;
121
      node.right = right_node;
122
      //node.is_leaf = false;
-
 
123
 
122
 
124
      int new_axis=-1;
123
      int new_axis=-1;
125
      double min_cost=CGLA::BIG;
124
      double min_cost=CGLA::BIG;
126
      int new_pos = -1;      
125
      int new_pos = -1;      
127
/*
126
 
128
       float max_size=0;
-
 
129
       for(i=0;i<3;i++) {
-
 
130
         if (bbox.max_corner[i]-bbox.min_corner[i]>max_size) {
-
 
131
	   max_size = bbox.max_corner[i]-bbox.min_corner[i];
-
 
132
	   new_axis=i;
-
 
133
	   new_pos = 1;
-
 
134
	 }
-
 
135
       }
-
 
136
*/
-
 
137
      for(i=0;i<3;i++) 
127
	  for(i=0;i<3;i++) 
138
      {
128
      {
139
	for(int k=1;k<TESTS;k++) 
129
	for(int k=1;k<TESTS;k++) 
140
	{
130
	{
141
	  BBox left_bbox = bbox;
131
	  BBox left_bbox = bbox;
142
	  BBox right_bbox = bbox;
132
	  BBox right_bbox = bbox;
Line 154... Line 144...
154
	  {
144
	  {
155
	    ISectTri* tri = objects[j];
145
	    ISectTri* tri = objects[j];
156
	    left_count += left_bbox.intersect_triangle(*tri);
146
	    left_count += left_bbox.intersect_triangle(*tri);
157
	    right_count += right_bbox.intersect_triangle(*tri);
147
	    right_count += right_bbox.intersect_triangle(*tri);
158
	  }
148
	  }
159
	  
149
 
-
 
150
	  //double len = bbox.max_corner[i] - bbox.min_corner[i];
160
	  if (left_count*left_bbox.area() + right_count*right_bbox.area() < min_cost) 
151
	  double cost = left_count*left_bbox.area() + right_count*right_bbox.area(); // - len*len;
-
 
152
	  if(cost < min_cost) 
161
	  {
153
	  {
162
	    min_cost = left_count*left_bbox.area() + right_count*right_bbox.area();
154
	    min_cost = cost;
163
	    new_axis = i;
155
	    new_axis = i;
164
	    new_pos = k;
156
	    new_pos = k;
165
	    right_zero = (right_count==0);
157
	    right_zero = (right_count==0);
166
	    left_zero = (left_count==0);
158
	    left_zero = (left_count==0);
167
	  }
159
	  }
168
	}
160
	}
169
      }
161
      }
170
      node.axis_leaf = new_axis;
162
      node.axis_leaf = new_axis;
171
      //	node.axis_leaf = level %3;
-
 
172
      left_node->axis_leaf = static_cast<unsigned char>(-1); //(node.axis + 1)%3;
163
      left_node->axis_leaf = static_cast<unsigned char>(-1); 
173
      right_node->axis_leaf = static_cast<unsigned char>(-1); //(node.axis + 1)%3;
164
      right_node->axis_leaf = static_cast<unsigned char>(-1); 
-
 
165
 
174
      // Now chose the right splitting plane
166
      // Now chose the right splitting plane
175
      BBox left_bbox = bbox;
167
      BBox left_bbox = bbox;
176
      BBox right_bbox = bbox;
168
      BBox right_bbox = bbox;
177
 
169
 
178
      double size = bbox.max_corner[node.axis_leaf]- bbox.min_corner[node.axis_leaf];
170
      double size = bbox.max_corner[node.axis_leaf]- bbox.min_corner[node.axis_leaf];
179
      double center = size*(double)new_pos/(double)TESTS + bbox.min_corner[node.axis_leaf];
171
      double center = size*(double)new_pos/(double)TESTS + bbox.min_corner[node.axis_leaf];
180
      double diff = f_eps < size/8.0 ? f_eps : size/8.0;
172
      double diff = f_eps < size/8.0 ? f_eps : size/8.0;
181
      
173
      
182
      // This doesn't help that much
-
 
183
      if (left_zero) 
174
      if (left_zero) 
184
      {
175
      {
185
//			cout << "Old left center: " << center;
-
 
186
	// Find min position af alle trekanter og placer center der
176
	// Find min position of all triangle vertices and place the center there
187
	center = bbox.max_corner[node.axis_leaf];
177
	center = bbox.max_corner[node.axis_leaf];
188
	for(unsigned int j=0;j<objects.size();j++) 
178
	for(unsigned int j=0;j<objects.size();j++) 
189
	{
179
	{
190
	  ISectTri* tri = objects[j];
180
	  ISectTri* tri = objects[j];
191
	  if (tri->point0[node.axis_leaf]<center)
181
	  if (tri->point0[node.axis_leaf]<center)
Line 194... Line 184...
194
	    center=tri->point1[node.axis_leaf];
184
	    center=tri->point1[node.axis_leaf];
195
	  if (tri->point2[node.axis_leaf]<center)
185
	  if (tri->point2[node.axis_leaf]<center)
196
	    center=tri->point2[node.axis_leaf];
186
	    center=tri->point2[node.axis_leaf];
197
	}
187
	}
198
	center -= diff;
188
	center -= diff;
199
//			cout << "new left center: " << center << endl;
-
 
200
      }
189
      }
201
      if (right_zero) 
190
      if (right_zero) 
202
      {
191
      {
203
//			cout << "Old right center: " << center;
-
 
204
	// Find max position af alle trekanter og placer center der
192
	// Find max position of all triangle vertices and place the center there
205
	center = bbox.min_corner[node.axis_leaf];
193
	center = bbox.min_corner[node.axis_leaf];
206
	for(unsigned int j=0;j<objects.size();j++) 
194
	for(unsigned int j=0;j<objects.size();j++) 
207
	{
195
	{
208
	  ISectTri* tri = objects[j];
196
	  ISectTri* tri = objects[j];
209
	  if (tri->point0[node.axis_leaf]>center)
197
	  if (tri->point0[node.axis_leaf]>center)
Line 212... Line 200...
212
	    center=tri->point1[node.axis_leaf];
200
	    center=tri->point1[node.axis_leaf];
213
	  if (tri->point2[node.axis_leaf]>center)
201
	  if (tri->point2[node.axis_leaf]>center)
214
	    center=tri->point2[node.axis_leaf];
202
	    center=tri->point2[node.axis_leaf];
215
	}
203
	}
216
	center += diff;
204
	center += diff;
217
//			cout << "new right center: " << center << endl;
-
 
218
      }
205
      }
219
 
206
 
220
      node.plane = center;
207
      node.plane = center;
221
      left_bbox.max_corner[node.axis_leaf] = center; // + f_eps; 
208
      left_bbox.max_corner[node.axis_leaf] = center; 
222
      right_bbox.min_corner[node.axis_leaf] = center; // - f_eps; 
209
      right_bbox.min_corner[node.axis_leaf] = center;  
223
            
210
            
224
      // Now put the triangles in the right and left node
211
      // Now put the triangles in the right and left node
225
      for(i=0;i<objects.size();i++) 
212
      for(i=0;i<objects.size();i++) 
226
      {
213
      {
227
	ISectTri* tri = objects[i];
214
	ISectTri* tri = objects[i];