Example #1
0
void ILiquidBody::updateLiquidBody()
{
    if(EnableGlobalWave)
    {
        if(Device->getTimer()->getTime() >= (LastGlobalWaveUpdateTime+GlobalWaveUpdateFrequency))
        {
            if(LiquidRising)
            {
                if(LiquidExtents.MaxEdge.Y <= (LiquidLevel+MaxGlobalWaveHeight))
                    LiquidExtents.MaxEdge.Y += GlobalWaveChangeIncrement;

                else
                    LiquidRising = false;
            }

            else if(!LiquidRising)
            {
                if(LiquidExtents.MaxEdge.Y >= (LiquidLevel+MinGlobalWaveHeight))
                    LiquidExtents.MaxEdge.Y += -GlobalWaveChangeIncrement;

                else
                    LiquidRising = true;
            }

            LastGlobalWaveUpdateTime = Device->getTimer()->getTime();
        }
    }

    if(DebugDraw)
    {
        Device->getVideoDriver()->setMaterial(DynamicsWorld->getDebugMaterial());
        Device->getVideoDriver()->setTransform(irr::video::ETS_WORLD, irr::core::matrix4());

        Device->getVideoDriver()->draw3DBox(LiquidExtents, irr::video::SColor(255, 0, 0, 100));
    }

    for(u32 i=0; i < DynamicsWorld->getNumCollisionObjects(); i++)
    {
        ICollisionObject* obj = DynamicsWorld->getCollisionObjectByIndex(i);

        if(obj->isLiquidSimulationEnabled())
        {
            if(obj->getObjectType() == ECOT_RIGID_BODY)
            {
                if((!Infinite && LiquidExtents.intersectsWithBox(static_cast<IRigidBody*>(obj)->getLiquidBox()))
                    ||
                    (Infinite && (static_cast<IRigidBody*>(obj)->getLiquidBox().MinEdge.Y<LiquidExtents.MaxEdge.Y
                    && (InfiniteDepth ? InfiniteDepth:(static_cast<IRigidBody*>(obj)->getLiquidBox().MaxEdge.Y>LiquidExtents.MinEdge.Y)))))
                    affectRigidBody(static_cast<IRigidBody*>(obj));
            }
        }
    }
}