Ejemplo n.º 1
0
 protected override void Load()
 {
     Title = "Thn Player";
     LibreLancer.Shaders.AllShaders.Compile();
     guiHelper = new ImGuiHelper(this);
     FileDialog.RegisterParent(this);
     Viewport = new ViewportManager(this.RenderState);
     Viewport.Push(0, 0, 800, 600);
     Billboards = new Billboards();
     Nebulae    = new NebulaVertices();
     Resources  = new GameResourceManager(this);
     Renderer2D = new Renderer2D(this.RenderState);
     Audio      = new AudioManager(this);
     Sounds     = new SoundManager(Audio);
     Services.Add(Sounds);
     Services.Add(Billboards);
     Services.Add(Nebulae);
     Services.Add(Resources);
     Services.Add(Renderer2D);
     fontMan = new FontManager();
     fontMan.ConstructDefaultFonts();
     Services.Add(fontMan);
     Services.Add(new GameConfig());
     Typewriter = new Typewriter(this);
     Services.Add(Typewriter);
     Keyboard.KeyDown += KeyboardOnKeyDown;
 }
Ejemplo n.º 2
0
        protected override void Load()
        {
            Title     = "LancerEdit";
            guiHelper = new ImGuiHelper(this);
            Audio     = new AudioManager(this);
            FileDialog.RegisterParent(this);
            Viewport = new ViewportManager(RenderState);
            var texturefilters = new List <string>(defaultFilters);

            if (RenderState.MaxAnisotropy > 0)
            {
                anisotropyLevels = RenderState.GetAnisotropyLevels();
                foreach (var lvl in anisotropyLevels)
                {
                    texturefilters.Add(string.Format("Anisotropic {0}x", lvl));
                }
            }
            filters     = texturefilters.ToArray();
            Resources   = new ResourceManager(this);
            Commands    = new CommandBuffer();
            Billboards  = new Billboards();
            Polyline    = new PolylineRender(Commands);
            DebugRender = new PhysicsDebugRenderer();
            Viewport.Push(0, 0, 800, 600);
        }
Ejemplo n.º 3
0
        Vector3 Project(Billboards billboards, Vector3 pt)
        {
            var mvp = billboards.Camera.ViewProjection;
            var pt4 = (mvp * new Vector4(pt, 1));

            pt4 /= pt4.W;
            return(pt4.Xyz);
        }
Ejemplo n.º 4
0
 protected override void Load()
 {
     Title     = "LancerEdit";
     guiHelper = new ImGuiHelper(this);
     Audio     = new AudioManager(this);
     FileDialog.RegisterParent(this);
     Viewport    = new ViewportManager(RenderState);
     Resources   = new ResourceManager(this);
     Commands    = new CommandBuffer();
     Billboards  = new Billboards();
     Polyline    = new PolylineRender(Commands);
     DebugRender = new PhysicsDebugRenderer();
     Viewport.Push(0, 0, 800, 600);
 }
