LightSource vertices are recalculated if another submarine within the range of the light has moved relative to the sub the light is in
This commit is contained in:
@@ -40,6 +40,8 @@ namespace Barotrauma.Lights
|
|||||||
//when were the vertices of the light volume last calculated
|
//when were the vertices of the light volume last calculated
|
||||||
private float lastRecalculationTime;
|
private float lastRecalculationTime;
|
||||||
|
|
||||||
|
private Dictionary<Submarine, Vector2> diffToSub;
|
||||||
|
|
||||||
private DynamicVertexBuffer lightVolumeBuffer;
|
private DynamicVertexBuffer lightVolumeBuffer;
|
||||||
private DynamicIndexBuffer lightVolumeIndexBuffer;
|
private DynamicIndexBuffer lightVolumeIndexBuffer;
|
||||||
private int vertexCount;
|
private int vertexCount;
|
||||||
@@ -122,7 +124,7 @@ namespace Barotrauma.Lights
|
|||||||
color = new Color(ToolBox.GetAttributeVector4(element, "color", Vector4.One));
|
color = new Color(ToolBox.GetAttributeVector4(element, "color", Vector4.One));
|
||||||
|
|
||||||
CastShadows = ToolBox.GetAttributeBool(element, "castshadows", true);
|
CastShadows = ToolBox.GetAttributeBool(element, "castshadows", true);
|
||||||
|
|
||||||
foreach (XElement subElement in element.Elements())
|
foreach (XElement subElement in element.Elements())
|
||||||
{
|
{
|
||||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
switch (subElement.Name.ToString().ToLowerInvariant())
|
||||||
@@ -150,7 +152,9 @@ namespace Barotrauma.Lights
|
|||||||
CastShadows = true;
|
CastShadows = true;
|
||||||
|
|
||||||
texture = LightTexture;
|
texture = LightTexture;
|
||||||
|
|
||||||
|
diffToSub = new Dictionary<Submarine, Vector2>();
|
||||||
|
|
||||||
GameMain.LightManager.AddLight(this);
|
GameMain.LightManager.AddLight(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,20 +273,34 @@ namespace Barotrauma.Lights
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (sub.DockedTo.Contains(ParentSub) && !NeedsHullCheck) continue;
|
if (sub.DockedTo.Contains(ParentSub) && !NeedsHullCheck) continue;
|
||||||
|
|
||||||
lightPos -= (sub.Position - ParentSub.Position);
|
lightPos -= (sub.Position - ParentSub.Position);
|
||||||
|
|
||||||
Rectangle subBorders = sub.Borders;
|
Rectangle subBorders = sub.Borders;
|
||||||
subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height);
|
subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height);
|
||||||
|
|
||||||
//only draw if the light overlaps with the sub
|
//don't draw any shadows if the light doesn't overlap with the borders of the sub
|
||||||
if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders))
|
if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders))
|
||||||
{
|
{
|
||||||
if (chList.List.Count > 0) NeedsRecalculation = true;
|
if (chList.List.Count > 0) NeedsRecalculation = true;
|
||||||
chList.List.Clear();
|
chList.List.Clear();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//recalculate vertices if the subs have moved > 5 px relative to each other
|
||||||
|
Vector2 diff = ParentSub.WorldPosition - sub.WorldPosition;
|
||||||
|
Vector2 prevDiff;
|
||||||
|
if (!diffToSub.TryGetValue(sub, out prevDiff))
|
||||||
|
{
|
||||||
|
diffToSub.Add(sub, diff);
|
||||||
|
NeedsRecalculation = true;
|
||||||
|
}
|
||||||
|
else if (Vector2.DistanceSquared(diff, prevDiff) > 5.0f*5.0f)
|
||||||
|
{
|
||||||
|
diffToSub[sub] = diff;
|
||||||
|
NeedsRecalculation = true;
|
||||||
|
}
|
||||||
|
|
||||||
RefreshConvexHullList(chList, lightPos, sub);
|
RefreshConvexHullList(chList, lightPos, sub);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user