예제 #1
0
        public void Bind(Viewport3DRenderOptions options)
        {
            Shader.Bind();

            Perspective = options.Viewport;
            Camera      = options.Camera;
            ModelView   = options.ModelView;
            IsTextured  = options.Textured;
            IsLit       = options.Shaded;
            Show3DGrid  = options.ShowGrid;
            GridSpacing = (float)options.GridSpacing;
        }
예제 #2
0
        public void Draw3D(ViewportBase context, Matrix4 viewport, Matrix4 camera, Matrix4 modelView)
        {
            if (_document.TextureCollection.LightmapTextureOutdated)
            {
                _document.TextureCollection.UpdateLightmapTexture();
                List <Face> faces = new List <Face>();
                foreach (Solid solid in _document.Map.WorldSpawn.Find(x => x is Solid).OfType <Solid>())
                {
                    foreach (Face tface in solid.Faces)
                    {
                        faces.Add(tface);
                    }
                }
                UpdatePartial(faces);
            }

            var type = ((Viewport3D)context).Type;
            var opts = new Viewport3DRenderOptions
            {
                Viewport        = viewport,
                Camera          = camera,
                ModelView       = modelView,
                ShowGrid        = Document.Map.Show3DGrid,
                GridSpacing     = Document.Map.GridSpacing,
                Shaded          = type == Viewport3D.ViewType.Shaded || type == Viewport3D.ViewType.Textured || type == Viewport3D.ViewType.Lightmapped,
                Textured        = type == Viewport3D.ViewType.Textured || type == Viewport3D.ViewType.Lightmapped,
                Wireframe       = type == Viewport3D.ViewType.Wireframe,
                LightmapEnabled = type == Viewport3D.ViewType.Lightmapped
            };

            var cam      = ((Viewport3D)context).Camera;
            var location = new Coordinate((decimal)cam.Location.X, (decimal)cam.Location.Y, (decimal)cam.Location.Z);
            var lookAt   = new Coordinate((decimal)cam.LookAt.X, (decimal)cam.LookAt.Y, (decimal)cam.LookAt.Z);

            if (!opts.Wireframe)
            {
                _mapObject3DShader.Bind(opts);
                _mapObject3DShader.SelectionTransform        = _selectionTransform;
                _mapObject3DShader.SelectionColourMultiplier = Document.Map.HideFaceMask &&
                                                               Document.Selection.InFaceSelection
                                                                   ? new Vector4(1, 1, 1, 1)
                                                                   : new Vector4(1, 0.5f, 0.5f, 1);

                // Render textured polygons
                _array.RenderTextured(context.Context, _document.TextureCollection.LightmapTexture);

                // Render textured models
                if (!CBRE.Settings.View.DisableModelRendering)
                {
                    foreach (var tuple in _models)
                    {
                        var arr    = _modelArrays[tuple.Item2];
                        var origin = tuple.Item1.Origin;
                        if (tuple.Item1.HideDistance() <= (location - origin).VectorMagnitude())
                        {
                            continue;
                        }

                        var scale = tuple.Item1.EntityData.GetPropertyCoordinate("scale", Coordinate.One);
                        scale = new Coordinate(scale.X, scale.Z, scale.Y);
                        var    angles = tuple.Item1.EntityData.GetPropertyCoordinate("angles", Coordinate.Zero);
                        Matrix pitch  = Matrix.Rotation(Quaternion.EulerAngles(DMath.DegreesToRadians(angles.X), 0, 0));
                        Matrix yaw    = Matrix.Rotation(Quaternion.EulerAngles(0, 0, -DMath.DegreesToRadians(angles.Y)));
                        Matrix roll   = Matrix.Rotation(Quaternion.EulerAngles(0, DMath.DegreesToRadians(angles.Z), 0));
                        if (tuple.Item1.IsSelected)
                        {
                            origin *= _selectionTransformMat;
                            // TODO: rotation/angles
                        }
                        var tform = (yaw * roll * pitch * Matrix.Scale(scale)).Translate(origin);
                        _mapObject3DShader.Transformation = tform.ToGLSLMatrix4();
                        arr.RenderTextured(context.Context);
                    }
                    _mapObject3DShader.Transformation = Matrix4.Identity;
                }

                // Render untextured polygons
                _mapObject3DShader.IsTextured = false;
                _array.RenderUntextured(context.Context, location);

                // todo Render sprites

                _mapObject3DShader.Unbind();
            }

            // Render wireframe
            _mapObject2DShader.Bind(opts);
            _mapObject2DShader.SelectedColour = new Vector4(1, 1, 0, 1);

            if (opts.Wireframe)
            {
                _mapObject2DShader.SelectedOnly       = false;
                _mapObject2DShader.SelectionTransform = _selectionTransform;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            if (!Document.Selection.InFaceSelection || !Document.Map.HideFaceMask)
            {
                _mapObject2DShader.SelectedOnly       = true;
                _mapObject2DShader.SelectionTransform = Matrix4.Identity;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            _mapObject2DShader.Unbind();

            if (!opts.Wireframe)
            {
                // Render transparent
                _mapObject3DShader.Bind(opts);
                _decalArray.RenderTransparent(context.Context, location);
                _array.RenderTransparent(context.Context, x => _mapObject3DShader.IsTextured = x && opts.Textured, location, lookAt);
                _mapObject3DShader.Unbind();
            }
        }
예제 #3
0
        public void Draw3D(ViewportBase context, Matrix4 viewport, Matrix4 camera, Matrix4 modelView)
        {
            var opts = new Viewport3DRenderOptions
            {
                Viewport = viewport,
                Camera = camera,
                ModelView = modelView,
                ShowGrid = Document.Map.Show3DGrid,
                GridSpacing = Document.Map.GridSpacing,
                Lit = true,
                Textured = true,
                Wireframe = false
            };

            var cam = ((Viewport3D)context).Camera.Location;
            var location = new Coordinate((decimal)cam.X, (decimal)cam.Y, (decimal)cam.Z);

            _mapObject3DShader.Bind(opts);
            _mapObject3DShader.SelectionTransform = _selectionTransform;
            _mapObject3DShader.SelectionColourMultiplier = Document.Map.HideFaceMask && Document.Selection.InFaceSelection
                ? new Vector4(1, 1, 1, 1) : new Vector4(1, 0.5f, 0.5f, 1);

            // Render textured polygons
            _array.RenderTextured(context.Context);

            // Render textured models
            if (!Sledge.Settings.View.DisableModelRendering)
            {
                foreach (var tuple in _models)
                {
                    var arr = _modelArrays[tuple.Item2];
                    var origin = tuple.Item1.Origin;
                    if (tuple.Item1.HideDistance() <= (location - origin).VectorMagnitude()) continue;
                    _mapObject3DShader.Translation = new Vector4((float) origin.X, (float) origin.Y, (float) origin.Z, 0);
                    arr.RenderTextured(context.Context);
                }
                _mapObject3DShader.Translation = Vector4.Zero;
            }

            // Render untextured polygons
            _mapObject3DShader.IsTextured = false;
            _array.RenderUntextured(context.Context, location);

            // todo Render sprites

            _mapObject3DShader.Unbind();

            // Render wireframe
            _mapObject2DShader.Bind(opts);
            _mapObject2DShader.SelectedOnly = true;
            _mapObject2DShader.SelectedColour = new Vector4(1, 1, 0, 1);
            _mapObject2DShader.SelectionTransform = Matrix4.Identity;
            _array.RenderWireframe(context.Context);
            _decalArray.RenderWireframe(context.Context);
            _mapObject2DShader.Unbind();

            // Render transparent
            _mapObject3DShader.Bind(opts);
            _decalArray.RenderTransparent(context.Context, location);
            _array.RenderTransparent(context.Context, x => _mapObject3DShader.IsTextured = x, location);
            _mapObject3DShader.Unbind();
        }
예제 #4
0
        public void Bind(Viewport3DRenderOptions options)
        {
            Shader.Bind();

            Perspective = options.Viewport;
            Camera = options.Camera;
            ModelView = options.ModelView;
            IsTextured = options.Textured;
            IsLit = options.Shaded;
            Show3DGrid = options.ShowGrid;
            GridSpacing = (float) options.GridSpacing;
            // todo selection transform
        }
예제 #5
0
        public void Draw3D(ViewportBase context, Matrix4 viewport, Matrix4 camera, Matrix4 modelView)
        {
            var type = ((Viewport3D) context).Type;
            var opts = new Viewport3DRenderOptions
            {
                Viewport = viewport,
                Camera = camera,
                ModelView = modelView,
                ShowGrid = Document.Map.Show3DGrid,
                GridSpacing = Document.Map.GridSpacing,
                Shaded = type == Viewport3D.ViewType.Shaded || type == Viewport3D.ViewType.Textured,
                Textured = type == Viewport3D.ViewType.Textured,
                Wireframe = type == Viewport3D.ViewType.Wireframe
            };

            var cam = ((Viewport3D)context).Camera.Location;
            var location = new Coordinate((decimal)cam.X, (decimal)cam.Y, (decimal)cam.Z);

            if (!opts.Wireframe)
            {
                _mapObject3DShader.Bind(opts);
                _mapObject3DShader.SelectionTransform = _selectionTransform;
                _mapObject3DShader.SelectionColourMultiplier = Document.Map.HideFaceMask &&
                                                               Document.Selection.InFaceSelection
                                                                   ? new Vector4(1, 1, 1, 1)
                                                                   : new Vector4(1, 0.5f, 0.5f, 1);

                // Render textured polygons
                _array.RenderTextured(context.Context);

                // Render textured models
                if (!Sledge.Settings.View.DisableModelRendering)
                {
                    foreach (var tuple in _models)
                    {
                        var arr = _modelArrays[tuple.Item2];
                        var origin = tuple.Item1.Origin;
                        if (tuple.Item1.HideDistance() <= (location - origin).VectorMagnitude()) continue;

                        var angles = tuple.Item1.EntityData.GetPropertyCoordinate("angles", Coordinate.Zero);
                        angles = new Coordinate(-DMath.DegreesToRadians(angles.Z), DMath.DegreesToRadians(angles.X),
                                                -DMath.DegreesToRadians(angles.Y));
                        if (tuple.Item1.IsSelected)
                        {
                            origin *= _selectionTransformMat;
                            // TODO: rotation/angles
                        }
                        var tform = Matrix.Rotation(Quaternion.EulerAngles(angles)).Translate(origin);
                        _mapObject3DShader.Transformation = tform.ToGLSLMatrix4();
                        arr.RenderTextured(context.Context);
                    }
                    _mapObject3DShader.Transformation = Matrix4.Identity;
                }

                // Render untextured polygons
                _mapObject3DShader.IsTextured = false;
                _array.RenderUntextured(context.Context, location);

                // todo Render sprites

                _mapObject3DShader.Unbind();
            }

            // Render wireframe
            _mapObject2DShader.Bind(opts);
            _mapObject2DShader.SelectedColour = new Vector4(1, 1, 0, 1);

            if (opts.Wireframe)
            {
                _mapObject2DShader.SelectedOnly = false;
                _mapObject2DShader.SelectionTransform = _selectionTransform;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            _mapObject2DShader.SelectedOnly = true;
            _mapObject2DShader.SelectionTransform = Matrix4.Identity;
            _array.RenderWireframe(context.Context);
            _decalArray.RenderWireframe(context.Context);

            _mapObject2DShader.Unbind();

            if (!opts.Wireframe)
            {
                // Render transparent
                _mapObject3DShader.Bind(opts);
                _decalArray.RenderTransparent(context.Context, location);
                _array.RenderTransparent(context.Context, x => _mapObject3DShader.IsTextured = x && opts.Textured, location);
                _mapObject3DShader.Unbind();
            }
        }
예제 #6
0
        public void Draw3D(ViewportBase context, Matrix4 viewport, Matrix4 camera, Matrix4 modelView)
        {
            var type = ((Viewport3D)context).Type;
            var opts = new Viewport3DRenderOptions
            {
                Viewport    = viewport,
                Camera      = camera,
                ModelView   = modelView,
                ShowGrid    = Document.Map.Show3DGrid,
                GridSpacing = Document.Map.GridSpacing,
                Shaded      = type == Viewport3D.ViewType.Shaded || type == Viewport3D.ViewType.Textured,
                Textured    = type == Viewport3D.ViewType.Textured,
                Wireframe   = type == Viewport3D.ViewType.Wireframe
            };

            var cam      = ((Viewport3D)context).Camera.Location;
            var location = new Coordinate((decimal)cam.X, (decimal)cam.Y, (decimal)cam.Z);

            if (!opts.Wireframe)
            {
                _mapObject3DShader.Bind(opts);
                _mapObject3DShader.SelectionTransform        = _selectionTransform;
                _mapObject3DShader.SelectionColourMultiplier = Document.Map.HideFaceMask &&
                                                               Document.Selection.InFaceSelection
                                                                   ? new Vector4(1, 1, 1, 1)
                                                                   : new Vector4(1, 0.5f, 0.5f, 1);

                // Render textured polygons
                _array.RenderTextured(context.Context);

                // Render textured models
                if (!Sledge.Settings.View.DisableModelRendering)
                {
                    foreach (var tuple in _models)
                    {
                        var arr    = _modelArrays[tuple.Item2];
                        var origin = tuple.Item1.Origin;
                        if (tuple.Item1.HideDistance() <= (location - origin).VectorMagnitude())
                        {
                            continue;
                        }

                        var angles = tuple.Item1.EntityData.GetPropertyCoordinate("angles", Coordinate.Zero);
                        angles = new Coordinate(-DMath.DegreesToRadians(angles.Z), DMath.DegreesToRadians(angles.X),
                                                -DMath.DegreesToRadians(angles.Y));
                        if (tuple.Item1.IsSelected)
                        {
                            origin *= _selectionTransformMat;
                            // TODO: rotation/angles
                        }
                        var tform = Matrix.Rotation(Quaternion.EulerAngles(angles)).Translate(origin);
                        _mapObject3DShader.Transformation = tform.ToGLSLMatrix4();
                        arr.RenderTextured(context.Context);
                    }
                    _mapObject3DShader.Transformation = Matrix4.Identity;
                }

                // Render untextured polygons
                _mapObject3DShader.IsTextured = false;
                _array.RenderUntextured(context.Context, location);

                // todo Render sprites

                _mapObject3DShader.Unbind();
            }

            // Render wireframe
            _mapObject2DShader.Bind(opts);
            _mapObject2DShader.SelectedColour = new Vector4(1, 1, 0, 1);

            if (opts.Wireframe)
            {
                _mapObject2DShader.SelectedOnly       = false;
                _mapObject2DShader.SelectionTransform = _selectionTransform;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            if (!Document.Selection.InFaceSelection || !Document.Map.HideFaceMask)
            {
                _mapObject2DShader.SelectedOnly       = true;
                _mapObject2DShader.SelectionTransform = Matrix4.Identity;
                _array.RenderWireframe(context.Context);
                _decalArray.RenderWireframe(context.Context);
            }

            _mapObject2DShader.Unbind();

            if (!opts.Wireframe)
            {
                // Render transparent
                _mapObject3DShader.Bind(opts);
                _decalArray.RenderTransparent(context.Context, location);
                _array.RenderTransparent(context.Context, x => _mapObject3DShader.IsTextured = x && opts.Textured, location);
                _mapObject3DShader.Unbind();
            }
        }