Ejemplo n.º 5
0
        protected override void Load()
        {
            Title     = "LancerEdit";
            guiHelper = new ImGuiHelper(this);
            Audio     = new AudioManager(this);
            FileDialog.RegisterParent(this);
            Viewport = new ViewportManager(RenderState);
            var texturefilters = new List <string>(defaultFilters);

            if (RenderState.MaxAnisotropy > 0)
            {
                anisotropyLevels = RenderState.GetAnisotropyLevels();
                foreach (var lvl in anisotropyLevels)
                {
                    texturefilters.Add(string.Format("Anisotropic {0}x", lvl));
                }
            }
            filters     = texturefilters.ToArray();
            Resources   = new ResourceManager(this);
            Commands    = new CommandBuffer();
            Billboards  = new Billboards();
            Polyline    = new PolylineRender(Commands);
            DebugRender = new PhysicsDebugRenderer();
            Viewport.Push(0, 0, 800, 600);
            Keyboard.KeyDown += Keyboard_KeyDown;

            //TODO: Icon-setting code very messy
            int w, h, c;
            var stream = typeof(MainWindow).Assembly.GetManifestResourceStream("LancerEdit.reactor_64.png");
            var bytes  = new byte[stream.Length];

            stream.Read(bytes, 0, (int)stream.Length);
            StbSharp.Stb.stbi_set_flip_vertically_on_load(0);
            var img = StbSharp.Stb.stbi_load_from_memory(bytes, out w, out h, out c, StbSharp.Stb.STBI_rgb_alpha);

            StbSharp.Stb.stbi_set_flip_vertically_on_load(1);
            SetWindowIcon(w, h, img);

            //Open passed in files!
            if (InitOpenFile != null)
            {
                foreach (var f in InitOpenFile)
                {
                    OpenFile(f);
                }
            }
        }
 public void Draw(PolylineRender polyline, Billboards billboards, PhysicsDebugRenderer debug)
 {
     for (int i = 0; i < Particles.Length; i++)
     {
         if (!Particles[i].Active)
         {
             continue;
         }
         var inst = Particles[i].Instance;
         if (inst.NodeEnabled(Particles[i].Appearance))
         {
             var app = (FxAppearance)Particles[i].Appearance.Node;
             app.Debug = debug;
             app.Draw(ref Particles[i], (float)inst.LastTime, (float)inst.GlobalTime, Particles[i].Appearance, inst.Resources, billboards, ref inst.DrawTransform, inst.DrawSParam);
         }
     }
 }
Ejemplo n.º 7
0
        protected override void Load()
        {
            Title     = "LancerEdit";
            guiHelper = new ImGuiHelper(this);
            guiHelper.PauseWhenUnfocused = Config.PauseWhenUnfocused;
            Audio = new AudioManager(this);
            FileDialog.RegisterParent(this);
            Viewport = new ViewportManager(RenderState);
            InitOptions();
            Resources   = new GameResourceManager(this);
            Commands    = new CommandBuffer();
            Billboards  = new Billboards();
            Polyline    = new PolylineRender(Commands);
            DebugRender = new PhysicsDebugRenderer();
            Viewport.Push(0, 0, 800, 600);
            Keyboard.KeyDown += Keyboard_KeyDown;

            //TODO: Icon-setting code very messy
            int w, h, c;
            var stream = typeof(MainWindow).Assembly.GetManifestResourceStream("LancerEdit.reactor_64.png");
            var bytes  = new byte[stream.Length];

            stream.Read(bytes, 0, (int)stream.Length);
            StbSharp.Stb.stbi_set_flip_vertically_on_load(0);
            var img = StbSharp.Stb.stbi_load_from_memory(bytes, out w, out h, out c, StbSharp.Stb.STBI_rgb_alpha);

            StbSharp.Stb.stbi_set_flip_vertically_on_load(1);
            SetWindowIcon(w, h, img);

            //Open passed in files!
            if (InitOpenFile != null)
            {
                foreach (var f in InitOpenFile)
                {
                    OpenFile(f);
                }
            }

            Renderer2D = new Renderer2D(RenderState);
            RichText   = Renderer2D.CreateRichTextEngine();
            Services.Add(Renderer2D);
            Fonts = new FontManager(this);
            Fonts.ConstructDefaultFonts();
            Services.Add(Fonts);
        }
Ejemplo n.º 8
0
        protected override void Load()
        {
            Title     = "System Viewer";
            guiHelper = new ImGuiHelper(this);
            FileDialog.RegisterParent(this);
            Viewport = new ViewportManager(this.RenderState);
            Viewport.Push(0, 0, 800, 600);
            Billboards = new Billboards();
            Nebulae    = new NebulaVertices();
            Resources  = new ResourceManager(this);
            Renderer2D = new Renderer2D(this.RenderState);

            Services.Add(Billboards);
            Services.Add(Nebulae);
            Services.Add(Resources);
            Services.Add(Renderer2D);
            Services.Add(new GameConfig());
        }
