forestCellBatch.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platform/platform.h"
  23. #include "forest/forestCellBatch.h"
  24. #include "forest/forestItem.h"
  25. ForestCellBatch::ForestCellBatch()
  26. : mDirty( false ),
  27. mBounds( Box3F::Invalid )
  28. {
  29. }
  30. ForestCellBatch::~ForestCellBatch()
  31. {
  32. }
  33. bool ForestCellBatch::add( const ForestItem &item )
  34. {
  35. // A little hacky, but don't allow more than 65K / 6 items
  36. // in a cell... this is generally the VB size limit on hardware.
  37. const U32 maxItems = 10000;
  38. if ( mItems.size() > maxItems )
  39. return false;
  40. // Do the pre batching tests... if it fails
  41. // then we cannot batch this type!
  42. if ( !_prepBatch( item ) )
  43. return false;
  44. // Add it to our list and we'll populate the VB at render time.
  45. mItems.push_back( item );
  46. mDirty = true;
  47. // Expand out bounds.
  48. const Box3F &box = item.getWorldBox();
  49. mBounds.intersect( box );
  50. return true;
  51. }
  52. void ForestCellBatch::render( SceneRenderState *state )
  53. {
  54. if ( mDirty )
  55. {
  56. _rebuildBatch();
  57. mDirty = false;
  58. }
  59. _render( state );
  60. }