include/PxAggregate.h

File members: include/PxAggregate.h

// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//  * Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//  * Neither the name of NVIDIA CORPORATION nor the names of its
//    contributors may be used to endorse or promote products derived
//    from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Copyright (c) 2008-2024 NVIDIA Corporation. All rights reserved.
// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.

#ifndef PX_AGGREGATE_H
#define PX_AGGREGATE_H

#include "PxPhysXConfig.h"
#include "common/PxBase.h"

#if !PX_DOXYGEN
namespace physx
{
#endif

class PxActor;
class PxBVH;
class PxScene;

    struct PxAggregateType
    {
        enum Enum
        {
            eGENERIC    = 0,
            eSTATIC     = 1,
            eKINEMATIC  = 2
        };
    };

    // PxAggregateFilterHint is used for more efficient filtering of aggregates outside of the broadphase.
    // It is a combination of a PxAggregateType and a self-collision bit.
    typedef PxU32   PxAggregateFilterHint;

    PX_CUDA_CALLABLE PX_FORCE_INLINE    PxAggregateFilterHint   PxGetAggregateFilterHint(PxAggregateType::Enum type, bool enableSelfCollision)
    {
        const PxU32 selfCollisionBit = enableSelfCollision ? 1 : 0;
        return PxAggregateFilterHint((PxU32(type)<<1)|selfCollisionBit);
    }

    PX_CUDA_CALLABLE PX_FORCE_INLINE    PxU32                   PxGetAggregateSelfCollisionBit(PxAggregateFilterHint hint)
    {
        return hint & 1;
    }

    PX_CUDA_CALLABLE PX_FORCE_INLINE    PxAggregateType::Enum   PxGetAggregateType(PxAggregateFilterHint hint)
    {
        return PxAggregateType::Enum(hint>>1);
    }

class PxAggregate : public PxBase
{
public:

    virtual void    release()   = 0;

    virtual bool    addActor(PxActor& actor, const PxBVH* bvh = NULL)   = 0;

    virtual bool    removeActor(PxActor& actor)     = 0;

    virtual bool    addArticulation(PxArticulationReducedCoordinate& articulation) = 0;

    virtual bool    removeArticulation(PxArticulationReducedCoordinate& articulation) = 0;

    virtual PxU32   getNbActors() const = 0;

    virtual PxU32   getMaxNbActors() const = 0;

    virtual PxU32   getMaxNbShapes() const = 0;

    virtual PxU32   getActors(PxActor** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0;

    virtual PxScene*    getScene()  = 0;

    virtual bool        getSelfCollision()  const   = 0;

    virtual bool    setEnvironmentID(PxU32 envID)   = 0;

    virtual PxU32   getEnvironmentID()      const   = 0;

    virtual const char* getConcreteTypeName() const PX_OVERRIDE PX_FINAL    { return "PxAggregate"; }

            void*       userData;

protected:
    PX_INLINE           PxAggregate(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL)  {}
    PX_INLINE           PxAggregate(PxBaseFlags baseFlags) : PxBase(baseFlags) {}
    virtual             ~PxAggregate() {}
    virtual bool        isKindOf(const char* name) const { PX_IS_KIND_OF(name, "PxAggregate", PxBase); }
};

#if !PX_DOXYGEN
} // namespace physx
#endif

#endif