Ejemplo n.º 9
0
 public AleViewer(string title, string name, AleFile ale, MainWindow main)
 {
     plib        = new ParticleLibrary(main.Resources, ale);
     effectNames = new string[plib.Effects.Count];
     for (int i = 0; i < effectNames.Length; i++)
     {
         effectNames[i] = string.Format("{0} (0x{1:X})", plib.Effects[i].Name, plib.Effects[i].CRC);
     }
     Title       = title;
     this.name   = name;
     this.rstate = main.RenderState;
     vps         = main.Viewport;
     buffer      = main.Commands;
     billboards  = main.Billboards;
     polyline    = main.Polyline;
     debug       = main.DebugRender;
     SetupRender(0);
 }
 public void Draw(PolylineRender polyline, Billboards billboards, PhysicsDebugRenderer debug, Matrix4 transform, float sparam)
 {
     DrawTransform = transform;
     DrawSParam    = sparam;
     if (Pool == null)
     {
         return;
     }
     DrawTransform = transform;
     DrawSParam    = sparam;
     foreach (var kv in BeamAppearances)
     {
         if (NodeEnabled(kv.Key))
         {
             var app = (FLBeamAppearance)kv.Key.Node;
             app.DrawBeamApp(polyline, kv.Value, (float)globaltime, kv.Key, this, Effect.ResourceManager, billboards, ref transform, sparam);
         }
     }
 }
Ejemplo n.º 11
0
 protected override void Load()
 {
     Title = "System Viewer";
     LibreLancer.Shaders.AllShaders.Compile();
     guiHelper = new ImGuiHelper(this, DpiScale);
     FileDialog.RegisterParent(this);
     RenderContext.PushViewport(0, 0, 800, 600);
     Billboards = new Billboards();
     Nebulae    = new NebulaVertices();
     Resources  = new GameResourceManager(this);
     RichText   = RenderContext.Renderer2D.CreateRichTextEngine();
     Services.Add(Billboards);
     Services.Add(Nebulae);
     Services.Add(Resources);
     fontMan = new FontManager();
     fontMan.ConstructDefaultFonts();
     Services.Add(fontMan);
     Services.Add(new GameConfig());
 }
Ejemplo n.º 12
0
 protected override void Load()
 {
     Title     = "System Viewer";
     guiHelper = new ImGuiHelper(this);
     FileDialog.RegisterParent(this);
     Viewport = new ViewportManager(this.RenderState);
     Viewport.Push(0, 0, 800, 600);
     Billboards = new Billboards();
     Nebulae    = new NebulaVertices();
     Resources  = new GameResourceManager(this);
     Renderer2D = new Renderer2D(this.RenderState);
     RichText   = Renderer2D.CreateRichTextEngine();
     Services.Add(Billboards);
     Services.Add(Nebulae);
     Services.Add(Resources);
     Services.Add(Renderer2D);
     fontMan = new FontManager(this);
     fontMan.ConstructDefaultFonts();
     Services.Add(fontMan);
     Services.Add(new GameConfig());
 }
Ejemplo n.º 13
0
 public void Draw(PolylineRender polyline, Billboards billboards, PhysicsDebugRenderer debug, Matrix4 transform, float sparam)
 {
     for (int i = 0; i < Particles.Length; i++)
     {
         if (!Particles[i].Active)
         {
             continue;
         }
         if (DrawEnabled(Particles[i].Appearance))
         {
             Particles[i].Appearance.Debug = debug;
             Particles[i].Appearance.Draw(ref Particles[i], (float)globaltime, Effect, Effect.ResourceManager, billboards, ref transform, sparam);
         }
     }
     foreach (var kv in BeamAppearances)
     {
         if (DrawEnabled(kv.Key))
         {
             kv.Key.DrawBeamApp(polyline, kv.Value, (float)globaltime, Effect, this, Effect.ResourceManager, billboards, ref transform, sparam);
         }
     }
 }
