| 1379 | //----------------------------------------------------------------------------- |
| 1380 | |
| 1381 | void SceneContainer::getBinRange( const F32 min, const F32 max, U32& minBin, U32& maxBin ) |
| 1382 | { |
| 1383 | AssertFatal(max >= min, avar("Error, bad range in getBinRange. min: %f, max: %f", min, max)); |
| 1384 | |
| 1385 | if ((max - min) >= (SceneContainer::csmTotalBinSize - SceneContainer::csmBinSize)) |
| 1386 | { |
| 1387 | F32 minCoord = mFmod(min, SceneContainer::csmTotalBinSize); |
| 1388 | if (minCoord < 0.0f) |
| 1389 | { |
| 1390 | minCoord += SceneContainer::csmTotalBinSize; |
| 1391 | |
| 1392 | // This is truly lame, but it can happen. There must be a better way to |
| 1393 | // deal with this. |
| 1394 | if (minCoord == SceneContainer::csmTotalBinSize) |
| 1395 | minCoord = SceneContainer::csmTotalBinSize - 0.01f; |
| 1396 | } |
| 1397 | |
| 1398 | AssertFatal(minCoord >= 0.0 && minCoord < SceneContainer::csmTotalBinSize, "Bad minCoord"); |
| 1399 | |
| 1400 | minBin = U32(minCoord / SceneContainer::csmBinSize); |
| 1401 | AssertFatal(minBin < SceneContainer::csmNumBins, avar("Error, bad clipping! (%g, %d)", minCoord, minBin)); |
| 1402 | |
| 1403 | maxBin = minBin + (SceneContainer::csmNumBins - 1); |
| 1404 | return; |
| 1405 | } |
| 1406 | else |
| 1407 | { |
| 1408 | |
| 1409 | F32 minCoord = mFmod(min, SceneContainer::csmTotalBinSize); |
| 1410 | |
| 1411 | if (minCoord < 0.0f) |
| 1412 | { |
| 1413 | minCoord += SceneContainer::csmTotalBinSize; |
| 1414 | |
| 1415 | // This is truly lame, but it can happen. There must be a better way to |
| 1416 | // deal with this. |
| 1417 | if (minCoord == SceneContainer::csmTotalBinSize) |
| 1418 | minCoord = SceneContainer::csmTotalBinSize - 0.01f; |
| 1419 | } |
| 1420 | AssertFatal(minCoord >= 0.0 && minCoord < SceneContainer::csmTotalBinSize, "Bad minCoord"); |
| 1421 | |
| 1422 | F32 maxCoord = mFmod(max, SceneContainer::csmTotalBinSize); |
| 1423 | if (maxCoord < 0.0f) { |
| 1424 | maxCoord += SceneContainer::csmTotalBinSize; |
| 1425 | |
| 1426 | // This is truly lame, but it can happen. There must be a better way to |
| 1427 | // deal with this. |
| 1428 | if (maxCoord == SceneContainer::csmTotalBinSize) |
| 1429 | maxCoord = SceneContainer::csmTotalBinSize - 0.01f; |
| 1430 | } |
| 1431 | AssertFatal(maxCoord >= 0.0 && maxCoord < SceneContainer::csmTotalBinSize, "Bad maxCoord"); |
| 1432 | |
| 1433 | minBin = U32(minCoord / SceneContainer::csmBinSize); |
| 1434 | maxBin = U32(maxCoord / SceneContainer::csmBinSize); |
| 1435 | AssertFatal(minBin < SceneContainer::csmNumBins, avar("Error, bad clipping(min)! (%g, %d)", maxCoord, minBin)); |
| 1436 | AssertFatal(minBin < SceneContainer::csmNumBins, avar("Error, bad clipping(max)! (%g, %d)", maxCoord, maxBin)); |
| 1437 | |
| 1438 | // MSVC6 seems to be generating some bad floating point code around |