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 }
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 }
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 }
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 }