Example #1
0
/**
 * Determines the Z-axis bias scale factor for the given @a sector.
 */
static int biasForSector(Sector const &sector)
{
    int const height = int(sector.ceiling().height() - sector.floor().height());
    bool hasSkyFloor = sector.floorSurface().hasSkyMaskedMaterial();
    bool hasSkyCeil  = sector.ceilingSurface().hasSkyMaskedMaterial();

    if(hasSkyFloor && !hasSkyCeil)
    {
        return -height / 6;
    }
    if(!hasSkyFloor && hasSkyCeil)
    {
        return height / 6;
    }
    if(height > 100)
    {
        return (height - 100) / 2;
    }
    return 0;
}
Example #2
0
void Cl_ReadSectorDelta(dint /*deltaType*/)
{
    /// @todo Do not assume the CURRENT map.
    world::Map &map = App_World().map();

#define PLN_FLOOR   0
#define PLN_CEILING 1

    dfloat height[2] = { 0, 0 };
    dfloat target[2] = { 0, 0 };
    dfloat speed[2]  = { 0, 0 };

    // Sector index number.
    Sector *sec = map.sectorPtr(Reader_ReadUInt16(msgReader));
    DENG2_ASSERT(sec);

    // Flags.
    dint df = Reader_ReadPackedUInt32(msgReader);

    if (df & SDF_FLOOR_MATERIAL)
    {
        P_SetPtrp(sec, DMU_FLOOR_OF_SECTOR | DMU_MATERIAL,
                  Cl_LocalMaterial(Reader_ReadPackedUInt16(msgReader)));
    }
    if (df & SDF_CEILING_MATERIAL)
    {
        P_SetPtrp(sec, DMU_CEILING_OF_SECTOR | DMU_MATERIAL,
                  Cl_LocalMaterial(Reader_ReadPackedUInt16(msgReader)));
    }

    if (df & SDF_LIGHT)
        P_SetFloatp(sec, DMU_LIGHT_LEVEL, Reader_ReadByte(msgReader) / 255.0f);

    if (df & SDF_FLOOR_HEIGHT)
        height[PLN_FLOOR] = FIX2FLT(Reader_ReadInt16(msgReader) << 16);
    if (df & SDF_CEILING_HEIGHT)
        height[PLN_CEILING] = FIX2FLT(Reader_ReadInt16(msgReader) << 16);
    if (df & SDF_FLOOR_TARGET)
        target[PLN_FLOOR] = FIX2FLT(Reader_ReadInt16(msgReader) << 16);
    if (df & SDF_FLOOR_SPEED)
        speed[PLN_FLOOR] = FIX2FLT(Reader_ReadByte(msgReader) << (df & SDF_FLOOR_SPEED_44 ? 12 : 15));
    if (df & SDF_CEILING_TARGET)
        target[PLN_CEILING] = FIX2FLT(Reader_ReadInt16(msgReader) << 16);
    if (df & SDF_CEILING_SPEED)
        speed[PLN_CEILING] = FIX2FLT(Reader_ReadByte(msgReader) << (df & SDF_CEILING_SPEED_44 ? 12 : 15));

    if (df & (SDF_COLOR_RED | SDF_COLOR_GREEN | SDF_COLOR_BLUE))
    {
        Vector3f newColor = sec->lightColor();
        if (df & SDF_COLOR_RED)
            newColor.x = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_COLOR_GREEN)
            newColor.y = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_COLOR_BLUE)
            newColor.z = Reader_ReadByte(msgReader) / 255.f;
        sec->setLightColor(newColor);
    }

    if (df & (SDF_FLOOR_COLOR_RED | SDF_FLOOR_COLOR_GREEN | SDF_FLOOR_COLOR_BLUE))
    {
        Vector3f newColor = sec->floor().surface().color();
        if (df & SDF_FLOOR_COLOR_RED)
            newColor.x = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_FLOOR_COLOR_GREEN)
            newColor.y = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_FLOOR_COLOR_BLUE)
            newColor.z = Reader_ReadByte(msgReader) / 255.f;
        sec->floor().surface().setColor(newColor);
    }

    if (df & (SDF_CEIL_COLOR_RED | SDF_CEIL_COLOR_GREEN | SDF_CEIL_COLOR_BLUE))
    {
        Vector3f newColor = sec->ceiling().surface().color();
        if (df & SDF_CEIL_COLOR_RED)
            newColor.x = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_CEIL_COLOR_GREEN)
            newColor.y = Reader_ReadByte(msgReader) / 255.f;
        if (df & SDF_CEIL_COLOR_BLUE)
            newColor.z = Reader_ReadByte(msgReader) / 255.f;
        sec->ceiling().surface().setColor(newColor);
    }

    // The whole delta has now been read.

    // Do we need to start any moving planes?
    if (df & SDF_FLOOR_HEIGHT)
    {
        ClPlaneMover::newThinker(sec->floor(), height[PLN_FLOOR], 0);
    }
    else if (df & (SDF_FLOOR_TARGET | SDF_FLOOR_SPEED))
    {
        ClPlaneMover::newThinker(sec->floor(), target[PLN_FLOOR], speed[PLN_FLOOR]);
    }

    if (df & SDF_CEILING_HEIGHT)
    {
        ClPlaneMover::newThinker(sec->ceiling(), height[PLN_CEILING], 0);
    }
    else if (df & (SDF_CEILING_TARGET | SDF_CEILING_SPEED))
    {
        ClPlaneMover::newThinker(sec->ceiling(), target[PLN_CEILING], speed[PLN_CEILING]);
    }

#undef PLN_CEILING
#undef PLN_FLOOR
}