public static TerainVertex[] GenerateVertexes(Device device, Bitmap heightMap) { heightMeasure = (tileWidth + tileHeight) * 0.25f * 0.2f; int width = heightMap.Width; int height = heightMap.Height; int primitiveCount = 2 * (width - 1) * (height - 1); int vertexCount = width * height; int indexCount = 3 * primitiveCount; Color[,] map = BitmapOperation.BitmapToColorArray(heightMap); TerainVertex[] vertexes = new TerainVertex[vertexCount]; int[] indices = new int[indexCount]; int[] adjency = new int[indexCount]; Terrain.minPosition = new Vector3(-(0.5f * (width - 1) * tileWidth), -127 * heightMeasure, -(0.5f * (height - 1) * tileHeight)); Terrain.maxPosition = new Vector3(tileWidth * (width - 1) * 0.5f, 127 * heightMeasure, tileHeight * (height - 1) * 0.5f); #region Generate Vertexes and Indexes int i = 0; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { float posX = x * tileWidth - (0.5f * (width - 1) * tileWidth); float posY = map[x, y].B * heightMeasure; float posZ = y * tileHeight - (0.5f * (height - 1) * tileHeight); Vector3 pos = new Vector3(posX, posY, posZ); Vector3 nor = new Vector3(); float u = (float)x; float v = (float)y; if (x + 1 < width) { if (y + 1 < height) { #region Generate Index Buffer indices[i] = (y * width + x); indices[i + 1] = ((y + 1) * width + x); indices[i + 2] = (y * width + x + 1); indices[i + 3] = (indices[i + 2]); indices[i + 4] = (indices[i + 1]); indices[i + 5] = (indices[i + 1] + 1); i += 6; #endregion } } vertexes[y * width + x] = new TerainVertex(pos, nor, u, v); } } #endregion return(vertexes); }
/// <summary> /// async invert operation /// </summary> private void longInvert() { if (BitmapImage == null) { return; } if (SelectedPrimitive != null) { SelectedPrimitive.Reset(); } TaskTimeText = ""; var cts = new CancellationTokenSource(); var token = cts.Token; //working with BitmapImage before task var encoder = new BmpBitmapEncoder(); var stream = new MemoryStream(); encoder.Frames.Add(BitmapFrame.Create(BitmapImage)); encoder.Save(stream); IsTaskRunning = true; //disable UI controls _tsk = Task.Factory.StartNew(() => { using (stream) { MemoryStream s = BitmapOperation.Operation(stream, BitmapOperations.Invert, progressChange, token); if (s != null) { byte[] arr = s.ToArray(); //arr for UI thread s.Close(); DispatcherHelper.CheckBeginInvokeOnUI(() => { var bi = new BitmapImage(); //new BitmapImage must be created in UI thread bi.BeginInit(); bi.StreamSource = new MemoryStream(arr); bi.EndInit(); var rtb = new RenderTargetBitmap(bi.PixelWidth, bi.PixelHeight, bi.DpiX, bi.DpiY, PixelFormats.Pbgra32); rtb.Render(createDrawingVisualFromImage(bi)); BitmapImage = rtb; }); } } IsTaskRunning = false; //enable UI contorls }, token); //Cancel action, will run when CancelCommand occured _cancelWork = t => { cts.Cancel(); t.Wait(); IsTaskRunning = false; }; }
public Terrain(int level, Device device, Bitmap heightMap, Texture mask, Texture layer1, Texture layer2, Texture layer3) : base(level, GenerateVertexes(device, heightMap), GenerateIndexes(device, heightMap), Terrain.minPosition, Terrain.maxPosition, Matrix.Identity, new Texture[] { layer1 }, new Texture[] { layer2 }, new Texture[] { layer3 }, null) { this.heightMap = BitmapOperation.BitmapToColorArray(heightMap); blocked = new List <Point>(); base.SetIsEveryWhere(true); CameraDriver.SetAttachedTerain(this); }
public void OpearationInvert_DoubleInvertion_ArraysMustBeEqual() { var bmIn = new Bitmap(10, 10); var sIn = new MemoryStream(); bmIn.Save(sIn, ImageFormat.Bmp); //arrIn = sIn.ToArray(); MemoryStream sOut1 = BitmapOperation.Operation(sIn, BitmapOperations.Invert, null, CancellationToken.None); sIn.Close(); //arrOut1 = sOut.ToArray(); //sOut.Close(); //sIn = new MemoryStream(arrOut1); sOut1.Position = 0; MemoryStream sOut2 = BitmapOperation.Operation(sOut1, BitmapOperations.Invert, null, CancellationToken.None); //arrOut2 = sOut.ToArray(); Bitmap bmOut = new Bitmap(sOut2); sOut1.Close(); sOut2.Close(); Assert.IsTrue(bitmapsCompare(bmIn, bmOut)); }
/// <summary> /// Funkce se postara o rendering cele sceny /// </summary> /// <param name="time">Cas uplynuly od spusteni aplikace v milisekundach</param> public void Render(float time) { sceneManager.ResetCounters(); #region Rendering tests bool deviceLost = initializator.IsDeviceLost(); if (deviceLost) { ResourceUnload(); } if (!initializator.BeginRender()) { return; } if (unloadResources) { DeviceReset(); unloadResources = false; } #endregion #region Vyrenderovani kolizni mapy (1x) if (terrain != null && terrain.GetCollissionMap() == null) { RenderCollisionMap(0); terrain.SetCollissionMap(BitmapOperation.TextureToColorArray(collisionMap.GetTexture()), true); } #endregion #region Generovani shadow mapy podle prvniho svetla, existuje-li nejake if ((int)currentDetail >= 2) { List <SceneManager.SceneObject> lights = sceneManager.GetDirectionLights(); if (lights.Count > 0) { Vector4 moonPosition = lights[0].light.GetLightPosition(); Matrix view = CameraDriver.GetTerainViewMatrix(new Vector3(moonPosition.X, moonPosition.Y, moonPosition.Z)); Matrix OrthoProjectionMatrix = CameraDriver.GetTerainOrthoProjectionMatrix(); sceneManager.SetLightViewProjection(view * OrthoProjectionMatrix); sceneManager.SetRenderShadowsNonEmitterObjects(false); sceneManager.SetComputeVisibility(false); shadowMap.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1f, 0); if (enableshadows) { sceneManager.RenderSceneBasic(time, sceneManager["ShadowMap"]); } shadowMap.EndScene(Filter.Linear); sceneManager.SetShadowMap(shadowMap.GetTexture()); sceneManager.SetRenderShadowsNonEmitterObjects(true); sceneManager.SetComputeVisibility(true); } } #endregion #region Nastaveni optimalizace if (usedoptimize == OptimizeType.QuadTree) { sceneManager.SetComputeVisibility(true); } else if (usedoptimize == OptimizeType.OcclussionCulling) { occlusion.DoCulling(); sceneManager.SetComputeVisibility(false); } #endregion device.BeginScene(); sceneManager.RenderScene(time, sceneManager["Shadows"]); if (showBoundingSpheres) { sceneManager.RenderSceneBasic(time, sceneManager["Base"], true, false); } RenderHUD(); device.EndScene(); initializator.EndRender(); CountFPS(); }