Ejemplo n.º 14
0
 public AleViewer(string title, string name, AleFile ale, MainWindow main)
 {
     plib        = new ParticleLibrary(main.Resources, ale);
     pool        = new ParticleEffectPool();
     effectNames = new string[plib.Effects.Count];
     for (int i = 0; i < effectNames.Length; i++)
     {
         effectNames[i] = string.Format("{0} (0x{1:X})", plib.Effects[i].Name, plib.Effects[i].CRC);
     }
     Title       = title;
     this.name   = name;
     this.rstate = main.RenderState;
     aleViewport = new Viewport3D(main);
     aleViewport.DefaultOffset    =
         aleViewport.CameraOffset = new Vector3(0, 0, 200);
     aleViewport.ModelScale       = 25;
     buffer     = main.Commands;
     billboards = main.Billboards;
     polyline   = main.Polyline;
     debug      = main.DebugRender;
     SetupRender(0);
 }
Ejemplo n.º 15
0
 protected override void Load()
 {
     Title     = "LancerEdit";
     guiHelper = new ImGuiHelper(this);
     guiHelper.PauseWhenUnfocused = Config.PauseWhenUnfocused;
     Audio = new AudioManager(this);
     FileDialog.RegisterParent(this);
     Viewport    = new ViewportManager(RenderState);
     options     = new OptionsWindow(this);
     Resources   = new GameResourceManager(this);
     Commands    = new CommandBuffer();
     Billboards  = new Billboards();
     Polyline    = new PolylineRender(Commands);
     DebugRender = new PhysicsDebugRenderer();
     Viewport.Push(0, 0, 800, 600);
     Keyboard.KeyDown += Keyboard_KeyDown;
     //TODO: Icon-setting code very messy
     using (var stream = typeof(MainWindow).Assembly.GetManifestResourceStream("LancerEdit.reactor_64.png"))
     {
         var icon = LibreLancer.ImageLib.Generic.BytesFromStream(stream);
         SetWindowIcon(icon.Width, icon.Height, icon.Data);
     }
     //Open passed in files!
     if (InitOpenFile != null)
     {
         foreach (var f in InitOpenFile)
         {
             OpenFile(f);
         }
     }
     Renderer2D = new Renderer2D(RenderState);
     RichText   = Renderer2D.CreateRichTextEngine();
     Services.Add(Renderer2D);
     Fonts = new FontManager();
     Fonts.ConstructDefaultFonts();
     Services.Add(Fonts);
     gen3dbDlg = new CommodityIconDialog(this);
 }
Ejemplo n.º 16
0
        public override void Draw(ref Particle particle, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var time    = particle.TimeAlive / particle.LifeSpan;
            var node_tr = GetTranslation(reference, transform, sparam, time);
            var src_pos = particle.Position;
            var l       = Length.GetValue(sparam, time);
            var w       = Width.GetValue(sparam, time);
            var sc      = Scale.GetValue(sparam, time);

            if (!CenterOnPos)
            {
                var nd = particle.Normal.Normalized();
                src_pos += nd * (l * sc * 0.25f);
            }
            var       p = node_tr.Transform(src_pos);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globaltime, sparam, ref particle, out tex, out tl, out tr, out bl, out br);
            var c  = Color.GetValue(sparam, time);
            var a  = Alpha.GetValue(sparam, time);
            var p2 = node_tr.Transform(src_pos + (particle.Normal * 20));
            var n  = (p2 - p).Normalized();

            billboards.DrawRectAppearance(
                tex,
                p,
                new Vector2(l, w) * sc * 0.5f,
                new Color4(c, a),
                tl,
                tr,
                bl,
                br,
                n,
                Rotate == null ? 0f : Rotate.GetValue(sparam, time),
                SortLayers.OBJECT,
                BlendInfo
                );

            /*var p1_proj = Project(billboards, p);
             * var p2_proj = Project(billboards, p2);
             *
             * var px1 = new Vector2(
             *      (p1_proj.X + 1) / 2 * 1024,
             *      (1 - p1_proj.Y) / 2 * 768);
             * var px2 = new Vector2(
             *      (p2_proj.X + 1) / 2 * 1024,
             *      (1 - p2_proj.Y) / 2 * 1024
             * );
             *
             * var angle = (float)Math.Atan2(px2.Y - px1.Y, px2.X - px1.X);*/

            /*var src_pos2 = src_pos + (particle.Normal * 20);
             * var angle = (float)Math.Atan2(src_pos2.Y - src_pos.Y, src_pos2.Z - src_pos.Z);
             * var angle_deg = MathHelper.RadiansToDegrees(angle);
             * billboards.Draw(
             *      tex,
             *      p,
             *      new Vector2(l, w) * sc * 0.5f,
             *      new Color4(c, a),
             *      tl,
             *      tr,
             *      bl,
             *      br,
             *      angle, //Rotate == null ? 0f : Rotate.GetValue(sparam, time),
             *      SortLayers.OBJECT,
             *      BlendInfo
             * );*/
            if (DrawNormals)
            {
                Debug.DrawLine(p - (n * 8), p + (n * 8));
            }
        }
