@@ -392,7 +392,8 @@ void Model::RTPrepare()
392
392
for (Vertex &v : borders)
393
393
bboxs.push_back (v + position);
394
394
newparts.clear ();
395
- int cur = 0 ;
395
+ ampparts.clear ();
396
+
396
397
vector<ampTri> tpart;
397
398
vector<Triangle> tmppart;
398
399
for (vector<Triangle> &part : parts)
@@ -410,11 +411,11 @@ void Model::RTPrepare()
410
411
tpart.push_back (newt);
411
412
}
412
413
newparts.push_back (move (tmppart));
413
- tmppart.reserve (2000 );
414
+ tmppart.reserve (3000 );
414
415
415
416
tpart.shrink_to_fit ();
416
- gpuParts[cur++] = array_view< const ampTri, 1 >(tpart. size (), tpart);
417
- tpart.clear ( );
417
+ ampparts. push_back ( move ( tpart) );
418
+ tpart.reserve ( 3000 );
418
419
}
419
420
420
421
@@ -438,10 +439,7 @@ HitRes Model::intersect(const Ray &ray, const HitRes &hr, const float min)
438
439
439
440
ampRes ampres[5000 ];
440
441
float resdis[5000 ];
441
- array_view<ampRes, 1 > ares (4000 , ampres);
442
- array_view<float , 1 > adis (4000 , resdis);
443
- ares.discard_data (); adis.discard_data ();
444
-
442
+
445
443
ans = hr.distance ;
446
444
int objpart = -1 ;
447
445
Triangle *objt = nullptr ;
@@ -450,30 +448,33 @@ HitRes Model::intersect(const Ray &ray, const HitRes &hr, const float min)
450
448
if (BorderTest (ray, bboxs[a * 2 ], bboxs[a * 2 + 1 ]) < hr.distance )
451
449
{
452
450
size_t size = newparts[a].size ();
453
-
454
- parallel_for_each (gpuParts[a].extent , [=](index <1 > idx) restrict (amp)
451
+ array_view<ampRes, 1 > ares (4000 , ampres);
452
+ array_view<float , 1 > adis (4000 , resdis);
453
+ ares.discard_data (); adis.discard_data ();
454
+ array_view<ampTri, 1 > apart (size, ampparts[a]);
455
+ parallel_for_each (apart.extent , [=](index <1 > idx) restrict (amp)
455
456
{
456
- VEC3 tmp1 = ampray.dir * gpuParts[a] [idx].v ;
457
- float tmpa = gpuParts[a] [idx].u & tmp1;
457
+ VEC3 tmp1 = ampray.dir * apart [idx].v ;
458
+ float tmpa = apart [idx].u & tmp1;
458
459
if (fast_math::fabs (tmpa) < 1e-6f )
459
460
{
460
461
adis[idx] = 1e20f; return ;
461
462
}
462
463
float f = 1 / a;
463
- VEC3 t2r = ampray.ori - gpuParts[a] [idx].p0 ;
464
+ VEC3 t2r = ampray.ori - apart [idx].p0 ;
464
465
float u = (t2r & tmp1) * f;
465
466
if (u < 0 .0f || u > 1 .0f )
466
467
{
467
468
adis[idx] = 1e20f; return ;
468
469
}
469
- VEC3 tmp2 = t2r * gpuParts[a] [idx].u ;
470
+ VEC3 tmp2 = t2r * apart [idx].u ;
470
471
float v = (ampray.dir & tmp2) * f,
471
472
duv = 1 - u - v;
472
473
if (v < 0 .0f || duv < 0 .0f )
473
474
{
474
475
adis[idx] = 1e20f; return ;
475
476
}
476
- float t = (gpuParts[a] [idx].v & tmp2) * f;
477
+ float t = (apart [idx].v & tmp2) * f;
477
478
if (t > 1e-5f )
478
479
{
479
480
ares[idx].u = u, ares[idx].v = v;
0 commit comments