From 03626c997b9e9fc9986f33c661355b72e67b5b76 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 3 May 2016 00:27:48 +0300 Subject: [PATCH] - Fixed shadows not being cast if the lightsource is outside the sub and the convexhull is not - Option to change the texture of the "light sphere" - Added "headlights" to the scooters --- .../Content/Items/Diving/divinggear.xml | 6 +- .../Content/Items/Electricity/signalitems.xml | 2 +- Subsurface/Content/Lights/lightcone.png | Bin 0 -> 39154 bytes .../Items/Components/Holdable/Propulsion.cs | 17 +++-- .../Items/Components/Signal/LightComponent.cs | 37 ++++++++--- Subsurface/Source/Items/ItemPrefab.cs | 14 ++-- Subsurface/Source/Map/Lights/ConvexHull.cs | 20 ++++-- Subsurface/Source/Map/Lights/LightManager.cs | 11 ++-- Subsurface/Source/Map/Lights/LightSource.cs | 62 +++++++++++++++--- 9 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 Subsurface/Content/Lights/lightcone.png diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index b3c8354ea..9c3245dc4 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -133,7 +133,11 @@ - + + + + + diff --git a/Subsurface/Content/Items/Electricity/signalitems.xml b/Subsurface/Content/Items/Electricity/signalitems.xml index c9f705ebc..a559427d4 100644 --- a/Subsurface/Content/Items/Electricity/signalitems.xml +++ b/Subsurface/Content/Items/Electricity/signalitems.xml @@ -295,7 +295,7 @@ - + diff --git a/Subsurface/Content/Lights/lightcone.png b/Subsurface/Content/Lights/lightcone.png new file mode 100644 index 0000000000000000000000000000000000000000..45ebc2640b3386af8d5c59d7b01ac0311e6952da GIT binary patch literal 39154 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 literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Items/Components/Holdable/Propulsion.cs b/Subsurface/Source/Items/Components/Holdable/Propulsion.cs index f3a6e285d..eb63e15d4 100644 --- a/Subsurface/Source/Items/Components/Holdable/Propulsion.cs +++ b/Subsurface/Source/Items/Components/Holdable/Propulsion.cs @@ -11,6 +11,8 @@ namespace Barotrauma.Items.Components private string particles; + private float useState; + private ParticlePrefab.DrawTargetType usableIn; [HasDefaultValue(0.0f, false)] @@ -50,6 +52,10 @@ namespace Barotrauma.Items.Components if (character == null) return false; if (!character.IsKeyDown(InputType.Aim) || character.Stun>0.0f) return false; + IsActive = true; + useState = 0.1f; + + if (character.AnimController.InWater) { if (usableIn == ParticlePrefab.DrawTargetType.Air) return true; @@ -91,12 +97,13 @@ namespace Barotrauma.Items.Components return true; } - - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + + public override void Update(float deltaTime, Camera cam) { - IsActive = false; + useState -= deltaTime; + + if (useState <= 0.0f) IsActive = false; } - - + } } diff --git a/Subsurface/Source/Items/Components/Signal/LightComponent.cs b/Subsurface/Source/Items/Components/Signal/LightComponent.cs index 57b9e5958..fda6b782f 100644 --- a/Subsurface/Source/Items/Components/Signal/LightComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/LightComponent.cs @@ -18,6 +18,8 @@ namespace Barotrauma.Items.Components private float flicker; + private bool castShadows; + [Editable, HasDefaultValue(100.0f, true)] public float Range { @@ -28,6 +30,17 @@ namespace Barotrauma.Items.Components } } + [Editable, HasDefaultValue(true, true)] + public bool CastShadows + { + get { return castShadows; } + set + { + castShadows = value; + if (light != null) light.CastShadows = value; + } + } + [Editable, HasDefaultValue(false, true)] public bool IsOn { @@ -87,17 +100,20 @@ namespace Barotrauma.Items.Components public LightComponent(Item item, XElement element) : base (item, element) { - light = new LightSource(item.Position, 100.0f, Color.White, item.CurrentHull == null ? null : item.CurrentHull.Submarine); + light = new LightSource(element); + light.Submarine = item.CurrentHull == null ? null : item.CurrentHull.Submarine; + light.Position = item.Position; + light.CastShadows = castShadows; IsActive = true; - foreach (XElement subElement in element.Elements()) - { - if (subElement.Name.ToString().ToLowerInvariant() != "sprite") continue; - light.LightSprite = new Sprite(subElement); - light.LightSprite.Origin = light.LightSprite.size / 2.0f; - break; - } + //foreach (XElement subElement in element.Elements()) + //{ + // if (subElement.Name.ToString().ToLowerInvariant() != "sprite") continue; + + // light.LightSprite = new Sprite(subElement); + // break; + //} } public override void Update(float deltaTime, Camera cam) @@ -115,6 +131,7 @@ namespace Barotrauma.Items.Components if (item.body != null) { light.Position = item.Position; + light.Rotation = item.body.Dir > 0.0f ? item.body.Rotation : item.body.Rotation - MathHelper.Pi; if (!item.body.Enabled) { @@ -150,9 +167,9 @@ namespace Barotrauma.Items.Components public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, bool editing = false) { - if (light.LightSprite != null && (item.body==null || item.body.Enabled)) + if (light.LightSprite != null && (item.body == null || item.body.Enabled)) { - light.LightSprite.Draw(spriteBatch, new Vector2(item.DrawPosition.X, -item.DrawPosition.Y), lightColor * lightBrightness, 0.0f, 1.0f, Microsoft.Xna.Framework.Graphics.SpriteEffects.None, item.Sprite.Depth-0.0001f); + light.LightSprite.Draw(spriteBatch, new Vector2(item.DrawPosition.X, -item.DrawPosition.Y), lightColor * lightBrightness, 0.0f, 1.0f, Microsoft.Xna.Framework.Graphics.SpriteEffects.None, item.Sprite.Depth - 0.0001f); } } diff --git a/Subsurface/Source/Items/ItemPrefab.cs b/Subsurface/Source/Items/ItemPrefab.cs index 75738453e..e75d2e392 100644 --- a/Subsurface/Source/Items/ItemPrefab.cs +++ b/Subsurface/Source/Items/ItemPrefab.cs @@ -229,17 +229,15 @@ namespace Barotrauma ImpactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", 0.0f); - string categoriesStr = ToolBox.GetAttributeString(element, "category", "Misc"); - string[] categories = categoriesStr.Split(','); + MapEntityCategory category; - for (int i = 0; i < categories.Length; i++) + if (!Enum.TryParse(ToolBox.GetAttributeString(element, "category", "Misc"), true, out category)) { - MapEntityCategory category; - if (Enum.TryParse(ToolBox.GetAttributeString(element, "category", "Misc"), out category)) - { - Category = i == 0 ? category : Category | category; - } + category = MapEntityCategory.Misc; } + + Category = category; + string spriteColorStr = ToolBox.GetAttributeString(element, "spritecolor", "1.0,1.0,1.0,1.0"); SpriteColor = new Color(ToolBox.ParseToVector4(spriteColorStr)); diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index 433daa49b..0f39b9b32 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -64,6 +64,12 @@ namespace Barotrauma.Lights private Rectangle boundingBox; + public Entity ParentEntity + { + get { return parentEntity; } + + } + public bool Enabled { get; @@ -302,9 +308,13 @@ namespace Barotrauma.Lights { if (!Enabled) return; + Vector2 lightSourcePos = light.Position; + + if (light.Submarine==null && parentEntity != null && parentEntity.Submarine != null) lightSourcePos -= parentEntity.Submarine.Position; + CachedShadow cachedShadow = null; - if (cachedShadows.TryGetValue(light, out cachedShadow) && - (light.Position == cachedShadow.LightPos || Vector2.DistanceSquared(light.Position, cachedShadow.LightPos) < 1.0f)) + if (cachedShadows.TryGetValue(light, out cachedShadow) && + (lightSourcePos == cachedShadow.LightPos || Vector2.DistanceSquared(lightSourcePos, cachedShadow.LightPos) < 1.0f)) { } @@ -315,17 +325,17 @@ namespace Barotrauma.Lights // lightPos = light.Position; //} - CalculateShadowVertices(light.Position, los); + CalculateShadowVertices(lightSourcePos, los); if (cachedShadow != null) { - cachedShadow.LightPos = light.Position; + cachedShadow.LightPos = lightSourcePos; cachedShadow.ShadowBuffer.SetData(shadowVertices, 0, shadowVertices.Length); cachedShadow.ShadowVertexCount = shadowVertexCount; } else { - cachedShadow = new CachedShadow(shadowVertices, penumbraVertices, light.Position, shadowVertexCount, 0); + cachedShadow = new CachedShadow(shadowVertices, penumbraVertices, lightSourcePos, shadowVertexCount, 0); RemoveCachedShadow(light); cachedShadows.Add(light, cachedShadow); } diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index d352300b7..994ecb146 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -2,6 +2,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; namespace Barotrauma.Lights { @@ -122,7 +123,7 @@ namespace Barotrauma.Lights foreach (LightSource light in lights) { - if (light.hullsInRange.Count == 0 || light.Color.A < 0.01f || light.Range < 1.0f) continue; + if (!light.hullsInRange.Any() || light.Color.A < 0.01f || light.Range < 1.0f) continue; if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; //clear alpha to 1 @@ -135,7 +136,7 @@ namespace Barotrauma.Lights foreach (ConvexHull ch in light.hullsInRange) { - if (!MathUtils.CircleIntersectsRectangle(light.Position, light.Range, ch.BoundingBox)) continue; + //if (!MathUtils.CircleIntersectsRectangle(light.Position, light.Range, ch.BoundingBox)) continue; //draw shadow ch.DrawShadows(graphics, cam, light, shadowTransform, false); } @@ -152,7 +153,7 @@ namespace Barotrauma.Lights foreach (LightSource light in lights) { - if (light.hullsInRange.Count > 0 || light.Color.A < 0.01f) continue; + if (light.hullsInRange.Any() || light.Color.A < 0.01f) continue; //if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; light.Draw(spriteBatch); @@ -163,10 +164,6 @@ namespace Barotrauma.Lights //clear alpha, to avoid messing stuff up later ClearAlphaToOne(graphics, spriteBatch); graphics.SetRenderTarget(null); - - if (!ObstructVision) return; - - } public void UpdateObstructVision(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Vector2 lookAtPosition) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index c1b79f52d..5460e51a4 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -22,8 +22,12 @@ namespace Barotrauma.Lights public Sprite LightSprite; + private Sprite overrideLightTexture; + public Entity Submarine; + public bool CastShadows; + //what was the range of the light when HullsInRange were last updated private float prevHullUpdateRange; @@ -45,6 +49,12 @@ namespace Barotrauma.Lights } } + public float Rotation + { + get; + set; + } + public Vector2 WorldPosition { get { return (Submarine == null) ? position : position + Submarine.Position; } @@ -84,17 +94,24 @@ namespace Barotrauma.Lights } public LightSource (XElement element) - :this(Vector2.Zero, 100.0f, Color.White, null) + : this(Vector2.Zero, 100.0f, Color.White, null) { float range = ToolBox.GetAttributeFloat(element, "range", 100.0f); Color color = new Color(ToolBox.GetAttributeVector4(element, "color", Vector4.One)); + CastShadows = ToolBox.GetAttributeBool(element, "castshadows", true); + foreach (XElement subElement in element.Elements()) { - if (subElement.Name.ToString().ToLowerInvariant() != "sprite") continue; - - LightSprite = new Sprite(subElement); - LightSprite.Origin = LightSprite.size / 2.0f; + switch (subElement.Name.ToString().ToLowerInvariant()) + { + case "sprite": + LightSprite = new Sprite(subElement); + break; + case "lighttexture": + overrideLightTexture = new Sprite(subElement); + break; + } } } @@ -108,6 +125,8 @@ namespace Barotrauma.Lights this.range = range; this.color = color; + CastShadows = true; + texture = LightTexture; GameMain.LightManager.AddLight(this); @@ -115,12 +134,25 @@ namespace Barotrauma.Lights public void UpdateHullsInRange() { + if (!CastShadows) return; + hullsInRange.Clear(); if (range < 1.0f || color.A < 0.01f) return; foreach (ConvexHull ch in ConvexHull.list) { - if (MathUtils.CircleIntersectsRectangle(position, range, ch.BoundingBox)) hullsInRange.Add(ch); + if (Submarine == null && ch.ParentEntity.Submarine != null) + { + if (MathUtils.CircleIntersectsRectangle(position - ch.ParentEntity.Submarine.Position, range, ch.BoundingBox)) + { + hullsInRange.Add(ch); + } + } + else if (MathUtils.CircleIntersectsRectangle(position, range, ch.BoundingBox)) + { + hullsInRange.Add(ch); + } + } } @@ -128,15 +160,25 @@ namespace Barotrauma.Lights { if (range > 1.0f) { - Vector2 center = new Vector2(LightTexture.Width / 2, LightTexture.Height / 2); - float scale = range / (lightTexture.Width / 2.0f); + if (overrideLightTexture == null) + { + Vector2 center = new Vector2(LightTexture.Width / 2, LightTexture.Height / 2); + float scale = range / (lightTexture.Width / 2.0f); - spriteBatch.Draw(lightTexture, new Vector2(WorldPosition.X, -WorldPosition.Y), null, color, 0, center, scale, SpriteEffects.None, 1); + spriteBatch.Draw(lightTexture, new Vector2(WorldPosition.X, -WorldPosition.Y), null, color, 0, center, scale, SpriteEffects.None, 1); + } + else + { + overrideLightTexture.Draw(spriteBatch, + new Vector2(WorldPosition.X, -WorldPosition.Y), Color, + overrideLightTexture.Origin, -Rotation, + new Vector2(overrideLightTexture.size.X/overrideLightTexture.SourceRect.Width, overrideLightTexture.size.Y/overrideLightTexture.SourceRect.Height)); + } } if (LightSprite != null) { - LightSprite.Draw(spriteBatch, new Vector2(WorldPosition.X, -WorldPosition.Y), Color); + LightSprite.Draw(spriteBatch, new Vector2(WorldPosition.X, -WorldPosition.Y), Color, LightSprite.Origin); } }