Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
 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);
     }
 }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
 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();
				}
		}
Ejemplo n.º 11
0
        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();
        }
Ejemplo n.º 12
0
        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);
                }
            });
        }
Ejemplo n.º 13
0
		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);
			}
		}
Ejemplo n.º 14
0
        /// <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();
                }
            }
        }
Ejemplo n.º 15
0
        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));
        }
Ejemplo n.º 16
0
        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
        }
Ejemplo n.º 18
0
        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));
		}
Ejemplo n.º 23
0
		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
        }
Ejemplo n.º 25
0
        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();
            });
        }
Ejemplo n.º 26
0
        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();
        }
Ejemplo n.º 29
0
 private void UnchokePeerList(List<PeerId> PeerList)
 {
     //Unchoke all the peers in the supplied list
     PeerList.ForEach(Unchoke);
 }