Пример #1
0
        public void Cast(CollisionWorld cw)
        {
            #if BATCH_RAYCASTER
            if (!gBatchRaycaster)
                return;

            gBatchRaycaster->clearRays ();
            for (int i = 0; i < NUMRAYS_IN_BAR; i++)
            {
                gBatchRaycaster->addRay (source[i], dest[i]);
            }
            gBatchRaycaster->performBatchRaycast ();
            for (int i = 0; i < gBatchRaycaster->getNumRays (); i++)
            {
                    const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i];
                    hit[i].setInterpolate3(source[i],dest[i],out.HitFraction);
                    normal[i] = out.hitNormal;
                    normal[i].Normalize();
            }
            #else
            for (int i = 0; i < NUMRAYS_IN_BAR; i++)
            {
                using (var cb = new ClosestRayResultCallback(ref source[i], ref dest[i]))
                {
                    cw.RayTest(ref source[i], ref dest[i], cb);
                    if (cb.HasHit)
                    {
                        hit[i] = cb.HitPointWorld;
                        normal[i] = cb.HitNormalWorld;
                        normal[i].Normalize();
                    }
                    else
                    {
                        hit[i] = dest[i];
                        normal[i] = new Vector3(1.0f, 0.0f, 0.0f);
                    }
                }
            }

            frame_counter++;
            if (frame_counter > 50)
            {
                min_ms = ms < min_ms ? ms : min_ms;
                max_ms = ms > max_ms ? ms : max_ms;
                sum_ms += ms;
                sum_ms_samples++;
                float mean_ms = (float)sum_ms / (float)sum_ms_samples;
                Console.WriteLine("{0} rays in {1} ms {2} {3} {4}", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms);
                ms = 0;
                frame_counter = 0;
            }
            #endif
        }