private void btnOK_Click(object sender, EventArgs e) { try { if (this.CanDo()) { RasterUtil rasterUtil = new RasterUtil(); if (!(this.m_pOutName is IRasterCatalogName)) { IRasterWorkspaceEx rasterWorkspaceEx = this.m_pOutName.Open() as IRasterWorkspaceEx; for (int i = 0; i < this.m_pInNames.Count; i++) { IRasterDataset2 rasterDataset2 = (this.m_pInNames[i] as IName).Open() as IRasterDataset2; string fileNameWithoutExtension = Path.GetFileNameWithoutExtension((rasterDataset2 as IDataset).Name); if ((fileNameWithoutExtension[0] < '0' ? false : fileNameWithoutExtension[0] <= '9')) { fileNameWithoutExtension = string.Concat("A", fileNameWithoutExtension); } if (rasterWorkspaceEx is IWorkspace2) { int num = 1; string str = fileNameWithoutExtension; try { while ( (rasterWorkspaceEx as IWorkspace2).NameExists[ esriDatasetType.esriDTFeatureClass, str]) { str = string.Concat(fileNameWithoutExtension, "_", num.ToString()); num++; } } catch { } fileNameWithoutExtension = str; } ((IGeometryDefEdit)(new GeometryDef())).SpatialReference_2 = (rasterDataset2 as IGeoDataset).SpatialReference; rasterWorkspaceEx.SaveAsRasterDataset(fileNameWithoutExtension, rasterDataset2.CreateFullRaster(), null, "", null, null); } } else { IFeatureClass featureClass = this.m_pOutName.Open() as IFeatureClass; rasterUtil.ToRasterCatalog(this.m_pInNames, featureClass); } } } catch (Exception exception1) { Exception exception = exception1; CErrorLog.writeErrorLog(this, exception, ""); MessageBox.Show(exception.Message); } this.progressBar1.Visible = false; }
/// <summary> /// Apply the damage to all tilemaps in range. Will penetrate multiple tiles if damage is high enough /// </summary> public (Vector3 hitPos, Vector3 endHitPos) ApplyDamage(TileManager[] exclude) { var hits = Physics2D.LinecastAll(StartPos, EndPos); Array.Sort(hits, (h1, h2) => h1.distance.CompareTo(h2.distance)); Debug.DrawLine(StartPos, EndPos, Color.green, 5f); var done = false; Vector2 hitPos = EndPos; Vector2 endHitPos = EndPos; Vector2 direction = EndPos - StartPos; foreach (RaycastHit2D hit in hits) { var tileManager = hit.transform.GetComponent <TileManager>(); if (tileManager is null) { continue; } if (exclude.Contains(tileManager)) { continue; } Vector2 lineStart = hit.point - 0.5f * Direction; if (hitPos == EndPos) { hitPos = lineStart; } Vector2 lineEnd = EndPos; Debug.DrawLine(lineStart, lineEnd, Color.red, 5f); var dmgToObject = 0f; var line = RasterUtil.Line(tileManager.PositionToCords(lineStart), tileManager.PositionToCords(lineEnd)); foreach (Vector3Int cord in line) { tileManager.DamageTile(cord, BaseDamage, out float damageUsed); if (Math.Abs(damageUsed - BaseDamage) < float.Epsilon) { done = true; Vector2 localEndPos = tileManager.CordsToPosition(cord); endHitPos = RasterUtil.FindNearestPointOnLine(hitPos, direction, tileManager.transform.TransformPoint(localEndPos)); break; } BaseDamage -= damageUsed; dmgToObject += damageUsed; } tileManager.Rigidbody2D.AddForceAtPosition(Direction * dmgToObject * 1e-3f, lineStart); if (done) { break; } } return(hitPos, endHitPos); }