Ejemplo n.º 17
0
        public override void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var time    = particle.TimeAlive / particle.LifeSpan;
            var node_tr = GetTranslation(reference, transform, sparam, time);

            var       p = node_tr.Transform(particle.Position);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globaltime, sparam, ref particle, out tex, out tl, out tr, out bl, out br);
            var c = Color.GetValue(sparam, time);
            var a = Alpha.GetValue(sparam, time);

            var p2 = node_tr.Transform(particle.Position + particle.Normal);
            //var n = (p - p2).Normalized();
            var n = Vector3.UnitZ;

            /*billboards.DrawPerspective(
             *      tex,
             *      p,
             *      new Vector2(Width.GetValue(sparam, time), Height.GetValue(sparam, time)),
             *      new Color4(c, a),
             *      tl,
             *      tr,
             *      bl,
             *      br,
             *      n,
             * Rotate == null ? 0f : MathHelper.DegreesToRadians(Rotate.GetValue(sparam, time)),
             *      SortLayers.OBJECT,
             *      BlendInfo
             * );*/
        }
Ejemplo n.º 18
0
        public override void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var       time    = particle.TimeAlive / particle.LifeSpan;
            var       node_tr = GetAttachment(reference, transform);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globaltime, sparam, ref particle, out tex, out tl, out tr, out bl, out br);
            var c = Color.GetValue(sparam, time);
            var a = Alpha.GetValue(sparam, time);
            var q = particle.Orientation * Transform.GetDeltaRotation(sparam, lasttime, globaltime);

            particle.Orientation = q;
            var mat = Matrix4.CreateFromQuaternion(q);
            var n   = (transform * new Vector4(particle.Normal.Normalized(), 0)).Xyz.Normalized();

            billboards.DrawPerspective(
                tex,
                VectorMath.Transform(particle.Position, transform),
                mat,
                new Vector2(Size.GetValue(sparam, time)),
                new Color4(c, a),
                tl,
                tr,
                bl,
                br,
                n,
                Rotate == null ? 0f : MathHelper.DegreesToRadians(Rotate.GetValue(sparam, time)),
                SortLayers.OBJECT,
                BlendInfo
                );

            if (DrawNormals)
            {
                //Debug.DrawLine(p - (n * 100), p + (n * 100));
            }
        }
Ejemplo n.º 19
0
 public virtual void Draw(ref Particle particle, float globaltime, ParticleEffect effect, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
 {
 }
Ejemplo n.º 20
0
        public override void Draw(ref Particle particle, float globaltime, ParticleEffect effect, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var time    = particle.TimeAlive / particle.LifeSpan;
            var node_tr = GetTranslation(effect, transform, sparam, time);

            var       p = node_tr.Transform(particle.Position);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globaltime, sparam, ref particle, out tex, out tl, out tr, out bl, out br);
            var c = Color.GetValue(sparam, time);
            var a = Alpha.GetValue(sparam, time);

            var p2 = node_tr.Transform(particle.Position + particle.Normal);
            var n  = (p - p2).Normalized();

            billboards.DrawPerspective(
                tex,
                p,
                new Vector2(Size.GetValue(sparam, time)),
                new Color4(c, a),
                tl,
                tr,
                bl,
                br,
                n,
                Rotate == null ? 0f : Rotate.GetValue(sparam, time),
                SortLayers.OBJECT,
                BlendInfo
                );

            if (DrawNormals)
            {
                Debug.DrawLine(p - (n * 8), p + (n * 8));
            }
        }
