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); } }
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); }