Subversion Repositories gelsvn

Rev

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

Rev 304 Rev 310
Line 119... Line 119...
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;
122
      //node.is_leaf = false;
123
 
123
 
124
      // Make test on all three axis
-
 
125
      int new_axis=-1;
124
      int new_axis=-1;
126
      double min_cost=CGLA::BIG;
125
      double min_cost=CGLA::BIG;
127
      int new_pos = -1;      
126
      int new_pos = -1;      
128
/*
127
/*
129
       float max_size=0;
128
       float max_size=0;
Line 133... Line 132...
133
	   new_axis=i;
132
	   new_axis=i;
134
	   new_pos = 1;
133
	   new_pos = 1;
135
	 }
134
	 }
136
       }
135
       }
137
*/
136
*/
138
      unsigned int j;		
-
 
139
 
-
 
140
      for(i=0;i<3;i++) 
137
      for(i=0;i<3;i++) 
141
      {
138
      {
142
	for(int k=1;k<TESTS;k++) 
139
	for(int k=1;k<TESTS;k++) 
143
	{
140
	{
144
	  BBox left_bbox = bbox;
141
	  BBox left_bbox = bbox;
Line 147... Line 144...
147
	  double center = (bbox.max_corner[i]- bbox.min_corner[i])*(double)k/(double)TESTS+bbox.min_corner[i];
144
	  double center = (bbox.max_corner[i]- bbox.min_corner[i])*(double)k/(double)TESTS + bbox.min_corner[i];
148
	  node.plane = center;
145
	  node.plane = center;
149
	  
146
	  
150
	  left_bbox.max_corner[i] = center; 
147
	  left_bbox.max_corner[i] = center; 
151
	  right_bbox.min_corner[i] = center; 
148
	  right_bbox.min_corner[i] = center; 
-
 
149
 
152
	  // Try putting the triangles in the left and right boxes
150
	  // Try putting the triangles in the left and right boxes
153
	  int left_count = 0;
151
	  int left_count = 0;
154
	  int right_count = 0;
152
	  int right_count = 0;
155
	  for(j=0;j<objects.size();j++) 
153
	  for(unsigned int j=0;j<objects.size();j++) 
156
	  {
154
	  {
157
	    ISectTri* tri = objects[j];
155
	    ISectTri* tri = objects[j];
158
	    if (left_bbox.intersect_triangle(*tri)) 
156
	    left_count += left_bbox.intersect_triangle(*tri);
159
	      left_count++;
-
 
160
	    if (right_bbox.intersect_triangle(*tri)) 
157
	    right_count += right_bbox.intersect_triangle(*tri);
161
	      right_count++;
-
 
162
	  }
158
	  }
163
	  
159
	  
164
	  if ((double)left_count*left_bbox.area()+(double)right_count*right_bbox.area()<min_cost) 
160
	  if (left_count*left_bbox.area() + right_count*right_bbox.area() < min_cost) 
165
	  {
161
	  {
166
	    min_cost = (double)left_count*left_bbox.area()+(double)right_count*right_bbox.area();
162
	    min_cost = left_count*left_bbox.area() + right_count*right_bbox.area();
167
	    new_axis=i;
163
	    new_axis = i;
168
	    new_pos = k;
164
	    new_pos = k;
169
	    if (right_count==0)
165
	    right_zero = (right_count==0);
170
	      right_zero=true;
-
 
171
	    else
-
 
172
	      right_zero=false;
-
 
173
	    if (left_count==0)
166
	    left_zero = (left_count==0);
174
	      left_zero=true;
-
 
175
	    else
-
 
176
	      left_zero=false;	    
-
 
177
	  }
167
	  }
178
	}
168
	}
179
      }
169
      }
180
      node.axis_leaf = new_axis;
170
      node.axis_leaf = new_axis;
181
      //	node.axis_leaf = level %3;
171
      //	node.axis_leaf = level %3;
182
      left_node->axis_leaf = -1; //(node.axis + 1)%3;
172
      left_node->axis_leaf = static_cast<unsigned char>(-1); //(node.axis + 1)%3;