Ejemplo n.º 21
0
 public override void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
 {
     //Empty on purpose. Individual particles don't draw
 }
Ejemplo n.º 22
0
        internal void Refresh(bool add = false, bool force = false)
        {
            if (!force)
            {
                switch (this.QueryType)
                {
                case ContentType.Books:
                    if (!Books.Finished)
                    {
                        return;
                    }
                    break;

                case ContentType.Billboards:
                    if (!Billboards.Finished)
                    {
                        return;
                    }
                    break;

                case ContentType.ReadLists:
                    if (!ReadLists.Finished)
                    {
                        return;
                    }
                    break;

                default:
                    return;
                }
            }

            if (add)
            {
                switch (this.QueryType)
                {
                case ContentType.Books:
                    Books.AddBooks();
                    break;

                case ContentType.Billboards:
                    Billboards.Reload(true);
                    break;

                case ContentType.ReadLists:
                    ReadLists.Reload(true);
                    break;

                default:
                    return;
                }
            }
            else
            {
                switch (this.QueryType)
                {
                case ContentType.Books:
                    _ = Books.ReloadBooks(this.ToQueryObject(), "Search result of " + this.QueryText);
                    break;

                case ContentType.Billboards:
                    Billboards.Reload(this.ToQueryObject());
                    break;

                case ContentType.ReadLists:
                    ReadLists.Reload(this.ToQueryObject());
                    break;

                default:
                    return;
                }
            }
        }
Ejemplo n.º 23
0
 public virtual void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
 {
 }
Ejemplo n.º 24
0
        public override void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var time    = particle.TimeAlive / particle.LifeSpan;
            var node_tr = GetAttachment(reference, transform);
            var src_pos = particle.Position;
            var l       = Length.GetValue(sparam, time);
            var w       = Width.GetValue(sparam, time);
            var sc      = Scale.GetValue(sparam, time);

            if (!CenterOnPos)
            {
                var nd = particle.Normal.Normalized();
                src_pos += nd * (l * sc * 0.25f);
            }
            var       p = node_tr.Transform(src_pos);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globaltime, sparam, ref particle, out tex, out tl, out tr, out bl, out br);
            var c  = Color.GetValue(sparam, time);
            var a  = Alpha.GetValue(sparam, time);
            var p2 = node_tr.Transform(src_pos + (particle.Normal * 20));
            //var n = (p2 - p).Normalized();
            var n = (transform * new Vector4(particle.Normal.Normalized(), 0)).Xyz.Normalized();

            billboards.DrawRectAppearance(
                tex,
                p,
                new Vector2(l, w) * sc * 0.5f,
                new Color4(c, a),
                tl,
                tr,
                bl,
                br,
                n,
                Rotate == null ? 0f : MathHelper.DegreesToRadians(Rotate.GetValue(sparam, time)),
                SortLayers.OBJECT,
                BlendInfo
                );
            if (DrawNormals)
            {
                Debug.DrawLine(p - (n * 12), p + (n * 12));
            }
        }
