public void CheckSurface(BuildingObj Ting, int SurfaceIndex, Vector3 LTingCenter, Vector3 RTingCenter) { RoofSurfaceStruct surface = Ting.roofController.SurfaceList[SurfaceIndex]; Plane midPlane = new Plane((LTingCenter - RTingCenter).normalized, (LTingCenter + RTingCenter) / 2); //* 兩亭中間切平面 //** 依序檢查每一個表面脊 (左、中、右分開做) for (int iIndex = 0; iIndex < surface.leftRoofSurfaceTileRidgeList.Count; iIndex++) { RoofSurfaceRidgeStruct surfaceRidge = surface.leftRoofSurfaceTileRidgeList[iIndex]; RemoveSurfacePosByPlane(midPlane, surfaceRidge, Ting.roofTopCenter); } if (surface.midRoofSurfaceTileRidge != null) { RemoveSurfacePosByPlane(midPlane, surface.midRoofSurfaceTileRidge, Ting.roofTopCenter); } for (int iIndex = 0; iIndex < surface.rightRoofSurfaceTileRidgeList.Count; iIndex++) { RoofSurfaceRidgeStruct surfaceRidge = surface.rightRoofSurfaceTileRidgeList[iIndex]; RemoveSurfacePosByPlane(midPlane, surfaceRidge, Ting.roofTopCenter); } //** }
/** * 刪除超過平面的瓦片位置 * 輸入: 切割平面、屋面瓦片用脊、同側的基準點 */ private void RemoveSurfacePosByPlane(Plane MidPlane, RoofSurfaceRidgeStruct surfaceRidge, Vector3 BasePos) { //如果和BasePos不同側表示屋面有被平面切割 if (surfaceRidge.tilePosList.Count > 0 && !MidPlane.SameSide(surfaceRidge.tilePosList[0], BasePos)) { int tileListCount = surfaceRidge.tilePosList.Count; for (int iPosIndex = 0; iPosIndex < tileListCount; iPosIndex++) { //** 若檢查瓦片用脊未到倒數第二個前,檢查方式除了當前瓦片外,還會看下一個瓦片是否也需要刪除,用來讓兩亭交接處不出現鋸齒狀空洞 if (iPosIndex < tileListCount - 1) { if (!MidPlane.SameSide(surfaceRidge.tilePosList[0], BasePos) && !MidPlane.SameSide(surfaceRidge.tilePosList[1], BasePos)) { surfaceRidge.tilePosList.RemoveAt(0); surfaceRidge.roundTileModelList[0].transform.parent = null; Destroy(surfaceRidge.roundTileModelList[0].gameObject); surfaceRidge.roundTileModelList.RemoveAt(0); } else { break; } } //只有一個瓦片的時候 else if (!MidPlane.SameSide(surfaceRidge.tilePosList[0], BasePos)) { surfaceRidge.tilePosList.RemoveAt(0); surfaceRidge.roundTileModelList[0].transform.parent = null; Destroy(surfaceRidge.roundTileModelList[0].gameObject); surfaceRidge.roundTileModelList.RemoveAt(0); } else { break; } } } }