183
      right_node->axis_leaf = -1; //(node.axis + 1)%3;
173
      right_node->axis_leaf = static_cast<unsigned char>(-1); //(node.axis + 1)%3;
184
      // Now chose the right splitting plane
174
      // Now chose the right splitting plane
185
      BBox left_bbox = bbox;
175
      BBox left_bbox = bbox;
186
      BBox right_bbox = bbox;
176
      BBox right_bbox = bbox;
187
 
177
 
-
 
178
      double size = bbox.max_corner[node.axis_leaf]- bbox.min_corner[node.axis_leaf];
188
      double center = (bbox.max_corner[node.axis_leaf]- bbox.min_corner[node.axis_leaf])*(double)new_pos/(double)TESTS+bbox.min_corner[node.axis_leaf];
179
      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;
189
 
181
      
190
      // This doesn't help that much
182
      // This doesn't help that much
191
      if (left_zero) 
183
      if (left_zero) 
192
      {
184
      {
193
//			cout << "Old left center: " << center;
185
//			cout << "Old left center: " << center;
194
	// Find min position af alle trekanter og placer center der
186
	// Find min position af alle trekanter og placer center der
195
	center = bbox.max_corner[node.axis_leaf];
187
	center = bbox.max_corner[node.axis_leaf];
196
	for(j=0;j<objects.size();j++) 
188
	for(unsigned int j=0;j<objects.size();j++) 
197
	{
189
	{
198
	  ISectTri* tri = objects[j];
190
	  ISectTri* tri = objects[j];
199
	  if (tri->point0[node.axis_leaf]<center)
191
	  if (tri->point0[node.axis_leaf]<center)
200
	    center=tri->point0[node.axis_leaf];
192
	    center=tri->point0[node.axis_leaf];
201
	  if (tri->point1[node.axis_leaf]<center)
193
	  if (tri->point1[node.axis_leaf]<center)
202
	    center=tri->point1[node.axis_leaf];
194
	    center=tri->point1[node.axis_leaf];
203
	  if (tri->point2[node.axis_leaf]<center)
195
	  if (tri->point2[node.axis_leaf]<center)
204
	    center=tri->point2[node.axis_leaf];
196
	    center=tri->point2[node.axis_leaf];
205
	}
197
	}
-
 
198
	center -= diff;
206
//			cout << "new left center: " << center << endl;
199
//			cout << "new left center: " << center << endl;
207
      }
200
      }
208
      if (right_zero) 
201
      if (right_zero) 
209
      {
202
      {
210
//			cout << "Old right center: " << center;
203
//			cout << "Old right center: " << center;
211
	// Find min position af alle trekanter og placer center der
204
	// Find max position af alle trekanter og placer center der
212
	center = left_bbox.min_corner[node.axis_leaf];
205
	center = bbox.min_corner[node.axis_leaf];
213
	for(j=0;j<objects.size();j++) 
206
	for(unsigned int j=0;j<objects.size();j++) 
214
	{
207
	{
215
	  ISectTri* tri = objects[j];
208
	  ISectTri* tri = objects[j];
216
	  if (tri->point0[node.axis_leaf]>center)
209
	  if (tri->point0[node.axis_leaf]>center)
217
	    center=tri->point0[node.axis_leaf];
210
	    center=tri->point0[node.axis_leaf];
218
	  if (tri->point1[node.axis_leaf]>center)
211
	  if (tri->point1[node.axis_leaf]>center)
219
	    center=tri->point1[node.axis_leaf];
212
	    center=tri->point1[node.axis_leaf];
220
	  if (tri->point2[node.axis_leaf]>center)
213
	  if (tri->point2[node.axis_leaf]>center)
221
	    center=tri->point2[node.axis_leaf];
214
	    center=tri->point2[node.axis_leaf];
222
	}
215
	}
-
 
216
	center += diff;
223
//			cout << "new right center: " << center << endl;
217
//			cout << "new right center: " << center << endl;
224
      }
218
      }
225
 
219
 
