/** * Determines the Z-axis bias scale factor for the given @a sector. */ static int biasForSector(Sector const §or) { 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; }
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 }