Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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;
            };
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        /// <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();
        }