226
      node.plane = center;
220
      node.plane = center;
227
      left_bbox.max_corner[node.axis_leaf] = center+f_eps; 
221
      left_bbox.max_corner[node.axis_leaf] = center; // + f_eps; 
228
      right_bbox.min_corner[node.axis_leaf] = center-f_eps; 
222
      right_bbox.min_corner[node.axis_leaf] = center; // - f_eps; 
229
      
-
 
230
 
223
            
231
		// Now put the triangles in the right and left node
224
      // Now put the triangles in the right and left node
232
      for(i=0;i<objects.size();i++) 
225
      for(i=0;i<objects.size();i++) 
233
      {
226
      {
234
	ISectTri* tri = objects[i];
227
	ISectTri* tri = objects[i];
Line 242... Line 235...
242
	{
235
	{
243
	  right_objects.push_back(tri);
236
	  right_objects.push_back(tri);
244
	  tri_right_objects.push_back(tri_accel);
237
	  tri_right_objects.push_back(tri_accel);
245
	}
238
	}
246
      }
239
      }
247
/*	if (left_zero||right_zero) {
240
      if (left_zero||right_zero)
248
			cout << left_objects.size() << "," << right_objects.size() << endl;
241
	cout << left_objects.size() << "," << right_objects.size() << "," << level << endl;
249
		}
-
 
250
*/
242
 
251
      objects.clear();
243
      objects.clear();
252
      subdivide_node(*left_node , left_bbox , level+1, left_objects, tri_left_objects);
244
      subdivide_node(*left_node , left_bbox , level+1, left_objects, tri_left_objects);
253
      subdivide_node(*right_node, right_bbox, level+1, right_objects, tri_right_objects);
245
      subdivide_node(*right_node, right_bbox, level+1, right_objects, tri_right_objects);
254
    }
246
    }
255
  }
247
  }
256
 
248
 
257
  void BSPTree::init() 
249
  void BSPTree::init() 
258
  {
250
  {
259
    root = new BSPNode();
251
    root = new BSPNode();
260
    bbox.compute_bbox(isecttris);
252
    bbox.compute_bbox(isecttris);
261
    bbox.min_corner-=Vec3f(f_eps*100,f_eps*100,f_eps*100);
253
    bbox.min_corner-=Vec3f(1.0);
262
    bbox.max_corner+=Vec3f(f_eps*100,f_eps*100,f_eps*100);
254
    bbox.max_corner+=Vec3f(1.0);
263
  }
255
  }
264
 
256
 
265
  void BSPTree::init(vector<TriMesh*>& _trimesh, 
257
  void BSPTree::init(vector<TriMesh*>& _trimesh, 
266
		     vector<Mat4x4f>& _transforms, 
258
		     vector<Mat4x4f>& _transforms, 
267
		     int _max_objects, int _max_level) 
259
		     int _max_objects, int _max_level) 
Line 334... Line 326...
334
    {
326
    {
335
      vector<ISectTri*> objects;
327
      vector<ISectTri*> objects;
336
      vector<TriAccel*> tri_objects;
328
      vector<TriAccel*> tri_objects;
337
      for(unsigned int i=0;i<isecttris.size();i++) 
329
      for(unsigned int i=0;i<isecttris.size();i++) 
338
      {
330
      {
339
	ISectTri& tri = isecttris[i];
331
	ISectTri* tri = &isecttris[i];
340
	TriAccel& tri_accel = triaccel[i];
332
	TriAccel* tri_accel = &triaccel[i];
341
	objects.push_back(&tri);
333
	objects.push_back(tri);
342
	tri_objects.push_back(&tri_accel);
334
	tri_objects.push_back(tri_accel);
343
      }
335
      }
344
      subdivide_node(*root, bbox, 0, objects, tri_objects);
336
      subdivide_node(*root, bbox, 0, objects, tri_objects);
345
      b_is_build = true;
337
      b_is_build = true;
346
    }
338
    }
347
    isecttris.clear();
339
    isecttris.clear();