Ejemplo n.º 25
0
        public unsafe void DrawBeamApp(PolylineRender poly, LineBuffer points, float globalTime, NodeReference reference, ParticleEffectInstance instance, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            //TODO: Cross-plane not showing
            //TODO: In some cases particles are going backwards? (Broken emitter or LineBuffer)
            //TODO: See if z sorting can be better for Polyline
            //TODO: Implement FLBeamAppearance properties
            if (points.Count() < 2)
            {
                return;
            }
            //Get only active indices, alloc on stack for 0 GC pressure
            //int* indices = stackalloc int[512];
            var indices   = new int[512];
            var particles = new Particle[512];

            for (int i = 0; i < 512; i++)
            {
                indices[i] = -1;
            }
            int ptCount = 0;

            for (int i = 0; i < points.Count(); i++)
            {
                if (points[i].Active)
                {
                    indices[ptCount++] = points[i].ParticleIndex;
                }
            }
            if (ptCount < 2)
            {
                return;
            }
            for (int i = 0; i < ptCount; i++)
            {
                particles[i] = instance.Particles[indices[i]];
            }
            for (int i = 1; i < ptCount; i++)
            {
                if (particles[i - 1].TimeAlive > particles[i].TimeAlive)
                {
                    Console.WriteLine("bad order");
                }
            }
            var       node_tr = GetAttachment(reference, transform);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, globalTime, sparam, ref instance.Particles[indices[0]], out tex, out tl, out tr, out bl, out br);
            //Sorting hack kinda
            var z = RenderHelpers.GetZ(billboards.Camera.Position, node_tr.Transform(Vector3.Zero));

            for (int j = 0; j < 2; j++)             //two planes
            {
                poly.StartLine(tex, BlendInfo);
                bool    odd = true;
                Vector3 dir = Vector3.Zero;

                for (int i = 0; i < ptCount; i++)
                {
                    var pos = node_tr.Transform(instance.Particles[indices[i]].Position);
                    if (i + 1 < ptCount)
                    {
                        var pos2     = node_tr.Transform(instance.Particles[indices[i + 1]].Position);
                        var forward  = (pos2 - pos).Normalized();
                        var toCamera = (billboards.Camera.Position - pos).Normalized();
                        var up       = Vector3.Cross(toCamera, forward);
                        up.Normalize();
                        dir = up;
                        if (j == 1)
                        {
                            //Broken? Doesn't show up
                            var right = Vector3.Cross(up, forward).Normalized();
                            dir = right;
                        }
                    }
                    var time = instance.Particles[indices[i]].TimeAlive / instance.Particles[indices[i]].LifeSpan;
                    var w    = Width.GetValue(sparam, time);
                    poly.AddPoint(
                        pos + (dir * w / 2),
                        pos - (dir * w / 2),
                        odd ? tl : bl,
                        odd ? tr : br,
                        new Color4(
                            Color.GetValue(sparam, time),
                            Alpha.GetValue(sparam, time)
                            )
                        );
                    odd = !odd;
                }
                poly.FinishLine(z);
            }
        }
Ejemplo n.º 26
0
        public override void Draw(ref Particle particle, float lasttime, float globaltime, NodeReference reference, ResourceManager res, Billboards billboards, ref Matrix4 transform, float sparam)
        {
            var time    = particle.TimeAlive / particle.LifeSpan;
            var node_tr = GetTranslation(reference, transform, sparam, time);

            var       p = node_tr.Transform(particle.Position);
            Texture2D tex;
            Vector2   tl, tr, bl, br;

            HandleTexture(res, sparam, globaltime, ref particle, out tex, out tl, out tr, out bl, out br);
            var c = Color.GetValue(sparam, time);
            var a = Alpha.GetValue(sparam, time);

            billboards.Draw(
                tex,
                p,
                new Vector2(Size.GetValue(sparam, time)) * 2,
                new Color4(c, a),
                tl,
                tr,
                bl,
                br,
                Rotate == null ? 0f : MathHelper.DegreesToRadians(Rotate.GetValue(sparam, time)),
                SortLayers.OBJECT,
                BlendInfo
                );
        }
Ejemplo n.º 27
0
        Vector3 Project(Billboards billboards, Vector3 pt)
        {
            var mvp = billboards.Camera.ViewProjection;

            return(Vector3.Transform(pt, mvp).Normalized());
        }