コード例 #1
0
ファイル: Clipmap.cs プロジェクト: mono-soc-2011/SLSharp
        public Clipmap()
        {
            //_testMap = (Bitmap)Image.FromFile("height.png");
            _testMap = (Bitmap)Image.FromFile(@"height.jpg");

            Position = new IntFloatVector2(new IntFloat(-_testMap.Width / 4), new IntFloat(-_testMap.Height / 4));

            Locations = new PatchLocations(H, M);

            var scale = Scale;
            var scaleInt = 1;

            for (var i = 0; i < Levels; i++)
            {
                _levels[i] = new ClipmapLevel(scale, scaleInt, this);
                scale *= 2.0f;
                scaleInt *= 2;
            }

            GenerateTestTexture();
            UpdatePosition();
            Reset();

            _initialized = true;
        }
コード例 #2
0
ファイル: Clipmap.cs プロジェクト: uzbekdev1/SLSharp
        public void MoveBy(float dx, float dy)
        {
            if (Math.Abs(dx) < 0.0000001f && Math.Abs(dy) < 0.0000001f)
            {
                return;
            }

            /*
             * _mx = dx >= 0;
             * _my = dy >= 0;
             *
             * XPosition = Utilities.Fract(XPosition + 0.5f + dx) - 0.5f;
             * YPosition = Utilities.Fract(YPosition + 0.5f + dy) - 0.5f;
             */

            Position = Position.MoveBy(dx, dy);
            UpdatePosition();
        }
コード例 #3
0
ファイル: Clipmap.cs プロジェクト: uzbekdev1/SLSharp
        private void UpdatePosition()
        {
            var pos = Position;
            var p   = new IntFloatVector2[Levels]; // TODO: could make this a member var

            for (var i = 0; i < ActiveMax; i++)
            {
                p[i] = pos;
                pos  = pos.Div2();
            }

            // we need to update from coarse to detail levels
            // as detail levels access the coarse level caches
            for (var i = ActiveMax - 1; i >= 0; i--)
            {
                var lvl = _levels[i];
                lvl.SetPosition2(p[i]);
            }
        }
コード例 #4
0
        public void SetPosition2(IntFloatVector2 pos)
        {
            var x    = pos.X.Integer * 2 + 1;
            var y    = pos.Y.Integer * 2 + 1;
            var oldX = Position.X.Integer * 2 + 1;
            var oldY = Position.Y.Integer * 2 + 1;

            Position = pos;

            // for slice updates we are only interested in the integer part
            if (x == oldX && y == oldY)
            {
                return;
            }

            BeginUpdate();


            if (y > oldY)
            {
                UpdateRows((_n - oldY) & _n, Math.Min((y - oldY), _n));
            }
            else if (oldY > y)
            {
                UpdateRows((_n - y) & _n, Math.Min((oldY - y), _n));
            }

            if (x > oldX)
            {
                UpdateColumns((_n - oldX) & _n, Math.Min((x - oldX), _n));
            }
            else if (oldX > x)
            {
                UpdateColumns((_n - x) & _n, Math.Min((oldX - x), _n));
            }

            EndUpdate();
        }
コード例 #5
0
ファイル: ClipmapLevel.cs プロジェクト: hach-que/SLSharp
        public void SetPosition2(IntFloatVector2 pos)
        {
            var x = pos.X.Integer * 2 + 1;
            var y = pos.Y.Integer * 2 + 1;
            var oldX = Position.X.Integer * 2 + 1;
            var oldY = Position.Y.Integer * 2 + 1;

            Position = pos;

            // for slice updates we are only interested in the integer part
            if (x == oldX && y == oldY)
                return;

            if (y > oldY)
                UpdateRows((_n - oldY) & _n, Math.Min((y - oldY), _n));
            else if (oldY > y)
                UpdateRows((_n - y) & _n, Math.Min((oldY - y), _n));

            if (x > oldX)
                UpdateColumns((_n - oldX) & _n, Math.Min((x - oldX), _n));
            else if (oldX > x)
                UpdateColumns((_n - x) & _n, Math.Min((oldX - x), _n));
        }
コード例 #6
0
ファイル: Clipmap.cs プロジェクト: hach-que/SLSharp
        public Clipmap(SceneManager scene)
        {
            _scene = scene;
            _scene.RenderQueueStarted += (byte groupId, string invocation, out bool skipThisInvocation) =>
            {
                if (groupId == _scene.RenderQueue.DefaultQueueGroup)
                    QueuePatches(_scene.RenderQueue);
                skipThisInvocation = false;
            };

            using (var testMap = (Bitmap)Image.FromFile(@"height.jpg"))
            {
                _testMapWidth = testMap.Width;
                _testMapHeight = testMap.Height;
                _testMap = new float[_testMapWidth * _testMapHeight];
                var i = 0;
                for (var y = 0; y < testMap.Height; y++)
                    for (var x = 0; x < testMap.Width; x++)
                        _testMap[i++] = testMap.GetPixel(x, y).R / 255.0f;
            }

            var tu = _shader.Sampler(() => _shader.Heightmap);
            tu.DesiredFormat = PixelFormat.PF_FLOAT32_RGB;
            tu.SetTextureFiltering(FilterOptions.FO_POINT, FilterOptions.FO_POINT, FilterOptions.FO_NONE);
            tu.SetTextureAddressingMode(TextureUnitState.TextureAddressingMode.TAM_WRAP);
            tu.SetBindingType(TextureUnitState.BindingType.BT_VERTEX);

            _shader.SetAuto(() => _shader.ModelViewProjectionMatrix, GpuProgramParameters.AutoConstantType.ACT_WORLDVIEWPROJ_MATRIX);
            //_shader.SetAuto(() => _shader.NormalMatrix, GpuProgramParameters.AutoConstantType.ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX);
            _shader.SetAuto(() => _shader.ScaleFactor, GpuProgramParameters.AutoConstantType.ACT_CUSTOM, 0);
            _shader.SetAuto(() => _shader.FineBlockOrigin, GpuProgramParameters.AutoConstantType.ACT_CUSTOM, 1);

            Position = new IntFloatVector2(new IntFloat(-_testMapWidth / 4), new IntFloat(-_testMapHeight / 4));

            Locations = new PatchLocations(H, M);

            var scale = Scale;
            var scaleInt = 1;

            for (var i = 0; i < Levels; i++)
            {
                _levels[i] = new ClipmapLevel(scale, scaleInt, this);
                var level = _levels[i];
                tu.SetTextureName(level.Heightmap.Name);
                var m = _shader.CloneMaterial("ClipmapLevel" + i);
                _levels[i].Material = m;

                scale *= 2.0f;
                scaleInt *= 2;
            }

            UpdatePosition();
            Reset();

            _initialized = true;
        }