Line 481... Line 473...
481
  {
473
  {
482
    double t_min, t_max;
474
    double t_min, t_max;
483
    bbox.intersect_min_max(ray, t_min, t_max);
475
    bbox.intersect_min_max(ray, t_min, t_max);
484
    if (t_min>t_max)
476
    if (t_min>t_max)
485
      return false;
477
      return false;
486
    if (!intersect_node(ray, *root, t_min, t_max))
478
//    if (!intersect_node(ray, *root, t_min, t_max))
487
      return false;
479
//      return false;
488
//	cout << "____" << endl;
480
//	cout << "____" << endl;
489
//	ray.reset();
481
//	ray.reset();
490
//	cout << "Here " << endl;
482
//	cout << "Here " << endl;
491
//	intersect_fast_node(ray, &fast_tree[0], t_min, t_max);
483
    intersect_fast_node(ray, &fast_tree[0], t_min, t_max);
492
//	if (!ray.has_hit)
484
    if (!ray.has_hit)
493
//		return false;
485
      return false;
494
    else 
486
    else 
495
    {
487
    {
496
      // Calculate the normal at the intersection
488
      // Calculate the normal at the intersection
497
      ray.hit_object = trimesh[(int)ray.hit_object];
489
      ray.hit_object = trimesh[(int)ray.hit_object];
-
 
490
/*
498
      Vec3i face = ray.hit_object->normals.face(ray.hit_face_id);
491
      Vec3i face = ray.hit_object->normals.face(ray.hit_face_id);
499
      Vec3f normal0 = ray.hit_object->normals.vertex(face[0]);
492
      Vec3f normal0 = ray.hit_object->normals.vertex(face[0]);
500
      Vec3f normal1 = ray.hit_object->normals.vertex(face[1]);
493
      Vec3f normal1 = ray.hit_object->normals.vertex(face[1]);
501
      Vec3f normal2 = ray.hit_object->normals.vertex(face[2]);
494
      Vec3f normal2 = ray.hit_object->normals.vertex(face[2]);
502
      ray.hit_normal = normalize(normal0*(1 - ray.u - ray.v)
495
      ray.hit_normal = normalize(normal0*(1 - ray.u - ray.v)
503
				 +normal1*ray.u
496
				 +normal1*ray.u
504
				 +normal2*ray.v);
497
				 +normal2*ray.v);
505
      ray.hit_pos = ray.origin + ray.direction*ray.dist;
498
      ray.hit_pos = ray.origin + ray.direction*ray.dist;
-
 
499
*/
506
      return true;
500
      return true;
507
    }
501
    }
508
  }
502
  }
509
 
503
 
510
  const int MAX_DEPTH=25;
504
  const int MAX_DEPTH=25;
Line 552... Line 546...
552
    double t_max;
546
    double t_max;
553
  };
547
  };
554
 
548
 
555
  inline void IntersectAlltrianglesInLeaf(const BSPLeaf* leaf, Ray &ray, double t_max) {
549
  inline void IntersectAlltrianglesInLeaf(const BSPLeaf* leaf, Ray &ray, double t_max) {
556
    TriAccel** tri_acc_ptr = reinterpret_cast<TriAccel**>(leaf->flagAndOffset & (0x7FFFFFFF));
550
    TriAccel** tri_acc_ptr = reinterpret_cast<TriAccel**>(leaf->flagAndOffset & (0x7FFFFFFF));
557
    vector<TriAccel*>::iterator acc(tri_acc_ptr);
551
    vector<TriAccel*>::iterator acc = vector<TriAccel*>::iterator(tri_acc_ptr);
558
//	vector<TriAccel*>::iterator acc = ABSP_TRIANGLENODE(leaf);
552
//	vector<TriAccel*>::iterator acc = ABSP_TRIANGLENODE(leaf);
559
    for(unsigned int i=0;i<leaf->count;++i)
553
    for(unsigned int i=0;i<leaf->count;++i)
560
      intersect2(ray, *(*acc++), t_max);
554
      intersect2(ray, *(*acc++), t_max);
561
  }
555
  }
562
 
556