/** * 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(int /*deltaType*/) { /// @todo Do not assume the CURRENT map. Map &map = App_WorldSystem().map(); #define PLN_FLOOR 0 #define PLN_CEILING 1 float height[2] = { 0, 0 }; float target[2] = { 0, 0 }; float speed[2] = { 0, 0 }; // Sector index number. Sector *sec = map.sectorPtr(Reader_ReadUInt16(msgReader)); DENG2_ASSERT(sec); // Flags. int 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->floorSurface().tintColor(); 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->floorSurface().setTintColor(newColor); } if(df & (SDF_CEIL_COLOR_RED | SDF_CEIL_COLOR_GREEN | SDF_CEIL_COLOR_BLUE)) { Vector3f newColor = sec->ceilingSurface().tintColor(); 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->ceilingSurface().setTintColor(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 }