コード例 #7
0
ファイル: Clipmap.cs プロジェクト: hach-que/SLSharp
        public void MoveBy(float dx, float dy)
        {
            if (Math.Abs(dx) < 0.0000001f && Math.Abs(dy) < 0.0000001f)
                return;

            Position = Position.MoveBy(dx, dy);
            UpdatePosition();
        }
コード例 #8
0
ファイル: Clipmap.cs プロジェクト: hach-que/SLSharp
        public Clipmap(SceneManager scene)
        {
            _scene = scene;
            _scene.QueueStarted += (sender, args) =>
            {
                if (args.RenderQueueId == _scene.GetRenderQueue().DefaultRenderGroup)
                    QueuePatches(_scene.GetRenderQueue());
                args.SkipInvocation = false;
            };

            using (var testMap = (Bitmap)Image.FromFile(@"height.jpg"))
            {
                _testMapWidth = testMap.Width;
                _testMapHeight = testMap.Height;
                _testMap = new float[_testMapWidth * _testMapHeight];
                var i = 0;
                for (var y = 0; y < testMap.Height; y++)
                    for (var x = 0; x < testMap.Width; x++)
                        _testMap[i++] = testMap.GetPixel(x, y).R / 255.0f;
            }

            var tu = _shader.Sampler(() => _shader.Heightmap);
            tu.DesiredFormat = PixelFormat.FLOAT32_RGB;
            tu.SetTextureFiltering(FilterOptions.Point, FilterOptions.Point, FilterOptions.None);
            tu.SetTextureAddressingMode(TextureAddressing.Wrap);
            tu.BindingType = TextureBindingType.Vertex;

            _shader.SetAuto(() => _shader.ModelViewProjectionMatrix, GpuProgramParameters.AutoConstantType.WorldViewProjMatrix);
            //_shader.SetAuto(() => _shader.NormalMatrix, GpuProgramParameters.AutoConstantType.ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX);
            _shader.SetAuto(() => _shader.ScaleFactor, GpuProgramParameters.AutoConstantType.Custom, 0);
            _shader.SetAuto(() => _shader.FineBlockOrigin, GpuProgramParameters.AutoConstantType.Custom, 1);

            Position = new IntFloatVector2(new IntFloat(-_testMapWidth / 4), new IntFloat(-_testMapHeight / 4));

            Locations = new PatchLocations(H, M);

            var scale = Scale;
            var scaleInt = 1;

            for (var i = 0; i < Levels; i++)
            {
                _levels[i] = new ClipmapLevel(scale, scaleInt, this);
                var level = _levels[i];
                tu.SetTextureName(level.Heightmap.Name);
                var m = _shader.CloneMaterial("ClipmapLevel" + i);
                _levels[i].Material = m;

                scale *= 2.0f;
                scaleInt *= 2;
            }

            UpdatePosition();
            Reset();

            _initialized = true;
        }
コード例 #9
0
ファイル: Clipmap.cs プロジェクト: hach-que/SLSharp
        private void UpdatePosition()
        {
            var pos = Position;
            var p = new IntFloatVector2[Levels]; // TODO: could make this a member var

            for (var i = 0; i < ActiveMax; i++)
            {
                p[i] = pos;
                pos = pos.Div2();
            }

            // we need to update from coarse to detail levels
            // as detail levels access the coarse level caches
            for (var i = ActiveMax - 1; i >= 0; i--)
            {
                var lvl = _levels[i];
                lvl.SetPosition2(p[i]);
            }
        }
コード例 #10
0
ファイル: Clipmap.cs プロジェクト: hach-que/SLSharp
        public void MoveBy(float dx, float dy)
        {
            if (Math.Abs(dx) < 0.0000001f && Math.Abs(dy) < 0.0000001f)
                return;
            /*
            _mx = dx >= 0;
            _my = dy >= 0;

            XPosition = Utilities.Fract(XPosition + 0.5f + dx) - 0.5f;
            YPosition = Utilities.Fract(YPosition + 0.5f + dy) - 0.5f;
             */

            Position = Position.MoveBy(dx, dy);
            UpdatePosition();
        }