Ejemplo n.º 1
0
        public void cast(CollisionWorld cw)
        {
#if USE_BT_CLOCK
            frame_timer.reset();
#endif //USE_BT_CLOCK

#if BATCH_RAYCASTER
            if (gBatchRaycaster == null)
            {
                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& outResult = (*gBatchRaycaster)[i];
                hit[i].setInterpolate3(source[i], dest[i], outResult.hitFraction);
                normal[i] = outResult.hitNormal;
                normal[i] = normal[i].Normalize();
            }
#else
            for (int i = 0; i < NUMRAYS_IN_BAR; i++)
            {
                ClosestRayResultCallback cb = new ClosestRayResultCallback(source[i], dest[i]);

                cw.RayTest(ref source[i], ref dest[i], cb);
                if (cb.HasHit())
                {
                    hit[i]    = cb.m_hitPointWorld;
                    normal[i] = cb.m_hitNormalWorld;
                    normal[i] = IndexedVector3.Normalize(normal[i]);
                }
                else
                {
                    hit[i]    = dest[i];
                    normal[i] = new IndexedVector3(1.0f, 0.0f, 0.0f);
                }
            }
#if USE_BT_CLOCK
            ms += frame_timer.getTimeMilliseconds();
#endif //USE_BT_CLOCK
            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;
                //printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms);
                ms            = 0;
                frame_counter = 0;
            }
#endif
        }
Ejemplo n.º 2
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.RayTestRef(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
        }
Ejemplo n.º 3
0
        public void Cast(CollisionWorld cw, float frameDelta)
        {
#if BATCH_RAYCASTER
            if (!batchRaycaster)
            {
                return;
            }

            batchRaycaster.ClearRays();
            foreach (var ray in _rays)
            {
                batchRaycaster.AddRay(ray.Source, ray.Destination);
            }
            batchRaycaster.PerformBatchRaycast();
            for (int i = 0; i < batchRaycaster.NumRays; i++)
            {
                const SpuRaycastTaskWorkUnitOut& out = (*batchRaycaster)[i];
                _rays[i].HitPoint.SetInterpolate3(_source[i], _destination[i], out.HitFraction);
                _rays[i].Normal = out.hitNormal;
                _rays[i].Normal.Normalize();
            }
#else
            foreach (var ray in _rays)
            {
                using (var cb = new ClosestRayResultCallback(ref ray.Source, ref ray.Destination))
                {
                    cw.RayTest(ref ray.Source, ref ray.Destination, cb);
                    if (cb.HasHit)
                    {
                        ray.HitPoint = cb.HitPointWorld;
                        ray.Normal   = cb.HitNormalWorld;
                        ray.Normal.Normalize();
                    }
                    else
                    {
                        ray.HitPoint = ray.Destination;
                        ray.Normal   = new Vector3(1.0f, 0.0f, 0.0f);
                    }
                }
            }

            _time += frameDelta;
            _frameCount++;
            if (_frameCount > 50)
            {
                if (_time < _timeMin)
                {
                    _timeMin = _time;
                }
                if (_time > _timeMax)
                {
                    _timeMax = _time;
                }
                _timeTotal += _time;
                _sampleCount++;
                float timeMean = _timeTotal / _sampleCount;
                PrintStats();
                _time       = 0;
                _frameCount = 0;
            }
#endif
        }
Ejemplo n.º 4
0
        public void Cast(CollisionWorld cw, float frameDelta)
        {
#if BATCH_RAYCASTER
            if (!gBatchRaycaster)
            {
                return;
            }

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

            _time += frameDelta;
            _frameCount++;
            if (_frameCount > 50)
            {
                if (_time < _timeMin)
                {
                    _timeMin = _time;
                }
                if (_time > _timeMax)
                {
                    _timeMax = _time;
                }
                _timeTotal += _time;
                _sampleCount++;
                float timeMean = _timeTotal / _sampleCount;
                Console.WriteLine("{0} rays in {1} s, min {2}, max {3}, mean {4}",
                                  NumRays * _frameCount,
                                  _time.ToString("0.000", CultureInfo.InvariantCulture),
                                  _timeMin.ToString("0.000", CultureInfo.InvariantCulture),
                                  _timeMax.ToString("0.000", CultureInfo.InvariantCulture),
                                  timeMean.ToString("0.000", CultureInfo.InvariantCulture));
                _time       = 0;
                _frameCount = 0;
            }
#endif
        }