示例#1
0
        internal override void VRender(Cv_Renderer renderer)
        {
            var particleComponent = (Cv_ParticleEmitterComponent)Component;
            var scene             = CaravelApp.Instance.Scene;

            particleComponent.DrawSelectionHighlight(renderer);

            if (!particleComponent.Visible || particleComponent.Texture == null || particleComponent.Texture == "")
            {
                return;
            }

            Cv_RawTextureResource resource = Cv_ResourceManager.Instance.GetResource <Cv_RawTextureResource>(particleComponent.Texture, particleComponent.Owner.ResourceBundle);
            var tex = resource.GetTexture().Texture;

            foreach (var particle in m_Particles)
            {
                if (!particle.IsAlive)
                {
                    break;
                }

                var layerDepth = (int)particle.Transform.Position.Z;
                layerDepth = (layerDepth % Cv_Renderer.MaxLayers);
                var layer = layerDepth / (float)Cv_Renderer.MaxLayers;

                var newColorVec = EaseValue(new Vector4(particleComponent.Color.R, particleComponent.Color.G, particleComponent.Color.B, particleComponent.Color.A),
                                            new Vector4(particleComponent.FinalColor.R, particleComponent.FinalColor.G, particleComponent.FinalColor.B, particleComponent.FinalColor.A),
                                            particleComponent.ParticleLifeTime,
                                            particleComponent.ParticleLifeTime - particle.TTL,
                                            particleComponent.ColorChangePoint);
                var newColor = new Color((int)newColorVec.X, (int)newColorVec.Y, (int)newColorVec.Z, (int)newColorVec.W);

                var pos   = particle.Transform.Position;
                var scale = particle.Transform.Scale;

                var camTransf = scene.Camera.GetViewTransform(renderer.VirtualWidth, renderer.VirtualHeight, Cv_Transform.Identity);

                if (particleComponent.Parallax != 1 && particleComponent.Parallax != 0)
                {
                    var zoomFactor = ((1 + ((scene.Camera.Zoom - 1) * particleComponent.Parallax)) / scene.Camera.Zoom);
                    scale = scale * zoomFactor; //Magic formula
                    pos  += ((particleComponent.Parallax - 1) * new Vector3(camTransf.Position.X, camTransf.Position.Y, 0));
                    pos  += ((new Vector3(scene.Transform.Position.X, scene.Transform.Position.Y, 0)) * (1 - zoomFactor) * (particleComponent.Parallax - 1));
                }

                var noCamera = particleComponent.Parallax == 0;

                renderer.Draw(tex, new Rectangle((int)(pos.X),
                                                 (int)(pos.Y),
                                                 (int)tex.Width,
                                                 (int)tex.Height),
                              null,
                              newColor,
                              particle.Transform.Rotation,
                              scale,
                              new Vector2(tex.Width * 0.5f, tex.Height * 0.5f),
                              SpriteEffects.None,
                              layer, noCamera);
            }
        }
示例#2
0
        internal override void VRender(Cv_Renderer renderer)
        {
            var spriteComponent = (Cv_SpriteComponent)Component;
            var scene           = CaravelApp.Instance.Scene;

            var pos   = scene.Transform.Position;
            var rot   = scene.Transform.Rotation;
            var scale = scene.Transform.Scale;


            var camTransf = scene.Camera.GetViewTransform(renderer.VirtualWidth, renderer.VirtualHeight, Cv_Transform.Identity);

            if (spriteComponent.Parallax != 1 && spriteComponent.Parallax != 0)
            {
                var zoomFactor = ((1 + ((scene.Camera.Zoom - 1) * spriteComponent.Parallax)) / scene.Camera.Zoom);
                scale = scale * zoomFactor; //Magic formula
                pos  += ((spriteComponent.Parallax - 1) * new Vector3(camTransf.Position.X, camTransf.Position.Y, 0));
                pos  += ((new Vector3(scene.Transform.Position.X, scene.Transform.Position.Y, 0)) * (1 - zoomFactor) * (spriteComponent.Parallax - 1));
            }

            var noCamera = spriteComponent.Parallax == 0;

            spriteComponent.DrawSelectionHighlight(renderer);

            if (!spriteComponent.Visible || spriteComponent.Texture == null || spriteComponent.Texture == "")
            {
                return;
            }

            Cv_RawTextureResource resource = Cv_ResourceManager.Instance.GetResource <Cv_RawTextureResource>(spriteComponent.Texture, spriteComponent.Owner.ResourceBundle);

            var tex = resource.GetTexture().Texture;

            var frameW = tex.Width / spriteComponent.FrameX;
            var frameH = tex.Height / spriteComponent.FrameY;
            var x      = (spriteComponent.CurrentFrame % spriteComponent.FrameX) * frameW;
            var y      = (spriteComponent.CurrentFrame / spriteComponent.FrameX) * frameH;

            var layerDepth = (int)Parent.Position.Z;

            layerDepth = layerDepth % Cv_Renderer.MaxLayers;

            var spriteEffect = SpriteEffects.None;

            if (spriteComponent.Mirrored)
            {
                spriteEffect = SpriteEffects.FlipHorizontally;
            }

            renderer.Draw(tex, new Rectangle((int)pos.X,
                                             (int)pos.Y,
                                             (int)(spriteComponent.Width),
                                             (int)(spriteComponent.Height)),
                          new Rectangle(x, y, frameW, frameH),
                          spriteComponent.Color,
                          rot,
                          scale,
                          new Vector2(frameW * scene.Transform.Origin.X, frameH * scene.Transform.Origin.Y),
                          spriteEffect,
                          layerDepth / (float)Cv_Renderer.MaxLayers, noCamera);
        }