static void Main(string[] args) { int totalCount = 3; List<Student> listStudent = new List<Student>(); for (int i = 0; i < 3; i++) { Student objStudent = new Student(); Console.Write("Please enter the Student ID: "); objStudent.StudentId = Int32.Parse(Console.ReadLine()); Console.Write("Please enter the Student Name: "); objStudent.Name = Console.ReadLine(); listStudent.Add(objStudent); } //Query to get by name - only first occurence //Student student = listStudent.First(x => x.Name == "Karthik"); Student student = listStudent.FirstOrDefault(x => x.Name == "Karthik"); if(student != null) Console.WriteLine(string.Format("ID: {0} Name: {1}", student.StudentId, student.Name)); //Query to get by name - all occurences //IEnumerable<Student> stdList = listStudent.Where(x => x.Name == "Karthik"); IEnumerable<Student> stdList = listStudent.Where(x => x.StudentId >= 20); foreach (var student1 in stdList) { Console.WriteLine(string.Format("ID: {0} Name: {1}", student1.StudentId, student1.Name)); } listStudent.Sort((std1, std2) => std1.Name.CompareTo(std2.Name)); listStudent.ForEach(x=>Console.WriteLine(x.Name)); }
private static void Main() { // Generate random data to test functionality List<IShape> shapes = new List<IShape>(); for (int i = 0; i < 12; i++) { if (i < 4) { // Make Triangle IShape shape = GetShape(typeof(Triangle)); shapes.Add((Triangle)shape); } else if (i < 8) { // Make Rectangle IShape shape = GetShape(typeof(Rectangle)); shapes.Add((Rectangle)shape); } else { // Make Circle IShape shape = GetShape(typeof(Circle)); shapes.Add((Circle)shape); } } // Print result shapes.ForEach(x => Console.WriteLine(x)); }
private static void Main() { //List<Student> collectionOfStudents = new List<Student>(); //collectionOfStudents[0] = new Student("Ivan", "Petrov"); //collectionOfStudents[1] = new Student("Misho", "Geshev"); //collectionOfStudents[2] = new Student("Volen", "Siderov"); //collectionOfStudents[3] = new Student("Boiko", "Borisov"); //collectionOfStudents[4] = new Student("Rosen", "Plevneliev"); //collectionOfStudents[4] = new Student("Atanas", "Zlatanov"); //FindItLinqAndLambda(collectionOfStudents); //Console.WriteLine(); //FindItLinq(collectionOfStudents); List<Student> students = new List<Student>(); for (int i = 0; i < 10; i++) { Student student = new Student(GenerateRandom.Text(15), GenerateRandom.Text(15)); students.Add(student); } Console.WriteLine("\nUnsorted:\n"); students.ForEach(x => Console.WriteLine(x)); Console.WriteLine("\nSorted:\n"); FindItLinq(students); FindItLinqAndLambda(students); }
private static void Expression(List<Student> list) { Console.WriteLine("\nInitial state:\n"); list.ForEach(x => Console.WriteLine(x)); Console.WriteLine("\nDescending order with expression\n"); List<Student> sort1 = list.OrderByDescending(x => x.FirstName) .ThenByDescending(x => x.LastName) .ToList(); sort1.ForEach(x => Console.WriteLine(x)); }
private static void Main() { List<ICustomer> customers = new List<ICustomer>(); customers.Add(new Individual(1, "Ivan Ivanov", "Address", "123123123", "Bulgaria", "Sofia", "1231231231")); customers.Add(new Company(2, "Ivan Ivanov Company", "Address Company", "123123123", "Bulgaria", "Sofia", "123123123")); Console.WriteLine("Customers:"); customers.ForEach(x => Console.WriteLine(x)); List<IAccount> accounts = new List<IAccount>(); // Individuals accounts.Add(new Loan(1, customers[0], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); accounts.Add(new Mortgage(2, customers[0], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); accounts.Add(new Deposit(3, customers[0], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); //// Company accounts.Add(new Loan(4, customers[1], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); accounts.Add(new Mortgage(5, customers[1], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); accounts.Add(new Deposit(6, customers[1], DateTime.Now.AddDays(GenerateRandom.Number(1, 365) * -1))); Console.WriteLine("\nInitial accounts"); accounts.ForEach(x => Console.WriteLine(x)); // Set some random money and interest rate SeedMoney(accounts); // Bank Bank bank = new Bank("Big Bank", "Bank address"); AddAccountsToBank(bank, accounts); // Calculate interest rate foreach (var account in bank.Accounts) { Console.WriteLine("Balance: {0}, Interrest Rate: {1}, Calculate Interest: {2}", account.Balance, account.InterestRate, account.CalculateInterest()); } // Deposit foreach (var account in bank.Accounts) { account.Deposit(GenerateRandom.Number(100, 1000)); } ShowBank(bank); Console.WriteLine("\nDraw:"); foreach (var account in bank.Accounts) { account.Draw(GenerateRandom.Number(100, 1000)); } ShowBank(bank); }
private static void Main() { List<Person> persons = new List<Person>(); for (int i = 0; i < 50; i++) { string name = GenerateRandom.Text(GenerateRandom.Number(5, 15)) + " " + GenerateRandom.Text(GenerateRandom.Number(5, 15)); Person person = new Person(name, GenerateRandom.Number(0, 100)); persons.Add(person); } persons.ForEach(p => Console.WriteLine(p)); }
public ActionResult ManageCodes(string type, List<Code> codes) { if (string.IsNullOrWhiteSpace(type)) { var types = _codes.GetTypes(); ViewBag.Types = new SelectList(types, type); return View("ManageCodes"); } else if (Request.IsPost()) { codes.ForEach(_codes.Save); return RedirectToAction("ManageCodes", new { type }); } else { var model = _codes.Query(type).ToList(); return View("ManageCodes", model); } }
private static void Main() { List<Student> list = new List<Student>(); for (int i = 0; i < 20; i++) { Student student = new Student(GenerateRandom.Text(10), GenerateRandom.Text(10)); student.Age = GenerateRandom.Number(15, 35); list.Add(student); } Console.WriteLine("\nAll:\n"); list.ForEach(x => Console.WriteLine(x)); Console.WriteLine("\nFilterd 1:\n"); var sorted1 = list.Where(x => x.Age >= 18 && x.Age <= 24) .Select(x => new { FirstName = x.FirstName, LastName = x.LastName, Age = x.Age }).ToList(); sorted1.ForEach(x => Console.WriteLine(x.FirstName + " " + x.LastName + " " + x.Age)); Console.WriteLine("\nFilterd 2:\n"); var sorted2 = from s in list where s.Age >= 18 && s.Age <= 24 select new { FirstName = s.FirstName, LastName = s.LastName, Age = s.Age }; foreach (var x in sorted2) { Console.WriteLine(x.FirstName + " " + x.LastName + " " + x.Age); } }
public bool Parse() { Dictionary<System.Dataflow.Identifier, System.Type> xamlMap = GetTypeMap(); try { string source = File.ReadAllText(SourcePath); Architecture tmp = Parser.Parse<Architecture>(source, xamlMap, err); var stb = new SymbolTableBuilder(); tmp.Visit(stb); if (stb.SymbolTable.Errors.Count > 0) { var errors = new List<string>(stb.SymbolTable.Errors); errors.ForEach(e => Debug.WriteLine(e)); return false; } Architecture = tmp; } catch (Exception e) { Logger.ErrorEx(e, "Unable to parse '{0}'.", SourcePath); } return Architecture != null; }
private void OnPaste(IInputElement container) { using (new WaitWrapper()) using (new TimeCounter("Command.Paste: {0}")) if (NormalizeBuffer(container)) { var designerItems = new List<DesignerItem>(); DesignerCanvas.Toolbox.SetDefault(); DesignerCanvas.DeselectAll(); var newItems = new List<DesignerItem>(); foreach (var elementBase in _buffer) { var element = elementBase.Clone(); element.UID = Guid.NewGuid(); var designerItem = DesignerCanvas.CreateElement(element); designerItems.Add(designerItem); newItems.Add(designerItem); } newItems.ForEach(item => item.IsSelected = true); ServiceFactoryBase.Events.GetEvent<ElementAddedEvent>().Publish(DesignerCanvas.SelectedElements.ToList()); MoveToFrontCommand.Execute(); DesignerCanvas.DesignerChanged(); } }
string GetErrorString(List<Error> errors) { if (errors.Count == 0) return null; var builder = new StringBuilder(); errors.ForEach(i => builder.AppendLine(i.Message)); return builder.ToString(); }
public void UpdateMaxNumberOfLogs(int maxNumberOfLogs) { if (MaxNumberOfLogsPerLevel <= maxNumberOfLogs) { MaxNumberOfLogsPerLevel = maxNumberOfLogs; return; } MaxNumberOfLogsPerLevel = maxNumberOfLogs; List<LogViewModel> logsToRemove = new List<LogViewModel>(); List<LogViewModel> logsToRemoveTrace = LogsTrace.Take(LogsTrace.Count - maxNumberOfLogs).ToList(); logsToRemoveTrace.ForEach((m) => { LogsTrace.Remove(m); }); List<LogViewModel> logsToRemoveDebug = LogsDebug.Take(LogsDebug.Count - maxNumberOfLogs).ToList(); logsToRemoveDebug.ForEach((m) => { LogsDebug.Remove(m); }); List<LogViewModel> logsToRemoveInfo = LogsInfo.Take(LogsInfo.Count - maxNumberOfLogs).ToList(); logsToRemoveInfo.ForEach((m) => { LogsInfo.Remove(m); }); List<LogViewModel> logsToRemoveWarn = LogsWarn.Take(LogsWarn.Count - maxNumberOfLogs).ToList(); logsToRemoveWarn.ForEach((m) => { LogsWarn.Remove(m); }); List<LogViewModel> logsToRemoveError = LogsError.Take(LogsError.Count - maxNumberOfLogs).ToList(); logsToRemoveError.ForEach((m) => { LogsError.Remove(m); }); List<LogViewModel> logsToRemoveFatal = LogsFatal.Take(LogsFatal.Count - maxNumberOfLogs).ToList(); logsToRemoveFatal.ForEach((m) => { LogsFatal.Remove(m); }); logsToRemove.AddRange(logsToRemoveTrace); logsToRemove.AddRange(logsToRemoveDebug); logsToRemove.AddRange(logsToRemoveInfo); logsToRemove.AddRange(logsToRemoveWarn); logsToRemove.AddRange(logsToRemoveError); logsToRemove.AddRange(logsToRemoveFatal); logsToRemove.ForEach((m) => { if (IsActive && LoggingLevel.IsLogLevelAboveMin(m.Level, SelectedMinLogLevel) && IsNamespaceActive(m) && IsSearchCriteriaMatch(m)) { Logs.Remove(m); } }); }
public void WriteConfig(GKDevice gkControllerDevice, GKProgressCallback progressCallback, Guid clientUID) { Errors = new List<string>(); progressCallback = GKProcessorManager.StartProgress("Запись конфигурации", "Проверка связи", 1, false, GKProgressClientType.Administrator, clientUID); try { var gkDatabase = DescriptorsManager.GkDatabases.FirstOrDefault(x => x.RootDevice.UID == gkControllerDevice.UID); if (gkDatabase != null) { var kauDatabases = new List<KauDatabase>(); var lostKauDatabases = new List<KauDatabase>(); using (var gkLifecycleManager = new GKLifecycleManager(gkDatabase.RootDevice, "Проверка связи")) { gkLifecycleManager.AddItem("ГК"); var pingResult = DeviceBytesHelper.Ping(gkDatabase.RootDevice); if (pingResult.HasError) { Errors.Add("Устройство " + gkDatabase.RootDevice.PresentationName + " недоступно"); return; } foreach (var kauDatabase in gkDatabase.KauDatabases) { gkLifecycleManager.AddItem(kauDatabase.RootDevice.PresentationName); pingResult = DeviceBytesHelper.Ping(kauDatabase.RootDevice); if (!pingResult.HasError) { kauDatabases.Add(kauDatabase); } else { lostKauDatabases.Add(kauDatabase); } } } for (int i = 0; i < 3; i++) { Errors = new List<string>(); var summaryDescriptorsCount = 4 + gkDatabase.Descriptors.Count; kauDatabases.ForEach(x => { summaryDescriptorsCount += 3 + x.Descriptors.Count; }); var title = "Запись конфигурации в " + gkDatabase.RootDevice.PresentationName + (i > 0 ? " Попытка " + (i + 1) : ""); progressCallback = GKProcessorManager.StartProgress(title, "", summaryDescriptorsCount, false, GKProgressClientType.Administrator, clientUID); var result = DeviceBytesHelper.GoToTechnologicalRegime(gkDatabase.RootDevice, progressCallback, clientUID); if (!result) { Errors.Add("Не удалось перевести " + gkControllerDevice.PresentationName + " в технологический режим\nУстройство не доступно, либо вашего IP адреса нет в списке разрешенного адреса ГК"); continue; } result = DeviceBytesHelper.EraseDatabase(gkDatabase.RootDevice, progressCallback, clientUID); if (!result) { Errors.Add("Не удалось стереть базу данных ГК"); continue; } foreach (var kauDatabase in kauDatabases) { result = DeviceBytesHelper.GoToTechnologicalRegime(kauDatabase.RootDevice, progressCallback, clientUID); if (!result) { Errors.Add("Не удалось перевести КАУ в технологический режим"); continue; } if (!DeviceBytesHelper.EraseDatabase(kauDatabase.RootDevice, progressCallback, clientUID)) { Errors.Add("Не удалось стереть базу данных КАУ"); continue; } if (!WriteConfigToDevice(kauDatabase, progressCallback, clientUID)) { Errors.Add("Не удалось записать дескриптор КАУ"); } } result = WriteConfigToDevice(gkDatabase, progressCallback, clientUID); if (!result) { Errors.Add("Не удалось записать дескриптор ГК"); continue; } var gkFileReaderWriter = new GKFileReaderWriter(); gkFileReaderWriter.WriteFileToGK(gkControllerDevice, clientUID); if (gkFileReaderWriter.Error != null) { Errors.Add(gkFileReaderWriter.Error); break; } foreach (var kauDatabase in kauDatabases) { if (!DeviceBytesHelper.GoToWorkingRegime(kauDatabase.RootDevice, progressCallback, clientUID, kauDatabase.RootDevice.Driver.IsKau)) { Errors.Add("Не удалось перевести " + kauDatabase.RootDevice.PresentationName + " в рабочий режим"); } } if (!DeviceBytesHelper.GoToWorkingRegime(gkDatabase.RootDevice, progressCallback, clientUID, false)) { Errors.Add("Не удалось перевести " + gkDatabase.RootDevice + " в рабочий режим"); } break; } foreach (var kauDatabase in lostKauDatabases) { Errors.Add("Устройство " + kauDatabase.RootDevice.PresentationName + " недоступно"); } } } catch (Exception e) { Logger.Error(e, "GKDescriptorsWriter.WriteConfig"); Errors.Add(e.Message); } finally { if (progressCallback != null) GKProcessorManager.StopProgress(progressCallback, clientUID); } }
/// <summary> /// 导出Excel文件,并自定义文件名 /// </summary> /// <param name="dtData">数据源 datatable</param> /// <param name="FileName">文件名</param> /// <param name="columnList">表头</param> public static void DataTable3Excel(System.Data.DataTable dtData, String FileName, List<string[]> columnList) { GridView dgExport = null; HttpContext curContext = HttpContext.Current; StringWriter strWriter = null; HtmlTextWriter htmlWriter = null; if (dtData != null) { HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8); curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls"); curContext.Response.ContentType = "application nd.ms-excel"; curContext.Response.ContentEncoding = System.Text.Encoding.Default; curContext.Response.Charset = "gb2312"; using (strWriter = new StringWriter()) { htmlWriter = new HtmlTextWriter(strWriter); dgExport = new GridView(); dgExport.AutoGenerateColumns = false; /*--------创建列-----------*/ columnList.ForEach((arr) => { BoundField boundField = new BoundField(); boundField.HtmlEncode = false; boundField.DataField = arr[0]; boundField.HeaderText = arr[1]; //boundField.DataFormatString= //boundField. // boundField.DataFormatString= dgExport.Columns.Add(boundField); }); dgExport.DataSource = dtData.DefaultView; dgExport.AllowPaging = false; dgExport.DataBind(); try { dgExport.RenderControl(htmlWriter); } catch (Exception e) { Log4Net.LogWrite("error", e.Message); } curContext.Response.Write(strWriter.ToString()); curContext.Response.End(); } } }
private void SortAssembliesToImport() { var assemblies = new List<ActivityAssemblyItemViewModel>(AssembliesToImport .OrderByDescending(item => item.Location == String.Empty) .ThenByDescending(item => item.IsResolved) .ThenBy(item => item.Name)); AssembliesToImport.Clear(); assemblies.ForEach(item => AssembliesToImport.Add(item)); }
public ActionResult Index(InitializeModel item) { if (applicationDbContext.SysEnterprises.Any(u => !u.Deleted && u.EnterpriseName == item.EnterpriseName)) { ModelState.AddModelError("EnterpriseName", @"该企业名称已存在"); } if (applicationDbContext.SysEnterprises.Any(u => !u.Deleted && u.EnterpriseShortName == item.EnterpriseShortName)) { ModelState.AddModelError("EnterpriseShortName", @"该企业简称已存在"); } if (!ModelState.IsValid) { return View(item); } try { #region SysEnterprise var host = Spell.MakeSpellCode(item.EnterpriseShortName, SpellOptions.FirstLetterOnly); //检查Host是否已经被占用 while (applicationDbContext.SysEnterprises.Any(a => a.Host == host)) { host = host + new Random().Next(11, 99); } host = host + ".wjw1.com"; var sysEnterprise = new SysEnterprise { EnterpriseName = item.EnterpriseName, EnterpriseShortName = item.EnterpriseShortName, Host = host }; applicationDbContext.SysEnterprises.Add(sysEnterprise); #endregion //添加管理员权限栏位 #region SysRole //var sysRole = new SysRole { RoleName = "管理员", EnterpriseId = sysEnterprise.Id }; var sysRole = new SysRole() { RoleName = "管理员" }; applicationDbContext.SysRoles.Add(sysRole); #endregion //添加管理员账号 #region Add Administrator User var sysUser = new SysUser { //EnterpriseId = sysEnterprise.Id, UserName = item.UserName, DisplayName = "系统管理员", Email = item.Email, Password = HashPassword.GetHashPassword(item.Password), OldPassword = HashPassword.GetHashPassword(item.Password), }; applicationDbContext.SysUsers.Add(sysUser); #endregion //对应管理员账号和管理员权限 #region SysRoleSysUser var sysRoleSysUser = new SysRoleSysUser { //EnterpriseId = sysEnterprise.Id, SysUserId = sysUser.Id, SysRoleId = sysRole.Id }; applicationDbContext.SysRoleSysUsers.Add(sysRoleSysUser); #endregion //添加详细权限给予管理员角色 #region SysRoleSysControllerSysAction var sysRoleSysControllerSysAction = new List<SysRoleSysControllerSysAction>(); foreach (var sysControllerSysAction in applicationDbContext.SysControllerSysActions) { sysRoleSysControllerSysAction.Add(new SysRoleSysControllerSysAction { //EnterpriseId = sysEnterprise.Id, SysControllerSysActionId = sysControllerSysAction.Id, SysRoleId = sysRole.Id }); } sysRoleSysControllerSysAction.ForEach(a => applicationDbContext.SysRoleSysControllerSysActions.Add(a)); #endregion applicationDbContext.SaveChanges(); TempData[Alerts.SUCCESS] = "注册成功!"; return RedirectToAction("Index", "Succes", new { Id = sysEnterprise.Id }); } catch (Exception e) { ModelState.AddModelError("", e.Message); return View(item); } }
public override void Run() { GBuffer gbuffer = ToDispose(new GBuffer(this.RenderTargetSize.Width, this.RenderTargetSize.Height, new SampleDescription(1, 0), Format.R8G8B8A8_UNorm, Format.R32_UInt, Format.R8G8B8A8_UNorm)); gbuffer.Initialize(this); GBuffer gbufferMS = ToDispose(new GBuffer(this.RenderTargetSize.Width, this.RenderTargetSize.Height, new SampleDescription(4, 0), Format.R8G8B8A8_UNorm, Format.R32_UInt, Format.R8G8B8A8_UNorm)); gbufferMS.Initialize(this); ScreenAlignedQuadRenderer saQuad = ToDispose(new ScreenAlignedQuadRenderer()); saQuad.Initialize(this); #region Create renderers // Note: the renderers take care of creating their own // device resources and listen for DeviceManager.OnInitialize // Create Light accumulator var sphereMesh = Common.Mesh.LoadFromFile("Sphere.cmo").FirstOrDefault(); //var coneMesh = Common.Mesh.LoadFromFile("Cone.cmo").FirstOrDefault(); var sphereRenderer = ToDispose(new MeshRenderer(sphereMesh)); sphereRenderer.Initialize(this); //var coneRenderer = new MeshRenderer(coneMesh); //coneRenderer.Initialize(this); var lightRenderer = ToDispose(new LightRenderer(sphereRenderer, saQuad, gbuffer)); var lightRendererMS = ToDispose(new LightRenderer(sphereRenderer, saQuad, gbufferMS)); lightRenderer.Lights.Add(new PerLight { Color = new Color4(0.2f, 0.2f, 0.2f, 1.0f), Position = new Vector3(1, 1, 1), Direction = new Vector3(0, 0, 1), Range = 10, Type = LightType.Ambient }); //lightRenderer.Lights.Add(new PerLight //{ // Color = new Color4(0.2f, 0.2f, 0.2f, 1.0f), // Direction = new Vector3(0, -1, 1), // Type = LightType.Directional //}); lightRenderer.Lights.Add(new PerLight { Color = Color.LightPink, Position = new Vector3(22.4f, 2.6f, -8.98f), Range = 20, Type = LightType.Point }); lightRenderer.Lights.Add(new PerLight { Color = new Color4(1.0f, 1.0f, 1.0f, 1.0f), Position = new Vector3(0, 10, 1), Range = 10, Type = LightType.Point }); var aLight = new PerLight { Color = new Color4(1.0f, 0.0f, 0.0f, 1.0f), Position = new Vector3(9.86f, 10.92f, -6.74f), Range = 20, Type = LightType.Point }; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Blue; aLight.Position.X = 2.32f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.LightYellow; aLight.Position.X = -1.0f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Cyan; aLight.Position.X = -5.11f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Lime; aLight.Position.X = -8.33f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.AliceBlue; aLight.Position.X = -12.55f; lightRenderer.Lights.Add(aLight); aLight.Position.Z = 5.02f; aLight.Color = Color.Red; aLight.Position.X = 9.86f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Blue; aLight.Position.X = 2.32f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.LightYellow; aLight.Position.X = -1.0f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Cyan; aLight.Position.X = -5.11f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.Lime; aLight.Position.X = -8.33f; lightRenderer.Lights.Add(aLight); aLight.Color = Color.AliceBlue; aLight.Position.X = -12.55f; lightRenderer.Lights.Add(aLight); //lightRenderer.Lights.Add(new PerLight //{ // Color = new Color4(1.0f, 1.0f, 1.0f, 1.0f), // Position = new Vector3(-2, 1, 2), // Direction = new Vector3(0, -1, 0), // Range = 2f, // Type = LightType.Spot, // SpotInnerCosine = (float)Math.Cos(0.4) / 2.0f, // SpotOuterCosine = (float)Math.Cos(1) / 2.0f, //}); lightRenderer.Initialize(this); lightRendererMS.Lights.AddRange(lightRenderer.Lights); lightRendererMS.Initialize(this); // Create a axis-grid renderer var axisGrid = ToDispose(new AxisGridRenderer()); axisGrid.Initialize(this); // Create and initialize the mesh renderer var loadedMesh = Common.Mesh.LoadFromFile("Sponza.cmo"); //var loadedMesh = Common.Mesh.LoadFromFile("Scene.cmo"); List<MeshRenderer> meshes = new List<MeshRenderer>(); meshes.AddRange((from mesh in loadedMesh select ToDispose(new MeshRenderer(mesh)))); meshes.ForEach(m => m.Initialize(this)); var meshWorld = Matrix.Identity; // Set the first animation as the current animation and start clock meshes.ForEach(m => { if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) m.CurrentAnimation = m.Mesh.Animations.First().Value; m.Clock.Start(); }); // Create and initialize a Direct2D FPS text renderer var fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); // Create and initialize a general purpose Direct2D text renderer // This will display some instructions and the current view and rotation offsets var textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 40), 12)); textRenderer.Initialize(this); #endregion // Initialize the world matrix var worldMatrix = Matrix.Identity; // Set the camera position slightly behind (z) var cameraPosition = new Vector3(15, 15, -1); var cameraTarget = new Vector3(-15, 5, -1); // Looking at the origin 0,0,0 var cameraUp = Vector3.UnitY; // Y+ is Up // Prepare matrices // Create the view matrix from our camera position, look target and up direction var viewMatrix = Matrix.LookAtRH(cameraPosition, cameraTarget, cameraUp); viewMatrix.TranslationVector += new Vector3(0, -0.98f, 0); // Create the projection matrix /* FoV 60degrees = Pi/3 radians */ // Aspect ratio (based on window size), Near clip, Far clip var projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 2f, 100f); // Maintain the correct aspect ratio on resize Window.Resize += (s, e) => { projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 2f, 100f); }; #region Rotation and window event handlers // Create a rotation vector to keep track of the rotation // around each of the axes var rotation = new Vector3(0.0f, 0.0f, 0.0f); var gbufferIndex = -1; Dictionary<Keys, bool> keyToggles = new Dictionary<Keys, bool>(); keyToggles[Keys.Z] = false; keyToggles[Keys.F] = false; keyToggles[Keys.M] = false; keyToggles[Keys.PrintScreen] = false; // We will call this action to update text // for the text renderer Action updateText = () => { textRenderer.Text = String.Format( "{0} (+/- to change)"+ "\n{1} (M to toggle)", gbufferIndex > -1 ? DebugGBuffer[gbufferIndex].DebugName : gbufferIndex < -1 ? "Forward Render (1 light)" : "Deferred with 15 lights", gbufferIndex == -2 || keyToggles[Keys.M] ? "Multisampled" : "No anti-aliasing" ); }; // Support keyboard/mouse input to rotate or move camera view var moveFactor = 0.02f; // how much to change on each keypress var shiftKey = false; var ctrlKey = false; var background = Color.White; var showNormals = false; var enableNormalMap = true; Window.KeyDown += (s, e) => { var context = DeviceManager.Direct3DContext; shiftKey = e.Shift; ctrlKey = e.Control; switch (e.KeyCode) { case Keys.Add: gbufferIndex++; if (gbufferIndex >= DebugGBuffer.Count) gbufferIndex = -2; break; case Keys.Subtract: gbufferIndex--; if (gbufferIndex < -2) gbufferIndex = DebugGBuffer.Count - 1; break; // WASD -> pans view case Keys.A: viewMatrix.TranslationVector += new Vector3(moveFactor * 12, 0f, 0f); break; case Keys.D: viewMatrix.TranslationVector -= new Vector3(moveFactor * 12, 0f, 0f); break; case Keys.S: if (shiftKey) viewMatrix.TranslationVector += new Vector3(0f, moveFactor * 12, 0f); else viewMatrix.TranslationVector -= new Vector3(0f, 0f, 1) * moveFactor * 12; break; case Keys.W: if (shiftKey) viewMatrix.TranslationVector -= new Vector3(0f, moveFactor * 12, 0f); else viewMatrix.TranslationVector += new Vector3(0f, 0f, 1) * moveFactor * 12; break; // Up/Down and Left/Right - rotates around X / Y respectively // (Mouse wheel rotates around Z) case Keys.Down: worldMatrix *= Matrix.RotationX(moveFactor); rotation += new Vector3(moveFactor, 0f, 0f); break; case Keys.Up: worldMatrix *= Matrix.RotationX(-moveFactor); rotation -= new Vector3(moveFactor, 0f, 0f); break; case Keys.Left: worldMatrix *= Matrix.RotationY(moveFactor); rotation += new Vector3(0f, moveFactor, 0f); break; case Keys.Right: worldMatrix *= Matrix.RotationY(-moveFactor); rotation -= new Vector3(0f, moveFactor, 0f); break; case Keys.T: fps.Show = !fps.Show; textRenderer.Show = !textRenderer.Show; break; case Keys.B: if (background == Color.White) { background = new Color(30, 30, 34); } else { background = Color.White; } break; case Keys.G: axisGrid.Show = !axisGrid.Show; break; case Keys.P: // Pause or resume mesh animation meshes.ForEach(m => { if (m.Clock.IsRunning) m.Clock.Stop(); else m.Clock.Start(); }); break; case Keys.X: // To test for correct resource recreation // Simulate device reset or lost. System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); DeviceManager.Initialize(DeviceManager.Dpi); System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); break; case Keys.Z: keyToggles[Keys.Z] = !keyToggles[Keys.Z]; if (keyToggles[Keys.Z]) { context.PixelShader.Set(depthPixelShader); } else { context.PixelShader.Set(pixelShader); } break; case Keys.F: keyToggles[Keys.F] = !keyToggles[Keys.F]; RasterizerStateDescription rasterDesc; if (context.Rasterizer.State != null) rasterDesc = context.Rasterizer.State.Description; else rasterDesc = new RasterizerStateDescription() { CullMode = CullMode.Back, FillMode = FillMode.Solid }; if (keyToggles[Keys.F]) { rasterDesc.FillMode = FillMode.Wireframe; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } else { rasterDesc.FillMode = FillMode.Solid; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } break; case Keys.M: keyToggles[Keys.M] = !keyToggles[Keys.M]; break; case Keys.N: if (!shiftKey) showNormals = !showNormals; else enableNormalMap = !enableNormalMap; break; case Keys.D1: context.PixelShader.Set(pixelShader); break; //case Keys.D2: // context.PixelShader.Set(lambertShader); // break; //case Keys.D3: // context.PixelShader.Set(phongShader); // break; case Keys.D4: context.PixelShader.Set(blinnPhongShader); break; case Keys.Insert: keyToggles[Keys.PrintScreen] = true; break; } updateText(); }; Window.KeyUp += (s, e) => { // Clear the shift/ctrl keys so they aren't sticky if (e.KeyCode == Keys.ShiftKey) shiftKey = false; if (e.KeyCode == Keys.ControlKey) ctrlKey = false; }; Window.MouseWheel += (s, e) => { if (shiftKey) { // Zoom in/out viewMatrix.TranslationVector += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor * 2); } else { // rotate around Z-axis viewMatrix *= Matrix.RotationZ((e.Delta / 120f) * moveFactor); rotation += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor); } updateText(); }; var lastX = 0; var lastY = 0; Window.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { lastX = e.X; lastY = e.Y; } }; Window.MouseMove += (s, e) => { if (e.Button == MouseButtons.Left) { var yRotate = lastX - e.X; var xRotate = lastY - e.Y; lastY = e.Y; lastX = e.X; // Mouse move changes viewMatrix *= Matrix.RotationX(-xRotate * moveFactor); viewMatrix *= Matrix.RotationY(-yRotate * moveFactor); updateText(); } }; // Display instructions with initial values updateText(); #endregion var clock = new System.Diagnostics.Stopwatch(); clock.Start(); #region Render loop // Create and run the render loop RenderLoop.Run(Window, () => { // Start of frame: // Retrieve immediate context var context = DeviceManager.Direct3DContext; // Clear depth stencil view context.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear render target view context.ClearRenderTargetView(RenderTargetView, background); // Create viewProjection matrix var viewProjection = Matrix.Multiply(viewMatrix, projectionMatrix); var boundingFrustum = new BoundingFrustum(viewProjection); // Extract camera position from view var camPosition = Matrix.Transpose(Matrix.Invert(viewMatrix)).Column4; cameraPosition = new Vector3(camPosition.X, camPosition.Y, camPosition.Z); // If Keys.CtrlKey is down, auto rotate viewProjection based on time var time = clock.ElapsedMilliseconds / 1000.0f; var perFrame = new ConstantBuffers.PerFrame(); perFrame.Light.Color = new Color(0.8f, 0.8f, 0.8f, 1.0f); var lightDir = Vector3.Transform(new Vector3(1f, -1f, -1f), worldMatrix); perFrame.Light.Direction = new Vector3(lightDir.X, lightDir.Y, lightDir.Z);// new Vector3(Vector3.Transform(new Vector3(1f, -1f, 1f), worldMatrix * Matrix.RotationAxis(Vector3.UnitY, time)).ToArray().Take(3).ToArray()); perFrame.CameraPosition = cameraPosition; context.UpdateSubresource(ref perFrame, perFrameBuffer); // Render each object var perMaterial = new ConstantBuffers.PerMaterial(); perMaterial.Ambient = new Color4(0.2f); perMaterial.Diffuse = Color.White; perMaterial.Emissive = new Color4(0); perMaterial.Specular = Color.White; perMaterial.SpecularPower = 20f; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); if (showNormals) context.GeometryShader.Set(debugNormals); var perObject = new ConstantBuffers.PerObject(); // MESH // Provide the material constant buffer to the mesh renderer context.VertexShader.Set(vertexShader); context.PixelShader.Set(blinnPhongShader); int drawn = 0; if (gbufferIndex == -2) { // Regular forward rendering meshes.ForEach((m) => { perObject.World = m.World * worldMatrix; var center = Vector3.Transform(m.Mesh.Extent.Center, perObject.World); var offset = new Vector3(center.X, center.Y, center.Z) - m.Mesh.Extent.Center; var cullCheck = boundingFrustum.Contains(new BoundingBox(m.Mesh.Extent.Min + offset, m.Mesh.Extent.Max + offset)); if (cullCheck == ContainmentType.Intersects || cullCheck == ContainmentType.Contains) { perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.ViewProjection = viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); m.EnableNormalMap = enableNormalMap; m.PerMaterialBuffer = perMaterialBuffer; m.PerArmatureBuffer = perArmatureBuffer; m.Render(); drawn++; } }); } else { GBuffer activeGBuffer = gbuffer; LightRenderer activeLightRenderer = lightRenderer; if (keyToggles[Keys.M]) { activeGBuffer = gbufferMS; activeLightRenderer = lightRendererMS; } // Deferred rendering context.VertexShader.Set(fillGBufferVS); context.PixelShader.Set(fillGBufferPS); activeGBuffer.Clear(context, new Color(0, 0, 0, 0)); activeGBuffer.Bind(context); meshes.ForEach((m) => { perObject.World = m.World * worldMatrix; //var center = Vector3.Transform(m.Mesh.Extent.Center, perObject.World); //var offset = new Vector3(center.X, center.Y, center.Z) - m.Mesh.Extent.Center; //var cullCheck = boundingFrustum.Contains(new BoundingBox(m.Mesh.Extent.Min + offset, m.Mesh.Extent.Max + offset)); //if (cullCheck == ContainmentType.Intersects || cullCheck == ContainmentType.Contains) { perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.ViewProjection = viewProjection; perObject.View = viewMatrix; perObject.Projection = projectionMatrix; perObject.InverseView = Matrix.Invert(viewMatrix); perObject.InverseProjection = Matrix.Invert(projectionMatrix); perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); m.EnableNormalMap = enableNormalMap; m.PerMaterialBuffer = perMaterialBuffer; m.PerArmatureBuffer = perArmatureBuffer; m.Render(); drawn++; } }); activeGBuffer.Unbind(context); if (gbufferIndex == -1) { // Light pass sphereRenderer.PerMaterialBuffer = perMaterialBuffer; sphereRenderer.PerArmatureBuffer = perArmatureBuffer; //coneRenderer.PerMaterialBuffer = perMaterialBuffer; //coneRenderer.PerArmatureBuffer = perArmatureBuffer; context.PixelShader.SetConstantBuffer(0, perObjectBuffer); perObject.ViewProjection = viewProjection; perObject.View = viewMatrix; perObject.Projection = projectionMatrix; perObject.InverseView = Matrix.Invert(viewMatrix); perObject.InverseProjection = Matrix.Invert(projectionMatrix); activeLightRenderer.Debug = gbufferIndex; activeLightRenderer.Clear(context); activeLightRenderer.Frustum = new BoundingFrustum(projectionMatrix); activeLightRenderer.PerObject = perObject; activeLightRenderer.PerObjectBuffer = perObjectBuffer; activeLightRenderer.Bind(context); activeLightRenderer.Render(); activeLightRenderer.Unbind(context); context.OutputMerger.SetRenderTargets(this.DepthStencilView, this.RenderTargetView); // Render the light buffer saQuad.Shader = null; // use default shader saQuad.ShaderResources = new[] { activeLightRenderer.SRV }; saQuad.Render(); // reset shader resources saQuad.ShaderResources = null; } else { // Bind the output render targets context.OutputMerger.SetRenderTargets(this.DepthStencilView, this.RenderTargetView); // Render debug shaders saQuad.ShaderResources = activeGBuffer.SRVs.ToArray().Concat(new[] { activeGBuffer.DSSRV }).ToArray(); perObject.World = worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.ViewProjection = viewProjection; perObject.View = viewMatrix; perObject.InverseView = Matrix.Invert(viewMatrix); perObject.Projection = projectionMatrix; perObject.InverseProjection = Matrix.Invert(projectionMatrix); perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); context.PixelShader.SetConstantBuffer(0, perObjectBuffer); if (keyToggles[Keys.M]) saQuad.Shader = DebugGBufferMS[gbufferIndex]; else saQuad.Shader = DebugGBuffer[gbufferIndex]; saQuad.Render(); } } // Render FPS fps.Render(); // Render instructions + position changes textRenderer.Render(); if (keyToggles[Keys.PrintScreen]) { keyToggles[Keys.PrintScreen] = false; //using (var resource = this.RenderTargetView.ResourceAs<Texture2D>()) //using (var bm = CopyTexture.SaveToBitmap(DeviceManager, resource)) //{ // bm.Save("RT0.png"); //} CopyTexture.SaveToFile(DeviceManager, lightRenderer.SRV.ResourceAs<Texture2D>(), "test.dds"); gbuffer.SaveToFiles(); //using (var resource = this.RenderTargetView.ResourceAs<Texture2D>()) //using (var bm0 = CopyTexture.SaveToWICBitmap(DeviceManager, resource)) //using (var bm1 = CopyTexture.SaveToWICBitmap(DeviceManager, gbuffer.RT1)) //using (var bm2 = CopyTexture.SaveToWICBitmap(DeviceManager, gbuffer.RT2)) //using (var bm3 = CopyTexture.SaveToWICBitmap(DeviceManager, gbuffer.DS0)) //using (var bm4 = CopyTexture.SaveToWICBitmap(DeviceManager, this.DepthBuffer)) //{ //CopyTexture.SaveToFile(DeviceManager, gbuffer.RT0, "RT0.dds"); //CopyTexture.SaveToFile(DeviceManager, resource, "test.dds"); //CopyTexture.SaveToFile(DeviceManager, this.DepthBuffer, "DepthBuffer.png", SharpDX.DXGI.Format.R32_Float); //if (bm0 != null) // CopyTexture.SaveBitmap(DeviceManager, bm0, "RT0.png"); //if (bm1 != null) // CopyTexture.SaveBitmap(DeviceManager, bm1, "RT1.png"); //if (bm2 != null) // CopyTexture.SaveBitmap(DeviceManager, bm2, "RT2.png"); //if (bm3 != null) // CopyTexture.SaveBitmap(DeviceManager, bm3, "DS0.png"); //if (bm4 != null) // CopyTexture.SaveBitmap(DeviceManager, bm3, "DepthBuffer.png"); //} } // Present the frame Present(); }); #endregion }
private static void GenerateLanguages() { var languages = new List<LanguageType> { new LanguageType {LangName = "angielski"}, new LanguageType {LangName = "niemiecki"}, new LanguageType {LangName = "rosyjski"}, new LanguageType {LangName = "polski"}, new LanguageType {LangName = "hiszpański"}, }; var langLevels = new List<LanguageLevels> { new LanguageLevels {LevelName = "a1"}, new LanguageLevels {LevelName = "a2"}, new LanguageLevels {LevelName = "b1"}, new LanguageLevels {LevelName = "b2"}, new LanguageLevels {LevelName = "c1"}, new LanguageLevels {LevelName = "c2"} }; //var fullLanguages = new List<Language>//to dodajemy tylko z Person! // { // new Language() {LanguageName = languages.ElementAt(0), Level = langLevels.ElementAt(0)}, // new Language() {LanguageName = languages.ElementAt(1), Level = langLevels.ElementAt(0)}, // new Language() {LanguageName = languages.ElementAt(2), Level = langLevels.ElementAt(1)} // }; languages.ForEach(DALLang.AddLangName); langLevels.ForEach(DALLang.AddLangLevel); //fullLanguages.ForEach(DALLang.AddLanguage); }
public override void Run() { #region Create renderers // Note: the renderers take care of creating their own // device resources and listen for DeviceManager.OnInitialize var particleSystem = ToDispose(new ParticleRenderer()); particleSystem.Initialize(this); var totalParticles = 100000; particleSystem.Constants.DomainBoundsMax = new Vector3(20, 20, 20); particleSystem.Constants.DomainBoundsMin = new Vector3(-20, 0, -20); particleSystem.Constants.ForceDirection = -Vector3.UnitY; particleSystem.Constants.ForceStrength = 1.8f; particleSystem.Constants.Radius = 0.05f; float particleLifetime = 13f; particleSystem.InitializeParticles(totalParticles, particleLifetime); // Create a axis-grid renderer var axisGrid = ToDispose(new AxisGridRenderer()); axisGrid.Initialize(this); // Create and initialize the mesh renderer var loadedMesh = Common.Mesh.LoadFromFile("cartoon_village.cmo"); List<MeshRenderer> meshes = new List<MeshRenderer>(); meshes.AddRange((from mesh in loadedMesh select ToDispose(new MeshRenderer(mesh)))); foreach (var m in meshes) { m.Initialize(this); m.World = Matrix.Identity; } // Set the first animation as the current animation and start clock foreach (var m in meshes) { if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) m.CurrentAnimation = m.Mesh.Animations.First().Value; m.Clock.Start(); } // Create and initialize a Direct2D FPS text renderer var fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); // Create and initialize a general purpose Direct2D text renderer // This will display some instructions and the current view and rotation offsets var textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 40), 12)); textRenderer.Initialize(this); #endregion // Initialize the world matrix var worldMatrix = Matrix.Identity; // Set the camera position slightly behind (z) var cameraPosition = new Vector3(0, 1, 20); var cameraTarget = Vector3.Zero; // Looking at the origin 0,0,0 var cameraUp = Vector3.UnitY; // Y+ is Up // Prepare matrices // Create the view matrix from our camera position, look target and up direction var viewMatrix = Matrix.LookAtRH(cameraPosition, cameraTarget, cameraUp); viewMatrix.TranslationVector += new Vector3(0, -0.98f, 0); // Create the projection matrix /* FoV 60degrees = Pi/3 radians */ // Aspect ratio (based on window size), Near clip, Far clip var projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); // Maintain the correct aspect ratio on resize Window.Resize += (s, e) => { projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); }; bool paused = false; var simTime = new System.Diagnostics.Stopwatch(); simTime.Start(); List<string> particleShaders = new List<string>(); //particleShaders.Add("CS"); particleShaders.Add("Snowfall"); particleShaders.Add("Waves"); particleShaders.Add("Sweeping"); int particleIndx = 0; #region Rotation and window event handlers // Create a rotation vector to keep track of the rotation // around each of the axes var rotation = new Vector3(0.0f, 0.0f, 0.0f); // We will call this action to update text // for the text renderer Action updateText = () => { textRenderer.Text = String.Format("Rotation ({0}) (Up/Down Left/Right Wheel+-)\nView ({1}) (A/D, W/S, Shift+Wheel+-)" //+ "\nPress 1,2,3,4,5,6,7,8 to switch shaders" + "\nTime: {2:0.00} (P to toggle, R to reset scene)" + "\nParticles = {3:#0} (+/- to change)" //+ "\nPress Z to show/hide depth buffer - Press F to toggle wireframe" //+ "\nPress 1-8 to switch shaders" , rotation, viewMatrix.TranslationVector, simTime.Elapsed.TotalSeconds, totalParticles ); }; Dictionary<Keys, bool> keyToggles = new Dictionary<Keys, bool>(); keyToggles[Keys.Z] = false; keyToggles[Keys.F] = false; keyToggles[Keys.I] = true; // Support keyboard/mouse input to rotate or move camera view var moveFactor = 0.02f; // how much to change on each keypress var shiftKey = false; var ctrlKey = false; var background = new Color(30, 30, 34); Vector2 rightMouseClick = new Vector2(0, 0); Window.KeyDown += (s, e) => { var context = DeviceManager.Direct3DContext; shiftKey = e.Shift; ctrlKey = e.Control; switch (e.KeyCode) { // WASD -> pans view case Keys.A: viewMatrix.TranslationVector += new Vector3(moveFactor * 12, 0f, 0f); break; case Keys.D: viewMatrix.TranslationVector -= new Vector3(moveFactor * 12, 0f, 0f); break; case Keys.S: if (shiftKey) viewMatrix.TranslationVector += new Vector3(0f, moveFactor * 12, 0f); else viewMatrix.TranslationVector -= new Vector3(0f, 0f, 1) * moveFactor * 12; break; case Keys.W: if (shiftKey) viewMatrix.TranslationVector -= new Vector3(0f, moveFactor * 12, 0f); else viewMatrix.TranslationVector += new Vector3(0f, 0f, 1) * moveFactor * 12; break; // Up/Down and Left/Right - rotates around X / Y respectively // (Mouse wheel rotates around Z) case Keys.Down: worldMatrix *= Matrix.RotationX(moveFactor); rotation += new Vector3(moveFactor, 0f, 0f); break; case Keys.Up: worldMatrix *= Matrix.RotationX(-moveFactor); rotation -= new Vector3(moveFactor, 0f, 0f); break; case Keys.Left: worldMatrix *= Matrix.RotationY(moveFactor); rotation += new Vector3(0f, moveFactor, 0f); break; case Keys.Right: worldMatrix *= Matrix.RotationY(-moveFactor); rotation -= new Vector3(0f, moveFactor, 0f); break; case Keys.T: fps.Show = !fps.Show; textRenderer.Show = !textRenderer.Show; break; case Keys.B: if (background == Color.White) { background = new Color(30, 30, 34); } else { background = Color.White; } break; case Keys.G: axisGrid.Show = !axisGrid.Show; break; case Keys.P: paused = !paused; if (paused) simTime.Stop(); else simTime.Start(); // Pause or resume mesh animation meshes.ForEach(m => { if (m.Clock.IsRunning) m.Clock.Stop(); else m.Clock.Start(); }); updateText(); break; case Keys.X: // To test for correct resource recreation // Simulate device reset or lost. System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); DeviceManager.Initialize(DeviceManager.Dpi); System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); break; case Keys.Z: keyToggles[Keys.Z] = !keyToggles[Keys.Z]; if (keyToggles[Keys.Z]) { context.PixelShader.Set(depthPixelShader); } else { context.PixelShader.Set(pixelShader); } break; case Keys.F: keyToggles[Keys.F] = !keyToggles[Keys.F]; RasterizerStateDescription rasterDesc; if (context.Rasterizer.State != null) rasterDesc = context.Rasterizer.State.Description; else rasterDesc = new RasterizerStateDescription() { CullMode = CullMode.None, FillMode = FillMode.Solid }; if (keyToggles[Keys.F]) { rasterDesc.FillMode = FillMode.Wireframe; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } else { rasterDesc.FillMode = FillMode.Solid; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } break; case Keys.R: // TODO: reset particles renderer if (simTime.IsRunning) simTime.Restart(); else simTime.Reset(); break; case Keys.D1: context.PixelShader.Set(pixelShader); break; case Keys.D2: context.PixelShader.Set(lambertShader); break; case Keys.D3: context.PixelShader.Set(phongShader); break; case Keys.D4: context.PixelShader.Set(blinnPhongShader); break; case Keys.Add: var increaseParticles = 10000; if (shiftKey) increaseParticles *= 10; totalParticles += increaseParticles; particleSystem.InitializeParticles(totalParticles, particleLifetime); updateText(); break; case Keys.Subtract: var decreaseParticles = 10000; if (shiftKey) decreaseParticles *= 10; totalParticles -= decreaseParticles; totalParticles = Math.Max(totalParticles, 10000); particleSystem.InitializeParticles(totalParticles, particleLifetime); updateText(); break; case Keys.Enter: particleSystem.SwitchTexture(); break; case Keys.Back: if (shiftKey) { particleSystem.UseLightenBlend = !particleSystem.UseLightenBlend; } else { particleIndx++; particleIndx = particleIndx % particleShaders.Count; } break; case Keys.I: keyToggles[Keys.I] = !keyToggles[Keys.I]; break; } updateText(); }; Window.KeyUp += (s, e) => { // Clear the shift/ctrl keys so they aren't sticky if (e.KeyCode == Keys.ShiftKey) shiftKey = false; if (e.KeyCode == Keys.ControlKey) ctrlKey = false; }; Window.MouseWheel += (s, e) => { if (shiftKey) { // Zoom in/out viewMatrix.TranslationVector += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor * 2); } else { // rotate around Z-axis viewMatrix *= Matrix.RotationZ((e.Delta / 120f) * moveFactor); rotation += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor); } updateText(); }; var lastX = 0; var lastY = 0; Window.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { lastX = e.X; lastY = e.Y; } else if (e.Button == MouseButtons.Right) { // Move the mouse cursor coordinates into the -1 to +1 range. float pointX = ((2.0f * (float)e.X) / (float)Window.ClientSize.Width) - 1.0f; float pointY = (((2.0f * (float)e.Y) / (float)Window.ClientSize.Height) - 1.0f) * -1.0f; rightMouseClick = new Vector2(pointX, pointY); var inverseViewProj = Matrix.Invert(Matrix.Multiply(viewMatrix, projectionMatrix)); var far = Vector3.TransformCoordinate(new Vector3(rightMouseClick, 1f), inverseViewProj); var near = Vector3.TransformCoordinate(new Vector3(rightMouseClick, 0f), inverseViewProj); //attractor.Z = 0; particleSystem.Constants.Attractor = Vector3.Normalize(far - near) * 50; particleSystem.UpdateConstants(); } }; Window.MouseMove += (s, e) => { if (e.Button == MouseButtons.Left) { var yRotate = lastX - e.X; var xRotate = lastY - e.Y; lastY = e.Y; lastX = e.X; // Mouse move changes viewMatrix *= Matrix.RotationX(-xRotate * moveFactor); viewMatrix *= Matrix.RotationY(-yRotate * moveFactor); updateText(); } }; // Display instructions with initial values updateText(); #endregion var clock = new System.Diagnostics.Stopwatch(); clock.Start(); long elapsed = 0; long frames = 0; long elapsedShader = 0; float elapsedSinceGenerator = 0; #region Render loop // Create and run the render loop RenderLoop.Run(Window, () => { // Start of frame: // Retrieve immediate context var context = DeviceManager.Direct3DContext; // Clear depth stencil view context.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear render target view context.ClearRenderTargetView(RenderTargetView, background); // Create viewProjection matrix var viewProjection = Matrix.Multiply(viewMatrix, projectionMatrix); // Extract camera position from view var camPosition = Matrix.Transpose(Matrix.Invert(viewMatrix)).Column4; cameraPosition = new Vector3(camPosition.X, camPosition.Y, camPosition.Z); var perFrame = new ConstantBuffers.PerFrame(); perFrame.Light.Color = new Color(1f, 1f, 1f, 1.0f); var lightDir = Vector3.Transform(new Vector3(1f, -1f, -1f), worldMatrix); perFrame.Light.Direction = new Vector3(lightDir.X, lightDir.Y, lightDir.Z);// new Vector3(Vector3.Transform(new Vector3(1f, -1f, 1f), worldMatrix * Matrix.RotationAxis(Vector3.UnitY, time)).ToArray().Take(3).ToArray()); perFrame.CameraPosition = cameraPosition; context.UpdateSubresource(ref perFrame, perFrameBuffer); // Render each object var perMaterial = new ConstantBuffers.PerMaterial(); perMaterial.Ambient = new Color4(0.2f); perMaterial.Diffuse = Color.White; perMaterial.Emissive = new Color4(0); perMaterial.Specular = Color.White; perMaterial.SpecularPower = 20f; perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); var perObject = new ConstantBuffers.PerObject(); // MESH if (particleIndx == 0) { foreach (var m in meshes) { perObject.World = m.World * worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); // Provide the material constant buffer to the mesh renderer m.PerMaterialBuffer = perMaterialBuffer; m.PerArmatureBuffer = perArmatureBuffer; m.Render(); } } // AXIS GRID using (var prevPixelShader = context.PixelShader.Get()) { perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); context.PixelShader.Set(pixelShader); perObject.World = worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); axisGrid.Render(); context.PixelShader.Set(prevPixelShader); } #region Update particle system // 1. Run Compute Shader to update particles if (simTime.IsRunning) { particleSystem.Frame.FrameTime = ((float)simTime.Elapsed.TotalSeconds - particleSystem.Frame.Time); particleSystem.Frame.Time = (float)simTime.Elapsed.TotalSeconds; particleSystem.Update("Generator", particleShaders[particleIndx]); } // 2. Render the particles clock.Restart(); particleSystem.Instanced = keyToggles[Keys.I]; particleSystem.Render(); clock.Stop(); // Keep track of how long the dispatch calls are taking elapsed += particleSystem.LastDispatchTicks; elapsedShader += clock.ElapsedTicks; frames++; // Output core particle render statistics if (frames % 250 == 0) { textRenderer.Text = string.Format("Particle: (CS:{0:F6} ms, Render:{1:F6} ms)\nCompute Shader: {4} (Backspace to cycle)\n{2} (I to toggle)\n{3} (Shift-Backspace to toggle)\nToggle texture <Enter>", (double)elapsed / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, (double)elapsedShader / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, keyToggles[Keys.I] ? "Instanced Vertex Shader" : "Geometry Shader", particleSystem.UseLightenBlend ? "Lighten Blend" : "Darken Blend", particleShaders[particleIndx]); } else if (frames > 250) { frames = 0; elapsed = 0; elapsedShader = 0; } #endregion // Render FPS fps.Render(); // Render instructions + position changes textRenderer.Render(); // Present the frame Present(); }); #endregion }
private void DoUndo() { var historyItem = _historyItems[_offset]; _historyAction = true; var list = new List<DesignerItem>(); switch (historyItem.ActionType) { case ActionType.Edited: foreach (var elementBase in historyItem.ElementsBefore) { var designerItem = DesignerCanvas.UpdateElement(elementBase); if (designerItem != null) list.Add(designerItem); } DesignerCanvas.UpdateZoom(); ServiceFactoryBase.Events.GetEvent<ElementChangedEvent>().Publish(historyItem.ElementsBefore); break; case ActionType.Added: DesignerCanvas.RemoveDesignerItems(historyItem.ElementsAfter); break; case ActionType.Removed: foreach (var elementBase in historyItem.ElementsBefore) { var designerItem = DesignerCanvas.CreateElement(elementBase); list.Add(designerItem); var bufferElement = this.clipboard.Buffer.FirstOrDefault(x => x.UID == elementBase.UID); if (bufferElement != null) this.clipboard.Buffer.Remove(bufferElement); } ServiceFactoryBase.Events.GetEvent<ElementAddedEvent>().Publish(historyItem.ElementsBefore); break; } DesignerCanvas.DeselectAll(); list.ForEach(item => item.IsSelected = true); DesignerCanvas.Refresh(); _historyAction = false; DesignerCanvas.Toolbox.SetDefault(); }
public override void Run() { #region Create renderers // Note: the renderers take care of creating their own // device resources and listen for DeviceManager.OnInitialize #region Initialize MeshRenderer instances // Create and initialize the mesh renderer var loadedMesh = Common.Mesh.LoadFromFile("Scene.cmo"); List<MeshRenderer> meshes = new List<MeshRenderer>(); meshes.AddRange((from mesh in loadedMesh select ToDispose(new MeshRenderer(mesh)))); // We will support a cubemap for each mesh that contains "reflector" in its name List<DynamicCubeMap> envMaps = new List<DynamicCubeMap>(); // We will rotate any meshes that contains "rotate" in its name List<MeshRenderer> rotateMeshes = new List<MeshRenderer>(); // We will generate meshRows * meshColumns of any mesh that contains "replicate" in its name int meshRows = 10; int meshColumns = 10; // Define an action to initialize our meshes so that we can // dynamically change the number of reflective surfaces and // replicated meshes Action createMeshes = () => { // Clear context states, ensures we don't have // any of the resources we are going to release // assigned to the pipeline. DeviceManager.Direct3DContext.ClearState(); if (contextList != null) { foreach (var context in contextList) context.ClearState(); } // Remove meshes foreach (var mesh in meshes) mesh.Dispose(); meshes.Clear(); // Remove environment maps foreach (var envMap in envMaps) envMap.Dispose(); envMaps.Clear(); // Create non-replicated MeshRenderer instances meshes.AddRange(from mesh in loadedMesh where !((mesh.Name ?? "").ToLower().Contains("replicate")) select ToDispose(new MeshRenderer(mesh))); #region Create replicated meshes // Add the same mesh multiple times, separate by the combined extent var replicatedMeshes = (from mesh in loadedMesh where (mesh.Name ?? "").ToLower().Contains("replicate") select mesh).ToArray(); if (replicatedMeshes.Length > 0) { var minExtent = (from mesh in replicatedMeshes orderby new { mesh.Extent.Min.X, mesh.Extent.Min.Z } select mesh.Extent).First(); var maxExtent = (from mesh in replicatedMeshes orderby new { mesh.Extent.Max.X, mesh.Extent.Max.Z } descending select mesh.Extent).First(); var extentDiff = (maxExtent.Max - minExtent.Min); for (int x = -(meshColumns / 2); x < (meshColumns / 2); x++) { for (int z = -(meshRows / 2); z < (meshRows / 2); z++) { var meshGroup = (from mesh in replicatedMeshes where (mesh.Name ?? "").ToLower().Contains("replicate") select ToDispose(new MeshRenderer(mesh))).ToList(); // Reposition based on width/depth of combined extent foreach (var m in meshGroup) { m.World.TranslationVector = new Vector3(m.Mesh.Extent.Center.X + extentDiff.X * x, m.Mesh.Extent.Min.Y, m.Mesh.Extent.Center.Z + extentDiff.Z * z); } meshes.AddRange(meshGroup); } } } #endregion #region Create reflective meshes // Create reflections where necessary and add rotation meshes int reflectorCount = 0; meshes.ForEach(m => { var name = (m.Mesh.Name ?? "").ToLower(); if (name.Contains("reflector") && reflectorCount < maxReflectors) { reflectorCount++; var envMap = ToDispose(new DynamicCubeMap(512)); envMap.Reflector = m; envMap.Initialize(this); m.EnvironmentMap = envMap; envMaps.Add(envMap); } if (name.Contains("rotate")) { rotateMeshes.Add(m); } m.Initialize(this); }); #endregion // Initialize each mesh meshes.ForEach(m => m.Initialize(this)); }; createMeshes(); // Set the first animation as the current animation and start clock meshes.ForEach(m => { if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) m.CurrentAnimation = m.Mesh.Animations.First().Value; m.Clock.Start(); }); // Create the overall mesh World matrix var meshWorld = Matrix.Identity; #endregion // Create an axis-grid renderer var axisGrid = ToDispose(new AxisGridRenderer()); axisGrid.Initialize(this); // Create and initialize a Direct2D FPS text renderer var fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); // Create and initialize a general purpose Direct2D text renderer // This will display some instructions and the current view and rotation offsets var textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 40), 12)); textRenderer.Initialize(this); #endregion // Initialize the world matrix var worldMatrix = Matrix.Identity; // Set the camera position var cameraPosition = new Vector3(0, 1, 2); var cameraTarget = Vector3.Zero; // Looking at the origin 0,0,0 var cameraUp = Vector3.UnitY; // Y+ is Up // Prepare matrices // Create the view matrix from our camera position, look target and up direction var viewMatrix = Matrix.LookAtRH(cameraPosition, cameraTarget, cameraUp); viewMatrix.TranslationVector += new Vector3(0, -0.98f, 0); // Create the projection matrix /* FoV 60degrees = Pi/3 radians */ // Aspect ratio (based on window size), Near clip, Far clip var projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); // Maintain the correct aspect ratio on resize Window.Resize += (s, e) => { projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); }; #region Rotation and window event handlers // Create a rotation vector to keep track of the rotation // around each of the axes var rotation = new Vector3(0.0f, 0.0f, 0.0f); // We will call this action to update text // for the text renderer Action updateText = () => { textRenderer.Text = String.Format( "\nPause rotation: P" + "\nThreads: {0} (+/-)" + "\nReflectors: {1} (Shift-Up/Down)" + "\nCPU load: {2} matrix ops (Shift +/-)" + "\nRotating meshes: {3} (Up/Down, Left/Right)" + "\n(G) Build in GS (single pass): {4}" , threadCount, maxReflectors, additionalCPULoad, meshRows * meshColumns, buildCubeMapGeometryInstancing); }; Dictionary<Keys, bool> keyToggles = new Dictionary<Keys, bool>(); keyToggles[Keys.Z] = false; keyToggles[Keys.F] = false; // Support keyboard/mouse input to rotate or move camera view var moveFactor = 0.02f; // how much to change on each keypress var shiftKey = false; var ctrlKey = false; var background = Color.White; Window.KeyDown += (s, e) => { var context = DeviceManager.Direct3DContext; shiftKey = e.Shift; ctrlKey = e.Control; switch (e.KeyCode) { // WASD -> pans view case Keys.A: viewMatrix.TranslationVector += new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.D: viewMatrix.TranslationVector -= new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.S: if (shiftKey) viewMatrix.TranslationVector += new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector -= new Vector3(0f, 0f, 1) * moveFactor * 2; break; case Keys.W: if (shiftKey) viewMatrix.TranslationVector -= new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector += new Vector3(0f, 0f, 1) * moveFactor * 2; break; // Up/Down and Left/Right - rotates around X / Y respectively // (Mouse wheel rotates around Z) //case Keys.Down: // worldMatrix *= Matrix.RotationX(moveFactor); // rotation += new Vector3(moveFactor, 0f, 0f); // break; //case Keys.Up: // worldMatrix *= Matrix.RotationX(-moveFactor); // rotation -= new Vector3(moveFactor, 0f, 0f); // break; //case Keys.Left: // worldMatrix *= Matrix.RotationY(moveFactor); // rotation += new Vector3(0f, moveFactor, 0f); // break; //case Keys.Right: // worldMatrix *= Matrix.RotationY(-moveFactor); // rotation -= new Vector3(0f, moveFactor, 0f); // break; case Keys.T: fps.Show = !fps.Show; textRenderer.Show = !textRenderer.Show; break; case Keys.B: if (background == Color.White) { background = new Color(30, 30, 34); } else { background = Color.White; } break; case Keys.G: axisGrid.Show = !axisGrid.Show; break; case Keys.P: // Pause or resume mesh animation meshes.ForEach(m => { if (m.Clock.IsRunning) m.Clock.Stop(); else m.Clock.Start(); }); break; case Keys.X: // To test for correct resource recreation // Simulate device reset or lost. System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); DeviceManager.Initialize(DeviceManager.Dpi); System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); break; //case Keys.Z: // keyToggles[Keys.Z] = !keyToggles[Keys.Z]; // if (keyToggles[Keys.Z]) // { // context.PixelShader.Set(depthPixelShader); // } // else // { // context.PixelShader.Set(pixelShader); // } // break; case Keys.F: keyToggles[Keys.F] = !keyToggles[Keys.F]; RasterizerStateDescription rasterDesc; if (context.Rasterizer.State != null) rasterDesc = context.Rasterizer.State.Description; else rasterDesc = new RasterizerStateDescription() { CullMode = CullMode.Back, FillMode = FillMode.Solid }; if (keyToggles[Keys.F]) { rasterDesc.FillMode = FillMode.Wireframe; rasterizerState = ToDispose(new RasterizerState(context.Device, rasterDesc)); } else { rasterDesc.FillMode = FillMode.Solid; rasterizerState = ToDispose(new RasterizerState(context.Device, rasterDesc)); } break; //case Keys.D1: // context.PixelShader.Set(pixelShader); // break; //case Keys.D2: // context.PixelShader.Set(lambertShader); // break; //case Keys.D3: // context.PixelShader.Set(phongShader); // break; //case Keys.D4: // context.PixelShader.Set(blinnPhongShader); // break; //case Keys.D5: // context.PixelShader.Set(simpleUVShader); // break; //case Keys.D6: // context.PixelShader.Set(lambertUVShader); // break; //case Keys.D7: // context.PixelShader.Set(phongUVShader); // break; //case Keys.D8: // context.PixelShader.Set(blinnPhongUVShader); // break; } updateText(); }; Window.KeyUp += (s, e) => { // Clear the shift/ctrl keys so they aren't sticky if (e.KeyCode == Keys.ShiftKey) shiftKey = false; if (e.KeyCode == Keys.ControlKey) ctrlKey = false; }; Window.MouseWheel += (s, e) => { if (shiftKey) { // Zoom in/out viewMatrix.TranslationVector += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor * 2); } else { // rotate around Z-axis viewMatrix *= Matrix.RotationZ((e.Delta / 120f) * moveFactor); rotation += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor); } updateText(); }; var lastX = 0; var lastY = 0; Window.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { lastX = e.X; lastY = e.Y; } }; Window.MouseMove += (s, e) => { if (e.Button == MouseButtons.Left) { var yRotate = lastX - e.X; var xRotate = lastY - e.Y; lastY = e.Y; lastX = e.X; // Mouse move changes viewMatrix *= Matrix.RotationX(-xRotate * moveFactor); viewMatrix *= Matrix.RotationY(-yRotate * moveFactor); updateText(); } }; // Display instructions with initial values updateText(); #endregion var clock = new System.Diagnostics.Stopwatch(); clock.Start(); // Setup the deferred contexts SetupContextList(); #region Render loop // Whether or not to reinitialize meshes bool initializeMesh = false; // Define additional key handlers for controlling the // number of threads, reflectors, and replicated meshes #region Dynamic Cube map and threading KeyDown handlers Window.KeyDown += (s, e) => { switch (e.KeyCode) { case Keys.Up: if (shiftKey) { maxReflectors++; } else { meshRows += 2; } initializeMesh = true; break; case Keys.Down: if (shiftKey) { maxReflectors = Math.Max(0, maxReflectors-1); } else { meshRows = Math.Max(2, meshRows - 2); } initializeMesh = true; break; case Keys.Right: meshColumns += 2; initializeMesh = true; break; case Keys.Left: meshColumns = Math.Max(2, meshColumns - 2); initializeMesh = true; break; case Keys.Add: if (shiftKey) { additionalCPULoad += 100; } else { threadCount++; } break; case Keys.Subtract: if (shiftKey) { additionalCPULoad = Math.Max(0, additionalCPULoad - 100); } else { threadCount = Math.Max(1, threadCount - 1); } break; case Keys.G: buildCubeMapGeometryInstancing = !buildCubeMapGeometryInstancing; break; default: break; } updateText(); }; #endregion #region Render mesh group // Action for rendering a group of meshes for a // context (based on number of available contexts) Action<int, DeviceContext, Matrix, Matrix> renderMeshGroup = (contextIndex, renderContext, view, projection) => { var viewProjection = view * projection; // Determine the meshes to render for this context int batchSize = (int)Math.Floor((double)meshes.Count / contextList.Length); int startIndex = batchSize * contextIndex; int endIndex = Math.Min(startIndex + batchSize, meshes.Count - 1); // If this is the last context include whatever remains to be // rendered due to the rounding above. if (contextIndex == contextList.Length - 1) endIndex = meshes.Count - 1; // Loop over the meshes for this context and render them var perObject = new ConstantBuffers.PerObject(); for (var i = startIndex; i <= endIndex; i++) { // Simulate additional CPU load for (var j = 0; j < additionalCPULoad; j++) { viewProjection = Matrix.Multiply(view, projection); } // Retrieve current mesh var m = meshes[i]; // Check if this is a rotating mesh if (rotateMeshes.Contains(m)) { var rotate = Matrix.RotationAxis(Vector3.UnitY, m.Clock.ElapsedMilliseconds / 1000.0f); perObject.World = m.World * rotate * worldMatrix; } else { perObject.World = m.World * worldMatrix; } // Update perObject constant buffer perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.Transpose(); renderContext.UpdateSubresource(ref perObject, perObjectBuffer); // Provide the material and armature constant buffer to the mesh renderer m.PerArmatureBuffer = perArmatureBuffer; m.PerMaterialBuffer = perMaterialBuffer; // Render the mesh using the provided DeviceContext m.Render(renderContext); } }; #endregion #region Render scene // Action for rendering the entire scene Action<DeviceContext, Matrix, Matrix, RenderTargetView, DepthStencilView, DynamicCubeMap> renderScene = (context, view, projection, rtv, dsv, envMap) => { // We must initialize the context every time we render // the scene as we are changing the state depending on // whether we are rendering the envmaps or final scene InitializeContext(context, false); // We always need the immediate context // Note: the passed in context will normally be the immediate context // however it is possible to run this method threaded also. var immediateContext = this.DeviceManager.Direct3DDevice.ImmediateContext; // Clear depth stencil view context.ClearDepthStencilView(dsv, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear render target view context.ClearRenderTargetView(rtv, background); // Create viewProjection matrix var viewProjection = Matrix.Multiply(view, projection); // Extract camera position from view var camPosition = Matrix.Transpose(Matrix.Invert(view)).Column4; cameraPosition = new Vector3(camPosition.X, camPosition.Y, camPosition.Z); // Setup the per frame constant buffer var perFrame = new ConstantBuffers.PerFrame(); perFrame.Light.Color = new Color(0.9f, 0.9f, 0.9f, 1.0f); var lightDir = Vector3.Transform(new Vector3(-1f, -1f, -1f), worldMatrix); perFrame.Light.Direction = new Vector3(lightDir.X, lightDir.Y, lightDir.Z); perFrame.CameraPosition = cameraPosition; context.UpdateSubresource(ref perFrame, perFrameBuffer); // Render each object // Prepare the default per material constant buffer var perMaterial = new ConstantBuffers.PerMaterial(); perMaterial.Ambient = new Color4(0.2f); perMaterial.Diffuse = Color.White; perMaterial.Emissive = new Color4(0); perMaterial.Specular = Color.White; perMaterial.SpecularPower = 20f; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); // ----------Render meshes------------ if (contextList.Length == 1) { // If there is only one context available there is no need to // generate command lists and execute them so just render the // mesh directly on the current context (which may or may // not be an immediate context depending on the caller). renderMeshGroup(0, context, view, projection); } else { // There are multiple contexts therefore // we are using deferred contexts. Prepare a // separate thread for each available context // and render a group of meshes on each. Task[] renderTasks = new Task[contextList.Length]; CommandList[] commands = new CommandList[contextList.Length]; var viewports = context.Rasterizer.GetViewports(); for (var i = 0; i < contextList.Length; i++) { // Must store the iteration value in another variable // or each task action will use the last iteration value. var contextIndex = i; // Create task to run on new thread from ThreadPool renderTasks[i] = Task.Run(() => { // Retrieve context for this thread var renderContext = contextList[contextIndex]; // Initialize the context state InitializeContext(renderContext, false); // Set the render targets and viewport renderContext.OutputMerger.SetRenderTargets(dsv, rtv); renderContext.Rasterizer.SetViewports(viewports); // If we are rendering for a cubemap we must set the // per environment map buffer. if (envMap != null) renderContext.GeometryShader.SetConstantBuffer(4, envMap.PerEnvMapBuffer); // Render logic renderMeshGroup(contextIndex, renderContext, view, projection); // Create the command list if (renderContext.TypeInfo == DeviceContextType.Deferred) commands[contextIndex] = renderContext.FinishCommandList(false); }); } // Wait for all the tasks to complete Task.WaitAll(renderTasks); // Replay the command lists on the immediate context for (var i = 0; i < contextList.Length; i++) { if (contextList[i].TypeInfo == DeviceContextType.Deferred && commands[i] != null) { immediateContext.ExecuteCommandList(commands[i], false); // Clean up command list commands[i].Dispose(); commands[i] = null; } } } }; #endregion long frameCount = 0; int lastThreadCount = threadCount; // Create and run the render loop RenderLoop.Run(Window, () => { // Allow dynamic changes to number of reflectors and replications if (initializeMesh) { initializeMesh = false; createMeshes(); } // Allow dynamic chnages to the number of threads to use if (lastThreadCount != threadCount) { SetupContextList(); lastThreadCount = threadCount; } // Start of frame: frameCount++; // Retrieve immediate context var context = DeviceManager.Direct3DContext; //if (frameCount % 3 == 1) // to update cubemap once every third frame //{ #region Update environment maps // Update each of the cubemaps if (buildCubeMapGeometryInstancing) { activeVertexShader = envMapVSShader; activeGeometryShader = envMapGSShader; activePixelShader = envMapPSShader; } else { activeVertexShader = vertexShader; activeGeometryShader = null; activePixelShader = blinnPhongShader; } // Render the scene from the perspective of each of the environment maps foreach (var envMap in envMaps) { var mesh = envMap.Reflector as MeshRenderer; if (mesh != null) { // Calculate view point for reflector var meshCenter = Vector3.Transform(mesh.Mesh.Extent.Center, mesh.World * worldMatrix); envMap.SetViewPoint(new Vector3(meshCenter.X, meshCenter.Y, meshCenter.Z)); if (buildCubeMapGeometryInstancing) { // Render cubemap in single full render pass using // geometry shader instancing. envMap.UpdateSinglePass(context, renderScene); } else { // Render cubemap in 6 full render passes envMap.Update(context, renderScene); } } } #endregion //} #region Render final scene // Reset the vertex, geometry and pixel shader activeVertexShader = vertexShader; activeGeometryShader = null; activePixelShader = blinnPhongShader; // Initialize context (also resetting the render targets) InitializeContext(context, true); // Render the final scene renderScene(context, viewMatrix, projectionMatrix, RenderTargetView, DepthStencilView, null); #endregion // Render FPS fps.Render(); // Render instructions + position changes textRenderer.Render(); // Present the frame Present(); }); #endregion }
void OnRemoveElements(List<ElementBase> elements) { elements.ForEach(x => this.clipboard.Buffer.Remove(x)); }
public void RemoveDesignerItems(List<ElementBase> elements) { elements.ForEach(x => RemoveDesignerItem(x)); ServiceFactoryBase.Events.GetEvent<ElementRemovedEvent>().Publish(elements); }
public override void Run() { #region Create renderers // Note: the renderers take care of creating their own // device resources and listen for DeviceManager.OnInitialize // Create a axis-grid renderer var axisGrid = ToDispose(new AxisGridRenderer()); axisGrid.Initialize(this); //// Create and initialize the mesh renderer //var loadedMesh = Common.Mesh.LoadFromFile("frog.cmo"); var loadedMesh = Common.Mesh.LoadFromFile("Character.cmo"); loadedMesh.AddRange(Common.Mesh.LoadFromFile("frog.cmo")); List<TessellatedMeshRenderer> meshes = new List<TessellatedMeshRenderer>(); meshes.AddRange((from mesh in loadedMesh select ToDispose(new TessellatedMeshRenderer(mesh)))); foreach (var m in meshes) { m.Initialize(this); m.World = Matrix.Identity; } // Set the first animation as the current animation and start clock foreach (var m in meshes) { if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) m.CurrentAnimation = m.Mesh.Animations.First().Value; m.Clock.Start(); } var triangle = new TriangleRenderer(); triangle.Initialize(this); // Create and initialize a Direct2D FPS text renderer var fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); // Create and initialize a general purpose Direct2D text renderer // This will display some instructions and the current view and rotation offsets var textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 40), 12)); textRenderer.Initialize(this); #endregion // Initialize the world matrix var worldMatrix = Matrix.Identity; // Set the camera position var cameraPosition = new Vector3(0, 0, 2); var cameraTarget = Vector3.Zero; // Looking at the origin 0,0,0 var cameraUp = Vector3.UnitY; // Y+ is Up // Prepare matrices // Create the view matrix from our camera position, look target and up direction var viewMatrix = Matrix.LookAtRH(cameraPosition, cameraTarget, cameraUp); viewMatrix.TranslationVector += new Vector3(0, -0.98f, 0); // Create the projection matrix /* FoV 60degrees = Pi/3 radians */ // Aspect ratio (based on window size), Near clip, Far clip var projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); // Maintain the correct aspect ratio on resize Window.Resize += (s, e) => { projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.1f, 100f); }; #region Rotation and window event handlers // Create a rotation vector to keep track of the rotation // around each of the axes var rotation = new Vector3(0.0f, 0.0f, 0.0f); var tessellationFactor = 1f; var tessellationPartition = "Integer"; var tessellationMethod = "Phong"; // We will call this action to update text // for the text renderer Action updateText = () => { textRenderer.Text = String.Format("Tessellation Factor: {0:#0.0} (+/- to change)" + "\nPartitioning: {1} (F1,F2,F3,F4 to change)" + "\nTessellation: {2} (F5,F6,F7)" + "\nPress F to toggle wireframe | N show normals" + "\nPress 1,2,3,4,5,6,7,8 to switch shaders", tessellationFactor, tessellationPartition, tessellationMethod, DeviceManager.Direct3DDevice.NativePointer); }; Dictionary<Keys, bool> keyToggles = new Dictionary<Keys, bool>(); keyToggles[Keys.Z] = false; keyToggles[Keys.F] = false; // Support keyboard/mouse input to rotate or move camera view var moveFactor = 0.02f; // how much to change on each keypress var shiftKey = false; var ctrlKey = false; var background = Color.White; var activeTriTessellator = tessellateTriIntegerShader; var activePnTriTessellator = pnTriIntegerShader; var usePhongTessellation = true; var usePNTessellation = false; var showNormals = false; var meshIndex = 0; Window.KeyDown += (s, e) => { var context = DeviceManager.Direct3DContext; shiftKey = e.Shift; ctrlKey = e.Control; switch (e.KeyCode) { // WASD -> pans view case Keys.A: viewMatrix.TranslationVector += new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.D: viewMatrix.TranslationVector -= new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.S: if (shiftKey) viewMatrix.TranslationVector += new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector -= new Vector3(0f, 0f, 1) * moveFactor * 2; break; case Keys.W: if (shiftKey) viewMatrix.TranslationVector -= new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector += new Vector3(0f, 0f, 1) * moveFactor * 2; break; // Up/Down and Left/Right - rotates around X / Y respectively // (Mouse wheel rotates around Z) case Keys.Down: worldMatrix *= Matrix.RotationX(moveFactor); rotation += new Vector3(moveFactor, 0f, 0f); break; case Keys.Up: worldMatrix *= Matrix.RotationX(-moveFactor); rotation -= new Vector3(moveFactor, 0f, 0f); break; case Keys.Left: worldMatrix *= Matrix.RotationY(moveFactor); rotation += new Vector3(0f, moveFactor, 0f); break; case Keys.Right: worldMatrix *= Matrix.RotationY(-moveFactor); rotation -= new Vector3(0f, moveFactor, 0f); break; case Keys.T: fps.Show = !fps.Show; textRenderer.Show = !textRenderer.Show; break; case Keys.B: if (background == Color.White) { background = new Color(30, 30, 34); } else { background = Color.White; } break; case Keys.G: axisGrid.Show = !axisGrid.Show; break; case Keys.P: // Pause or resume mesh animation meshes.ForEach(m => { if (m.Clock.IsRunning) m.Clock.Stop(); else m.Clock.Start(); }); break; case Keys.X: // To test for correct resource recreation // Simulate device reset or lost. System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); DeviceManager.Initialize(DeviceManager.Dpi); System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); break; case Keys.Z: keyToggles[Keys.Z] = !keyToggles[Keys.Z]; if (keyToggles[Keys.Z]) { context.PixelShader.Set(depthPixelShader); } else { context.PixelShader.Set(pixelShader); } break; case Keys.F: keyToggles[Keys.F] = !keyToggles[Keys.F]; RasterizerStateDescription rasterDesc; if (context.Rasterizer.State != null) rasterDesc = context.Rasterizer.State.Description; else rasterDesc = new RasterizerStateDescription() { CullMode = CullMode.None, FillMode = FillMode.Solid }; if (keyToggles[Keys.F]) { rasterDesc.FillMode = FillMode.Wireframe; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } else { rasterDesc.FillMode = FillMode.Solid; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } break; case Keys.N: showNormals = !showNormals; break; case Keys.D1: context.PixelShader.Set(pixelShader); break; case Keys.D2: context.PixelShader.Set(lambertShader); break; case Keys.D3: context.PixelShader.Set(phongShader); break; case Keys.D4: context.PixelShader.Set(blinnPhongShader); break; case Keys.Add: var multiple = 1.0f; if (ctrlKey) multiple = 3.0f; tessellationFactor += 0.2f * multiple; tessellationFactor = Math.Min(tessellationFactor, 64); break; case Keys.Subtract: multiple = 1.0f; if (ctrlKey) multiple = 3.0f; tessellationFactor -= 0.2f * multiple; tessellationFactor = Math.Max(tessellationFactor, 0); break; case Keys.F1: tessellationPartition = "Integer"; activeTriTessellator = tessellateTriIntegerShader; activePnTriTessellator = pnTriIntegerShader; break; case Keys.F2: tessellationPartition = "Pow2"; activeTriTessellator = tessellateTriPow2Shader; activePnTriTessellator = pnTriPow2Shader; break; case Keys.F3: tessellationPartition = "Fractional Even"; activeTriTessellator = tessellateTriFractionalEvenShader; activePnTriTessellator = pnTriFractionalEvenShader; break; case Keys.F4: tessellationPartition = "Fractional Odd"; activeTriTessellator = tessellateTriFractionalOddShader; activePnTriTessellator = pnTriFractionalOddShader; break; case Keys.F5: usePhongTessellation = false; usePNTessellation = false; tessellationMethod = "Tri"; break; case Keys.F6: usePhongTessellation = true; usePNTessellation = false; tessellationMethod = "Phong"; break; case Keys.F7: usePhongTessellation = false; usePNTessellation = true; tessellationMethod = "PN-Triangle"; break; case Keys.Back: meshIndex = (meshIndex + 1) % meshes.Count; break; } updateText(); }; Window.KeyUp += (s, e) => { // Clear the shift/ctrl keys so they aren't sticky if (e.KeyCode == Keys.ShiftKey) shiftKey = false; if (e.KeyCode == Keys.ControlKey) ctrlKey = false; }; Window.MouseWheel += (s, e) => { if (shiftKey) { // Zoom in/out viewMatrix.TranslationVector += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor * 2); } else { // rotate around Z-axis viewMatrix *= Matrix.RotationZ((e.Delta / 120f) * moveFactor); rotation += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor); } updateText(); }; var lastX = 0; var lastY = 0; Window.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { lastX = e.X; lastY = e.Y; } }; Window.MouseMove += (s, e) => { if (e.Button == MouseButtons.Left) { var yRotate = lastX - e.X; var xRotate = lastY - e.Y; lastY = e.Y; lastX = e.X; // Mouse move changes viewMatrix *= Matrix.RotationX(-xRotate * moveFactor); viewMatrix *= Matrix.RotationY(-yRotate * moveFactor); updateText(); } }; // Display instructions with initial values updateText(); #endregion var clock = new System.Diagnostics.Stopwatch(); clock.Start(); #region Render loop // Create and run the render loop RenderLoop.Run(Window, () => { // Start of frame: // Retrieve immediate context var context = DeviceManager.Direct3DContext; // Clear depth stencil view context.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear render target view context.ClearRenderTargetView(RenderTargetView, background); // Create viewProjection matrix var viewProjection = Matrix.Multiply(viewMatrix, projectionMatrix); // Extract camera position from view var camPosition = Matrix.Transpose(Matrix.Invert(viewMatrix)).Column4; cameraPosition = new Vector3(camPosition.X, camPosition.Y, camPosition.Z); // If Keys.CtrlKey is down, auto rotate viewProjection based on time var time = clock.ElapsedMilliseconds / 1000.0f; var perFrame = new ConstantBuffers.PerFrame(); perFrame.Light.Color = new Color(0.8f, 0.8f, 0.8f, 1.0f); var lightDir = Vector3.Transform(new Vector3(1f, -1f, -1f), worldMatrix); perFrame.Light.Direction = new Vector3(lightDir.X, lightDir.Y, lightDir.Z);// new Vector3(Vector3.Transform(new Vector3(1f, -1f, 1f), worldMatrix * worldRotation).ToArray().Take(3).ToArray()); perFrame.CameraPosition = cameraPosition; perFrame.TessellationFactor = tessellationFactor; context.UpdateSubresource(ref perFrame, perFrameBuffer); // Render each object var perMaterial = new ConstantBuffers.PerMaterial(); perMaterial.Ambient = new Color4(0.2f); perMaterial.Diffuse = Color.White; perMaterial.Emissive = new Color4(0); perMaterial.Specular = Color.White; perMaterial.SpecularPower = 20f; perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); var perObject = new ConstantBuffers.PerObject(); // MESH context.VertexShader.Set(tessellateVertexShader); context.HullShader.Set(activeTriTessellator); if (usePhongTessellation) { context.DomainShader.Set(tessellatePhongDomainShader); } else if (usePNTessellation) { context.HullShader.Set(activePnTriTessellator); context.DomainShader.Set(pnTriDomainShader); } else context.DomainShader.Set(tessellateTriDomainShader); var m = meshes[meshIndex]; //meshes.ForEach((m) => //{ // Provide the material constant buffer to the mesh renderer perObject.World = m.World * worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.ViewProjection = viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); m.PerMaterialBuffer = perMaterialBuffer; m.PerArmatureBuffer = perArmatureBuffer; m.Render(); if (showNormals) { using (var prevPixelShader = context.PixelShader.Get()) { perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); context.PixelShader.Set(pixelShader); context.GeometryShader.Set(debugNormals); m.Render(); context.PixelShader.Set(prevPixelShader); context.GeometryShader.Set(null); } } //}); // TRIANGLE //triangle.Render(); //// QUAD //context.VertexShader.Set(tessellateVertexShader); //context.HullShader.Set(activeQuadTessellator); //context.DomainShader.Set(tessellateQuadDomainShader); //quad.Render(); // BEZIER //context.VertexShader.Set(tessellateVertexShader); //context.HullShader.Set(activeBezierTessellator); //context.DomainShader.Set(tessellateBezierDomainShader); //bezier.Render(); // AXIS GRID context.VertexShader.Set(vertexShader); context.HullShader.Set(null); context.DomainShader.Set(null); context.GeometryShader.Set(null); using (var prevPixelShader = context.PixelShader.Get()) { perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); context.PixelShader.Set(pixelShader); perObject = new ConstantBuffers.PerObject(); perObject.World = worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.ViewProjection = viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); axisGrid.Render(); context.PixelShader.Set(prevPixelShader); } // Render FPS fps.Render(); // Render instructions + position changes textRenderer.Render(); // Present the frame Present(); }); #endregion }
static void SimulateMultipleClients(int clientCount) { var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050); var sockets = new List<Socket>(); for (int i = 0; i < clientCount; i++) { Console.WriteLine("Connecting client..."); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(endpoint); sockets.Add(socket); } Thread.Sleep(10000); sockets.ForEach(socket => { socket.Shutdown(SocketShutdown.Both); socket.Close(); }); }
public static string GetRouterTable() { // The number of bytes needed. int bytesNeeded = 0; // The result from the API call. int result = GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false); // Call the function, expecting an insufficient buffer. if (result != ErrorInsufficientBuffer) { // Throw an exception. throw new Win32Exception(result); } // Allocate the memory, do it in a try/finally block, to ensure // that it is released. IntPtr buffer = IntPtr.Zero; // Try/finally. try { // Allocate the memory. buffer = Marshal.AllocCoTaskMem(bytesNeeded); // Make the call again. If it did not succeed, then // raise an error. result = GetIpNetTable(buffer, ref bytesNeeded, false); // If the result is not 0 (no error), then throw an exception. if (result != 0) { // Throw an exception. throw new Win32Exception(result); } // Now we have the buffer, we have to marshal it. We can read // the first 4 bytes to get the length of the buffer. int entries = Marshal.ReadInt32(buffer); // Increment the memory pointer by the size of the int. IntPtr currentBuffer = new IntPtr(buffer.ToInt64() + Marshal.SizeOf(typeof(int))); // Allocate an array of entries. MibIpnetrow[] table = new MibIpnetrow[entries]; // Cycle through the entries. for (int index = 0; index < entries; index++) { // Call PtrToStructure, getting the structure information. table[index] = (MibIpnetrow)Marshal.PtrToStructure(new IntPtr(currentBuffer.ToInt64() + (index * Marshal.SizeOf(typeof(MibIpnetrow)))), typeof(MibIpnetrow)); } List<string> strtable = new List<string>(); for (int index = 0; index < entries; index++) { MibIpnetrow row = table[index]; IPAddress ip = new IPAddress(BitConverter.GetBytes(row.dwAddr)); StringBuilder sbMac = new StringBuilder(); sbMac.Append(row.mac0.ToString("X2") + '-'); sbMac.Append(row.mac1.ToString("X2") + '-'); sbMac.Append(row.mac2.ToString("X2") + '-'); sbMac.Append(row.mac3.ToString("X2") + '-'); sbMac.Append(row.mac4.ToString("X2") + '-'); sbMac.AppendLine(row.mac5.ToString("X2")); strtable.Add(string.Format("IP: {0}\t\t\tMac: {1}", ip, sbMac)); } string str = ""; strtable.Sort(); strtable.ForEach(m => str += m); return str; } finally { // Release the memory. FreeMibTable(buffer); } }
public override void Run() { #region Create renderers // Note: the renderers take care of creating their own // device resources and listen for DeviceManager.OnInitialize List<string[]> ipShaders = new List<string[]>(); ipShaders.Add(new[] { "DesaturateCS" }); ipShaders.Add(new[] { "SaturateCS" }); ipShaders.Add(new[] { "NegativeCS" }); ipShaders.Add(new[] { "ContrastCS" }); ipShaders.Add(new[] { "BrightnessCS" }); ipShaders.Add(new[] { "SepiaCS" }); ipShaders.Add(new[] { "BoxFilter3TapHorizontalCS", "BoxFilter3TapVerticalCS" }); ipShaders.Add(new[] { "BoxFilter5TapHorizontalCS", "BoxFilter5TapVerticalCS" }); ipShaders.Add(new[] { "BlurFilterHorizontalCS", "BlurFilterVerticalCS" }); ipShaders.Add(new[] { "SobelEdgeCS" }); ipShaders.Add(new[] { "ApproxMedianHorizontalCS", "ApproxMedianVerticalCS" }); ipShaders.Add(new[] { "Median3x3TapSinglePassCS" }); ipShaders.Add(new[] { "SobelEdgeOverlayCS" }); int shaderIndex = 0; string[] images = new[]{ "rendered scene", "Village.png", "Grass.jpg", "Sun.jpg", "Sand1.jpg", "Sand2.jpg", "QT1.jpg", "QT2.jpg", "QT3.jpg" }; var imageIndex = 1; var ip32x32 = ToDispose(new ImageProcessingCS()); ip32x32.ThreadsX = 32; ip32x32.ThreadsY = 32; ip32x32.LoadSourceImage(images[imageIndex]); ip32x32.Initialize(this); var ip16x4 = ToDispose(new ImageProcessingCS()); ip16x4.ThreadsX = 16; ip16x4.ThreadsY = 4; ip16x4.LoadSourceImage(images[imageIndex]); ip16x4.Initialize(this); var ip32x4 = ToDispose(new ImageProcessingCS()); ip32x4.ThreadsX = 32; ip32x4.ThreadsY = 4; ip32x4.LoadSourceImage(images[imageIndex]); ip32x4.Initialize(this); var ip128x4 = ToDispose(new ImageProcessingCS()); ip128x4.ThreadsX = 128; ip128x4.ThreadsY = 4; ip128x4.LoadSourceImage(images[imageIndex]); ip128x4.Initialize(this); var screenAlignedQuad = ToDispose(new ScreenAlignedQuadRenderer()); screenAlignedQuad.Initialize(this); // Create a axis-grid renderer var axisGrid = ToDispose(new AxisGridRenderer()); axisGrid.Initialize(this); // Create and initialize the mesh renderer var loadedMesh = Common.Mesh.LoadFromFile("cartoon_village.cmo"); List<MeshRenderer> meshes = new List<MeshRenderer>(); meshes.AddRange((from mesh in loadedMesh select ToDispose(new MeshRenderer(mesh)))); foreach (var m in meshes) { m.Initialize(this); m.World = Matrix.Identity; } // Set the first animation as the current animation and start clock foreach (var m in meshes) { if (m.Mesh.Animations != null && m.Mesh.Animations.Any()) m.CurrentAnimation = m.Mesh.Animations.First().Value; m.Clock.Start(); } // Create and initialize a Direct2D FPS text renderer var fps = ToDispose(new Common.FpsRenderer("Calibri", Color.CornflowerBlue, new Point(8, 8), 16)); fps.Initialize(this); // Create and initialize a general purpose Direct2D text renderer // This will display some instructions and the current view and rotation offsets var textRenderer = ToDispose(new Common.TextRenderer("Calibri", Color.CornflowerBlue, new Point(8, 40), 12)); textRenderer.Initialize(this); #endregion // Initialize the world matrix var worldMatrix = Matrix.Identity; // Set the camera position var cameraPosition = new Vector3(0, 0, 2); var cameraTarget = Vector3.Zero; // Looking at the origin 0,0,0 var cameraUp = Vector3.UnitY; // Y+ is Up // Prepare matrices // Create the view matrix from our camera position, look target and up direction var viewMatrix = Matrix.LookAtRH(cameraPosition, cameraTarget, cameraUp); viewMatrix.TranslationVector += new Vector3(0, -0.98f, 0); // Create the projection matrix /* FoV 60degrees = Pi/3 radians */ // Aspect ratio (based on window size), Near clip, Far clip var projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.5f, 100f); // Maintain the correct aspect ratio on resize Window.Resize += (s, e) => { projectionMatrix = Matrix.PerspectiveFovRH((float)Math.PI / 3f, Width / (float)Height, 0.5f, 100f); }; #region Rotation and window event handlers // Create a rotation vector to keep track of the rotation // around each of the axes var rotation = new Vector3(0.0f, 0.0f, 0.0f); var lerpT = 1.0f; // We will call this action to update text // for the text renderer Action updateText = () => { string shaders = String.Empty; foreach (var s in ipShaders[shaderIndex]) shaders += s + " "; textRenderer.Text = String.Format("Rotation ({0}) (Up/Down Left/Right Wheel+-)\nView ({1}) (A/D, W/S, Shift+Wheel+-)" + "\nShader {4}(PgUp/PgDn to change)" + "\nImage: {3} (Ctrl +/- to change)" + "\nLerp (t) = {2:#0.00} (+/- to change)" //+ "\nPress Z to show/hide depth buffer - Press F to toggle wireframe" //+ "\nPress 1-8 to switch shaders" , rotation, viewMatrix.TranslationVector, lerpT, images[imageIndex], shaders ); }; Dictionary<Keys, bool> keyToggles = new Dictionary<Keys, bool>(); keyToggles[Keys.Z] = false; keyToggles[Keys.F] = false; // Support keyboard/mouse input to rotate or move camera view var moveFactor = 0.02f; // how much to change on each keypress var shiftKey = false; var ctrlKey = false; var background = Color.White; Window.KeyDown += (s, e) => { var context = DeviceManager.Direct3DContext; shiftKey = e.Shift; ctrlKey = e.Control; switch (e.KeyCode) { // WASD -> pans view case Keys.A: viewMatrix.TranslationVector += new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.D: viewMatrix.TranslationVector -= new Vector3(moveFactor * 2, 0f, 0f); break; case Keys.S: if (shiftKey) viewMatrix.TranslationVector += new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector -= new Vector3(0f, 0f, 1) * moveFactor * 2; break; case Keys.W: if (shiftKey) viewMatrix.TranslationVector -= new Vector3(0f, moveFactor * 2, 0f); else viewMatrix.TranslationVector += new Vector3(0f, 0f, 1) * moveFactor * 2; break; // Up/Down and Left/Right - rotates around X / Y respectively // (Mouse wheel rotates around Z) case Keys.Down: worldMatrix *= Matrix.RotationX(moveFactor); rotation += new Vector3(moveFactor, 0f, 0f); break; case Keys.Up: worldMatrix *= Matrix.RotationX(-moveFactor); rotation -= new Vector3(moveFactor, 0f, 0f); break; case Keys.Left: worldMatrix *= Matrix.RotationY(moveFactor); rotation += new Vector3(0f, moveFactor, 0f); break; case Keys.Right: worldMatrix *= Matrix.RotationY(-moveFactor); rotation -= new Vector3(0f, moveFactor, 0f); break; case Keys.T: fps.Show = !fps.Show; textRenderer.Show = !textRenderer.Show; break; case Keys.B: if (background == Color.White) { background = new Color(30, 30, 34); } else { background = Color.White; } break; case Keys.G: axisGrid.Show = !axisGrid.Show; break; case Keys.P: // Pause or resume mesh animation meshes.ForEach(m => { if (m.Clock.IsRunning) m.Clock.Stop(); else m.Clock.Start(); }); break; case Keys.X: // To test for correct resource recreation // Simulate device reset or lost. System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); DeviceManager.Initialize(DeviceManager.Dpi); System.Diagnostics.Debug.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); break; case Keys.Z: keyToggles[Keys.Z] = !keyToggles[Keys.Z]; if (keyToggles[Keys.Z]) { context.PixelShader.Set(depthPixelShader); } else { context.PixelShader.Set(pixelShader); } break; case Keys.F: keyToggles[Keys.F] = !keyToggles[Keys.F]; RasterizerStateDescription rasterDesc; if (context.Rasterizer.State != null) rasterDesc = context.Rasterizer.State.Description; else rasterDesc = new RasterizerStateDescription() { CullMode = CullMode.Back, FillMode = FillMode.Solid }; if (keyToggles[Keys.F]) { rasterDesc.FillMode = FillMode.Wireframe; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } else { rasterDesc.FillMode = FillMode.Solid; context.Rasterizer.State = ToDispose(new RasterizerState(context.Device, rasterDesc)); } break; case Keys.D1: context.PixelShader.Set(pixelShader); break; case Keys.D2: context.PixelShader.Set(lambertShader); break; case Keys.D3: context.PixelShader.Set(phongShader); break; case Keys.D4: context.PixelShader.Set(blinnPhongShader); break; case Keys.PageUp: shaderIndex++; if (shaderIndex > ipShaders.Count - 1) shaderIndex = 0; updateText(); break; case Keys.PageDown: shaderIndex--; if (shaderIndex < 0) shaderIndex = ipShaders.Count - 1; updateText(); break; case Keys.Add: var lerpAdd = 0.01f; if (ctrlKey) { imageIndex++; if (imageIndex > images.Length - 1) { imageIndex = 0; } else if (imageIndex != 0) { ip128x4.LoadSourceImage(images[imageIndex]); ip32x32.LoadSourceImage(images[imageIndex]); ip16x4.LoadSourceImage(images[imageIndex]); ip32x4.LoadSourceImage(images[imageIndex]); } break; } if (shiftKey) lerpAdd *= 10; lerpT += lerpAdd; updateText(); break; case Keys.Subtract: var lerpSub = 0.01f; if (ctrlKey) { imageIndex--; if (imageIndex < 0) { imageIndex = images.Length - 1; } if (imageIndex > 0) { ip128x4.LoadSourceImage(images[imageIndex]); ip32x32.LoadSourceImage(images[imageIndex]); ip16x4.LoadSourceImage(images[imageIndex]); ip32x4.LoadSourceImage(images[imageIndex]); } break; } if (shiftKey) lerpSub *= 10; lerpT -= lerpSub; updateText(); break; } updateText(); }; Window.KeyUp += (s, e) => { // Clear the shift/ctrl keys so they aren't sticky if (e.KeyCode == Keys.ShiftKey) shiftKey = false; if (e.KeyCode == Keys.ControlKey) ctrlKey = false; }; Window.MouseWheel += (s, e) => { if (shiftKey) { // Zoom in/out viewMatrix.TranslationVector += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor * 2); } else { // rotate around Z-axis viewMatrix *= Matrix.RotationZ((e.Delta / 120f) * moveFactor); rotation += new Vector3(0f, 0f, (e.Delta / 120f) * moveFactor); } updateText(); }; var lastX = 0; var lastY = 0; Window.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { lastX = e.X; lastY = e.Y; } }; Window.MouseMove += (s, e) => { if (e.Button == MouseButtons.Left) { var yRotate = lastX - e.X; var xRotate = lastY - e.Y; lastY = e.Y; lastX = e.X; // Mouse move changes viewMatrix *= Matrix.RotationX(-xRotate * moveFactor); viewMatrix *= Matrix.RotationY(-yRotate * moveFactor); updateText(); } }; // Display instructions with initial values updateText(); #endregion var clock = new System.Diagnostics.Stopwatch(); clock.Start(); StringBuilder stats = new StringBuilder(); long[] elapsed = new long[5]; //long elapsed = 0; long frames = 0; long elapsedPS = 0; #region Render loop // Create and run the render loop RenderLoop.Run(Window, () => { // Start of frame: // Retrieve immediate context var context = DeviceManager.Direct3DContext; // Clear depth stencil view context.ClearDepthStencilView(DepthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0); // Clear render target view context.ClearRenderTargetView(RenderTargetView, background); // Create viewProjection matrix var viewProjection = Matrix.Multiply(viewMatrix, projectionMatrix); // Extract camera position from view var camPosition = Matrix.Transpose(Matrix.Invert(viewMatrix)).Column4; cameraPosition = new Vector3(camPosition.X, camPosition.Y, camPosition.Z); var perFrame = new ConstantBuffers.PerFrame(); perFrame.Light.Color = new Color(1f, 1f, 1f, 1.0f); var lightDir = Vector3.Transform(new Vector3(1f, -1f, -1f), worldMatrix); perFrame.Light.Direction = new Vector3(lightDir.X, lightDir.Y, lightDir.Z);// new Vector3(Vector3.Transform(new Vector3(1f, -1f, 1f), worldMatrix * Matrix.RotationAxis(Vector3.UnitY, time)).ToArray().Take(3).ToArray()); perFrame.CameraPosition = cameraPosition; context.UpdateSubresource(ref perFrame, perFrameBuffer); // Render each object var perMaterial = new ConstantBuffers.PerMaterial(); perMaterial.Ambient = new Color4(0.2f); perMaterial.Diffuse = Color.White; perMaterial.Emissive = new Color4(0); perMaterial.Specular = Color.White; perMaterial.SpecularPower = 20f; perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); var perObject = new ConstantBuffers.PerObject(); foreach (var m in meshes) { // MESH perObject.World = m.World * worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); // Provide the material constant buffer to the mesh renderer m.PerMaterialBuffer = perMaterialBuffer; m.PerArmatureBuffer = perArmatureBuffer; m.Render(); } // AXIS GRID using (var prevPixelShader = context.PixelShader.Get()) { perMaterial.HasTexture = 0; perMaterial.UVTransform = Matrix.Identity; context.UpdateSubresource(ref perMaterial, perMaterialBuffer); context.PixelShader.Set(pixelShader); perObject.World = worldMatrix; perObject.WorldInverseTranspose = Matrix.Transpose(Matrix.Invert(perObject.World)); perObject.WorldViewProjection = perObject.World * viewProjection; perObject.Transpose(); context.UpdateSubresource(ref perObject, perObjectBuffer); axisGrid.Render(); context.PixelShader.Set(prevPixelShader); } #region Image Processing // This step ensures that we have an image that is not // multisampled as the CS cannot use multisampled textures // Note: resolvedTarget uses the same format as renderTarget if (renderTarget.Description.SampleDescription.Count > 1 || renderTarget.Description.SampleDescription.Quality > 0) { context.ResolveSubresource(renderTarget, 0, resolvedTarget, 0, resolvedTarget.Description.Format); } else { // Not multisampled, so just copy to the resolvedTarget context.CopyResource(renderTarget, resolvedTarget); } // TODO: This should be moved outside of the render loop TexturePingPong pp = new TexturePingPong(); pp.SetSRVs(altRenderTargetSRV, alt2RenderTargetSRV); pp.SetUAVs(altRenderTargetUAV, alt2RenderTargetUAV); pp.SetUIntUAVs(altRenderTargetUIntUAV, alt2RenderTargetUIntUAV); ip128x4.Constants.LerpT = lerpT; ip32x32.Constants.LerpT = lerpT; ip16x4.Constants.LerpT = lerpT; ip32x4.Constants.LerpT = lerpT; // By default shaders are located in ImageProcessingCS.hlsl // other source files can be used by using the imageProcessing.CompileComputeShader function // Be sure to set the threadX/Y counts first // An array of shaders to apply string[] shaders = ipShaders[shaderIndex];// { "BlurFilterHorizontalCS", "BlurFilterVerticalCS" }; //"DesaturateCS" };// // Median3x3TapSinglePassCS // SobelEdgeOverlayCS // SobelEdgeCS // SepiaCS // BrightnessCS // ContrastCS // NegativeCS // SaturateCS // DesaturateCS // Possible to control the thread count for each shader if necessary ImageProcessingCS.ComputeConfig[] shaderConfig = null; //new[] { // Horizontal filter // new ImageProcessingCS.ComputeConfig { // Constants = imageProcessing.Constants, // ThreadsX = 1024, // ThreadsY = 1 // }, // Vertical filter // new ImageProcessingCS.ComputeConfig { // Constants = imageProcessing.Constants, // ThreadsX = 1, // ThreadsY = 1024 // }, //} // Ctrl +/- changes the imageIndex // Page Up/Down changes the shader code if (imageIndex > 0) { // Process the loaded static image //ip128x4.RunChainedCS(pp, shaders, shaderConfig); //ip32x32.RunChainedCS(pp, shaders, shaderConfig); ip16x4.RunChainedCS(pp, shaders, shaderConfig); //ip32x4.RunChainedCS(pp, shaders, shaderConfig); } else { // Process the currently rendered scene //ip128x4.RunChainedCS(resolvedTargetSRV, pp, shaders, shaderConfig); //ip32x32.RunChainedCS(resolvedTargetSRV, pp, shaders, shaderConfig); ip16x4.RunChainedCS(resolvedTargetSRV, pp, shaders, shaderConfig); //ip32x4.RunChainedCS(pp, shaders, shaderConfig); } // Run histogram shader and retrieve result //var histo = imageProcessing.Histogram(); // Keep track of how long the dispatch calls are taking //elapsed[0] += ip128x4.LastDispatchTicks; //elapsed[1] += ip32x32.LastDispatchTicks; elapsed[2] += ip16x4.LastDispatchTicks; //elapsed[3] += ip32x4.LastDispatchTicks; clock.Restart(); // Render the result to the render target with our screen-aligned quad context.PixelShader.SetShaderResource(0, pp.GetCurrentAsSRV()); screenAlignedQuad.Render(); elapsedPS += clock.ElapsedTicks; frames++; // Output core statistics // Warning!!! the timings for the CS are the accumulated Dispatch calls only, not setting / clearing resources etc.. // A comparison with the screen-aligned pixel shader is provided - this way an operation can easily be tested for performance in both if (frames % 2500 == 0) { string shader = String.Empty; foreach (var s in ipShaders[shaderIndex]) shader += s + " "; textRenderer.Text = string.Format("CS: ({0:F6} ms) - {2}\nPS: ({1:F6} ms)", (double)elapsed[2] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, (double)elapsedPS / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, shader); //textRenderer.Text = string.Format("CS:\n1024x1:{0:F6} ms)\n32x32:{1:F6} ms\n16x4:{2:F6} ms\n256x4:{3:F6} ms)\nPS: ({4:F6} ms)", // (double)elapsed[0] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[1] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[2] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[3] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsedPS / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0); //stats.AppendLine(string.Format("{0:F9},{1:F9},{2:F9},{3:F9}", // (double)elapsed[0] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[1] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[2] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[3] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0 // )); //System.IO.File.AppendAllText("stats.csv", string.Format("{0:F9},{1:F9},{2:F9},{3:F9}\r\n", // (double)elapsed[0] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[1] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[2] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0, // (double)elapsed[3] / (double)frames / System.Diagnostics.Stopwatch.Frequency * 1000.0 // )); } else if (frames > 2500) { frames = 0; elapsed[0] = 0; elapsed[1] = 0; elapsed[2] = 0; elapsed[3] = 0; elapsedPS = 0; } #endregion // Render FPS fps.Render(); // Render instructions + position changes textRenderer.Render(); // Present the frame Present(); }); #endregion }
/// <summary> /// Resolves the service runtimes into downloadable URLs. /// </summary> /// <param name="manifest">The custom manifest file</param> /// <returns>Warning text if any</returns> public string ResolveRuntimePackageUrls(string manifest = null) { ServiceSettings settings = ServiceSettings.Load(Paths.Settings); CloudRuntimeCollection availableRuntimePackages; if (!CloudRuntimeCollection.CreateCloudRuntimeCollection(out availableRuntimePackages, manifest)) { throw new ArgumentException( string.Format(Resources.ErrorRetrievingRuntimesForLocation, settings.Location)); } ServiceDefinition definition = this.Components.Definition; StringBuilder warningText = new StringBuilder(); List<CloudRuntimeApplicator> applicators = new List<CloudRuntimeApplicator>(); if (definition.WebRole != null) { foreach (WebRole role in definition.WebRole.Where(role => role.Startup != null && CloudRuntime.GetRuntimeStartupTask(role.Startup) != null)) { CloudRuntime.ClearRuntime(role); string rolePath = Path.Combine(this.Paths.RootPath, role.name); foreach (CloudRuntime runtime in CloudRuntime.CreateRuntime(role, rolePath)) { CloudRuntimePackage package; runtime.CloudServiceProject = this; if (!availableRuntimePackages.TryFindMatch(runtime, out package)) { string warning; if (!runtime.ValidateMatch(package, out warning)) { warningText.AppendFormat("{0}\r\n", warning); } } applicators.Add(CloudRuntimeApplicator.CreateCloudRuntimeApplicator( runtime, package, role)); } } } if (definition.WorkerRole != null) { foreach (WorkerRole role in definition.WorkerRole.Where(role => role.Startup != null && CloudRuntime.GetRuntimeStartupTask(role.Startup) != null)) { string rolePath = Path.Combine(this.Paths.RootPath, role.name); CloudRuntime.ClearRuntime(role); foreach (CloudRuntime runtime in CloudRuntime.CreateRuntime(role, rolePath)) { CloudRuntimePackage package; runtime.CloudServiceProject = this; if (!availableRuntimePackages.TryFindMatch(runtime, out package)) { string warning; if (!runtime.ValidateMatch(package, out warning)) { warningText.AppendFormat(warning + Environment.NewLine); } } applicators.Add(CloudRuntimeApplicator.CreateCloudRuntimeApplicator(runtime, package, role)); } } } applicators.ForEach<CloudRuntimeApplicator>(a => a.Apply()); this.Components.Save(this.Paths); return warningText.ToString(); }
private void UnchokePeerList(List<PeerId> PeerList) { //Unchoke all the peers in the supplied list PeerList.ForEach(Unchoke); }