public void RefreshBlockVisualising(Block b, byte face) { if (b == null) { return; } byte visibilityMask = GetVisibilityMask(b.pos); BlockpartVisualizeInfo currentBlockInfo = null; for (int i = 0; i < blockVisualizersList.Count; i++) { var bvi = blockVisualizersList[i]; if (bvi.pos == b.pos && bvi.meshInfo.faceIndex == face) { currentBlockInfo = bvi; blockVisualizersList.RemoveAt(i); } } if ((visibilityMask & (1 << face)) != 0) // должен быть видимым { if (currentBlockInfo == null) { currentBlockInfo = b.GetFaceVisualData(face); if (currentBlockInfo == null) { return; } blockVisualizersList.Add(currentBlockInfo); if (!redrawRequiredTypes.Contains(currentBlockInfo.meshInfo)) { redrawRequiredTypes.Add(currentBlockInfo.meshInfo); } } else { if (!redrawRequiredTypes.Contains(currentBlockInfo.meshInfo)) { redrawRequiredTypes.Add(currentBlockInfo.meshInfo); } currentBlockInfo = b.GetFaceVisualData(face); blockVisualizersList.Add(currentBlockInfo); if (!redrawRequiredTypes.Contains(currentBlockInfo.meshInfo)) { redrawRequiredTypes.Add(currentBlockInfo.meshInfo); } } } else // не должен быть виден { if (currentBlockInfo != null) { if (!redrawRequiredTypes.Contains(currentBlockInfo.meshInfo)) { redrawRequiredTypes.Add(currentBlockInfo.meshInfo); } } } chunkRenderUpdateRequired = true; }
public override bool Equals(object obj) { // Check for null values and compare run-time types. if (obj == null || GetType() != obj.GetType()) { return(false); } BlockpartVisualizeInfo p = (BlockpartVisualizeInfo)obj; return((p.pos == pos) && (p.meshInfo == meshInfo) && (meshType == p.meshType) && (materialID == p.materialID) && (meshRotation == p.meshRotation)); }
public void RefreshBlockVisualising(Block b) { if (GameMaster.loading) { return; } var correctData = b.GetVisualizeInfo(GetVisibilityMask(b.pos)); var pos = b.pos; if (correctData == null) { // нет видимых частей, удалить все, что относится к блоку RemoveBlockVisualisers(pos); return; } else { int i = 0; bool corrections = false; MeshVisualizeInfo mvi; byte findex; var correctDataArray = new BlockpartVisualizeInfo[8]; foreach (var fbvi in correctData) { findex = fbvi.meshInfo.faceIndex; correctDataArray[findex] = fbvi; } correctData = null; BlockpartVisualizeInfo bvi; while (i < blockVisualizersList.Count) { if (blockVisualizersList[i].pos == pos) { bvi = blockVisualizersList[i]; mvi = bvi.meshInfo; findex = bvi.meshInfo.faceIndex; if (correctDataArray[findex] != null) { // замена существующих данных if (bvi != correctDataArray[findex]) { blockVisualizersList[i] = correctDataArray[findex]; corrections = true; if (!redrawRequiredTypes.Contains(mvi)) { redrawRequiredTypes.Add(mvi); // удаленный тип } mvi = correctDataArray[findex].meshInfo; if (!redrawRequiredTypes.Contains(mvi)) { redrawRequiredTypes.Add(mvi); // новый тип } correctDataArray[findex] = null; // все записанные стираются, незаписанные впишутся позже } i++; } else { blockVisualizersList.RemoveAt(i); corrections = true; if (!redrawRequiredTypes.Contains(mvi)) { redrawRequiredTypes.Add(mvi); } continue; } } else { i++; } } foreach (var fbvi in correctDataArray) { if (fbvi != null) { blockVisualizersList.Add(fbvi); corrections = true; mvi = fbvi.meshInfo; if (!redrawRequiredTypes.Contains(mvi)) { redrawRequiredTypes.Add(mvi); } } } if (corrections) { chunkRenderUpdateRequired = true; } } }