// ************************************************************************* // void SceneGraph::FrustumQuery(Jo::HybridArray<SOHandle, 32>& _out) const { auto xReadAccess = m_xIntervalMax.GetReadAccess(); // Copy shared pointer to assert that the buffer does not change during algorithm. // TODO: Frustum culling (currently this returns all objects) for(auto& it: xReadAccess.buf()) _out.PushBack(it); }
// ************************************************************************* // void SceneGraph::BoxQuery(const Math::WorldBox _box, Jo::HybridArray<SOHandle, 16>& _out) const { auto xReadAccess = m_xIntervalMax.GetReadAccess(); // Copy shared pointer to assert that the buffer does not change during algorithm. // TODO: Segment trees or similar. currently only x is restricted logarithmically. // Find first element which is a candidate for x auto it = std::lower_bound(xReadAccess.buf().begin(), xReadAccess.buf().end(), _box.min[0], [](const SOHandle& _i, const Fix& _ref){ return _i->GetBoundingBoxMax()[0] < _ref; }); // Iterate as long as the element intersects in x while( it != xReadAccess.buf().end() && (*it)->m_minOfAllMin < _box.max[0] ) { // The current element intersects in x direction. Does it also intersect // in the others? if( (*it)->GetBoundingBoxMin()[1] < _box.max[1] && (*it)->GetBoundingBoxMax()[1] > _box.min[1] && (*it)->GetBoundingBoxMin()[2] < _box.max[2] && (*it)->GetBoundingBoxMax()[2] > _box.min[2] ) _out.PushBack(*it); ++it; } }
// ********************************************************************* // int TypeInfo::GenerateMipMap( MatSample* _texture, int _e ) { int numLevels = 0; int off = _e*_e*_e; // Offset of current level int prevoff = 0; // Offset of previous level while( (_e /= 2) > 0 ) { ++numLevels; // Loop over target level for(int z = 0; z < _e; ++z ) { for(int y = 0; y < _e; ++y ) { for(int x = 0; x < _e; ++x ) { int index = x + _e * (y + _e * z); // Collect defined nodes from finer levels Jo::HybridArray<Material> buffer; int parentIndex; parentIndex = 2 * x + 2 * _e * (2 * y + 4 * _e * z); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 1 + 2 * _e * (2 * y + 4 * _e * z); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 2 * _e * (2 * y + 1 + 4 * _e * z); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 1 + 2 * _e * (2 * y + 1 + 4 * _e * z); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 2 * _e * (2 * y + 2 * _e * (2 * z + 1)); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 1 + 2 * _e * (2 * y + 2 * _e * (2 * z + 1)); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 2 * _e * (2 * y + 1 + 2 * _e * (2 * z + 1)); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); parentIndex = 2 * x + 1 + 2 * _e * (2 * y + 1 + 2 * _e * (2 * z + 1)); if( _texture[prevoff + parentIndex].material != Material::UNDEFINED ) buffer.PushBack( _texture[prevoff + parentIndex].material ); if( buffer.Size() > 3 ) _texture[off + index].material = Material(&buffer.First(), buffer.Size()); else _texture[off + index].material = Material::UNDEFINED; } } } // for target level prevoff = off; off += _e*_e*_e; } return numLevels; }