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.RayTestRef(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 }
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 }