/// <summary> /// Add a new texture on top of the original ref 'texture'. /// </summary> /// <param name="original"></param> /// <param name="position"></param> /// <param name="to_add"></param> public static void AddToTexture(ref Texture2D2 original, Vector2 position, Sprite2 to_add) { position += new Vector2(DRAW_PAD, DRAW_PAD); // Perform operation for natural Color[] colors1 = original.natural.GetPixels((int)(position.x * PIXELS_PER_UNIT), (int)(position.y * PIXELS_PER_UNIT), to_add.natural.texture.width, to_add.natural.texture.height); Color[] colors2 = to_add.natural.texture.GetPixels(); Color[] new_colors = new Color[colors1.Length]; for (int i = 0; i < new_colors.Length; i++) { float r = Mathf.Clamp(colors1[i].r * (1 - colors2[i].a) + colors2[i].r * colors2[i].a, 0, 1); float g = Mathf.Clamp(colors1[i].g * (1 - colors2[i].a) + colors2[i].g * colors2[i].a, 0, 1); float b = Mathf.Clamp(colors1[i].b * (1 - colors2[i].a) + colors2[i].b * colors2[i].a, 0, 1); float a = Mathf.Clamp(colors1[i].a + colors2[i].a, 0, 1); new_colors[i] = new Color(r, g, b, a); } original.natural.SetPixels((int)(position.x * PIXELS_PER_UNIT), (int)(position.y * PIXELS_PER_UNIT), to_add.natural.texture.width, to_add.natural.texture.height, new_colors); // Perform operation for occluded colors1 = original.occluded.GetPixels((int)(position.x * PIXELS_PER_UNIT), (int)(position.y * PIXELS_PER_UNIT), to_add.occluded.texture.width, to_add.occluded.texture.height); colors2 = to_add.occluded.texture.GetPixels(); new_colors = new Color[colors1.Length]; for (int i = 0; i < new_colors.Length; i++) { float r = Mathf.Clamp(colors1[i].r * (1 - colors2[i].a) + colors2[i].r * colors2[i].a, 0, 1); float g = Mathf.Clamp(colors1[i].g * (1 - colors2[i].a) + colors2[i].g * colors2[i].a, 0, 1); float b = Mathf.Clamp(colors1[i].b * (1 - colors2[i].a) + colors2[i].b * colors2[i].a, 0, 1); float a = Mathf.Clamp(colors1[i].a + colors2[i].a, 0, 1); new_colors[i] = new Color(r, g, b, a); } original.occluded.SetPixels((int)(position.x * PIXELS_PER_UNIT), (int)(position.y * PIXELS_PER_UNIT), to_add.occluded.texture.width, to_add.occluded.texture.height, new_colors); }
public Projectile(ComponentManager manager, Vector3 position, Vector3 initialVelocity, Health.DamageAmount damage, float size, string asset, string hitParticles, string hitNoise, Body target, bool animated = false, bool singleSprite = false) : base(manager, "Projectile", Matrix.CreateTranslation(position), new Vector3(size, size, size), Vector3.One, 1.0f, 1.0f, 1.0f, 1.0f, new Vector3(0, -10, 0), OrientMode.Fixed, false) { this.AllowPhysicsSleep = false; Target = target; HitAnimation = null; IsSleeping = false; Velocity = initialVelocity; Orientation = OrientMode.LookAt; CollideMode = Physics.CollisionMode.None; var spriteSheet = new SpriteSheet(asset); if (animated) { spriteSheet.FrameWidth = Math.Min(spriteSheet.FrameWidth, spriteSheet.FrameHeight); spriteSheet.FrameHeight = spriteSheet.FrameWidth; } Sprite = AddChild(new AnimatedSprite(Manager, "Sprite", Matrix.CreateRotationY((float)Math.PI * 0.5f), false) { OrientationType = AnimatedSprite.OrientMode.Fixed }) as AnimatedSprite; Sprite.AddAnimation(AnimationLibrary.CreateSimpleAnimation(asset)); if (singleSprite) { this.Sprite.OrientationType = AnimatedSprite.OrientMode.Spherical; } if (!singleSprite) { Sprite2 = Sprite.AddChild(new AnimatedSprite(Manager, "Sprite2", Matrix.CreateRotationX((float)Math.PI * 0.5f), false) { OrientationType = AnimatedSprite.OrientMode.Fixed }) as AnimatedSprite; Sprite2.AddAnimation(AnimationLibrary.CreateSimpleAnimation(asset)); } Damage = damage; HitParticles = AddChild(new ParticleTrigger(hitParticles, manager, "Hit Particles", Matrix.Identity, new Vector3(size * 0.5f, size * 0.5f, size * 0.5f), Vector3.Zero) { TriggerOnDeath = true, SoundToPlay = hitNoise, BoxTriggerTimes = 2 }) as ParticleTrigger; DamageRadius = (float)Math.Pow(size * 4, 2); }
public Projectile(ComponentManager manager, Vector3 position, Vector3 initialVelocity, Health.DamageAmount damage, float size, string asset, string hitParticles, string hitNoise, GameComponent target, bool animated = false, bool singleSprite = false) : base(manager, "Projectile", Matrix.CreateTranslation(position), new Vector3(size, size, size), Vector3.One, 1.0f, 1.0f, 1.0f, 1.0f, new Vector3(0, -10, 0), OrientMode.Fixed) { this.AllowPhysicsSleep = false; Target = target; HitAnimation = null; IsSleeping = false; Velocity = initialVelocity; Orientation = OrientMode.LookAt; CollideMode = Physics.CollisionMode.None; var spriteSheet = new SpriteSheet(asset); if (animated) { spriteSheet.FrameWidth = Math.Min(spriteSheet.FrameWidth, spriteSheet.FrameHeight); spriteSheet.FrameHeight = spriteSheet.FrameWidth; } // Todo: Needs the cosmetic children treatement. if (animated) { Sprite = AddChild(new AnimatedSprite(Manager, "Sprite", Matrix.CreateRotationY((float)Math.PI * 0.5f)) { OrientationType = AnimatedSprite.OrientMode.Fixed }) as AnimatedSprite; var anim = Library.CreateSimpleAnimation(asset); anim.Loops = true; (Sprite as AnimatedSprite).AddAnimation(anim); if (singleSprite) { (Sprite as AnimatedSprite).OrientationType = AnimatedSprite.OrientMode.Spherical; } } else { Sprite = AddChild(new SimpleSprite(Manager, "Sprite", Matrix.CreateRotationY((float)Math.PI * 0.5f), spriteSheet, new Point(0, 0)) { OrientationType = SimpleSprite.OrientMode.Fixed }) as SimpleSprite; (Sprite as SimpleSprite).AutoSetWorldSize(); if (singleSprite) { (Sprite as SimpleSprite).OrientationType = SimpleSprite.OrientMode.Spherical; } } Sprite.SetFlag(Flag.ShouldSerialize, false); if (!singleSprite) { if (animated) { Sprite2 = Sprite.AddChild(new AnimatedSprite(Manager, "Sprite2", Matrix.CreateRotationY((float)Math.PI * 0.5f) * Matrix.CreateRotationZ((float)Math.PI * 0.5f)) { OrientationType = AnimatedSprite.OrientMode.Fixed }) as AnimatedSprite; var anim = Library.CreateSimpleAnimation(asset); anim.Loops = true; (Sprite2 as AnimatedSprite).AddAnimation(anim); } else { Sprite2 = AddChild(new SimpleSprite(Manager, "Sprite", Matrix.CreateRotationY((float)Math.PI * 0.5f) * Matrix.CreateRotationZ((float)Math.PI * 0.5f), spriteSheet, new Point(0, 0)) { OrientationType = SimpleSprite.OrientMode.Fixed }) as SimpleSprite; (Sprite2 as SimpleSprite).AutoSetWorldSize(); } Sprite2.SetFlag(Flag.ShouldSerialize, false); } Damage = damage; HitParticles = AddChild(new ParticleTrigger(hitParticles, manager, "Hit Particles", Matrix.Identity, new Vector3(size * 0.5f, size * 0.5f, size * 0.5f), Vector3.Zero) { TriggerOnDeath = true, SoundToPlay = hitNoise, BoxTriggerTimes = 2 }) as ParticleTrigger; DamageRadius = (float)Math.Pow(size * 4, 2); }