mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-23 07:22:52 +08:00
Implemented water calming and wave quad selection
This commit is contained in:
parent
e812674e69
commit
5cc94f049c
@ -34,7 +34,7 @@ namespace CodeWalker.World
|
|||||||
for (int i = 0; i < waterquads.Count; i++)
|
for (int i = 0; i < waterquads.Count; i++)
|
||||||
{
|
{
|
||||||
var waterquad = new WaterQuad();
|
var waterquad = new WaterQuad();
|
||||||
waterquad.Init(waterquads[i]);
|
waterquad.Init(waterquads[i], i);
|
||||||
WaterQuads.Add(waterquad);
|
WaterQuads.Add(waterquad);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ namespace CodeWalker.World
|
|||||||
for (int i = 0; i < calmingquads.Count; i++)
|
for (int i = 0; i < calmingquads.Count; i++)
|
||||||
{
|
{
|
||||||
var calmingquad = new WaterCalmingQuad();
|
var calmingquad = new WaterCalmingQuad();
|
||||||
calmingquad.Init(calmingquads[i]);
|
calmingquad.Init(calmingquads[i], i);
|
||||||
CalmingQuads.Add(calmingquad);
|
CalmingQuads.Add(calmingquad);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ namespace CodeWalker.World
|
|||||||
for (int i = 0; i < wavequads.Count; i++)
|
for (int i = 0; i < wavequads.Count; i++)
|
||||||
{
|
{
|
||||||
var wavequad = new WaterWaveQuad();
|
var wavequad = new WaterWaveQuad();
|
||||||
wavequad.Init(wavequads[i]);
|
wavequad.Init(wavequads[i], i);
|
||||||
WaveQuads.Add(wavequad);
|
WaveQuads.Add(wavequad);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,48 +61,68 @@ namespace CodeWalker.World
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void GetVisibleQuads(Camera camera, List<WaterQuad> quads)
|
public List<T> GetVisibleQuads<T>(Camera camera, IEnumerable<T> allQuads) where T : BaseWaterQuad
|
||||||
{
|
{
|
||||||
if (!Inited) return;
|
List<T> quads = new List<T>();
|
||||||
|
|
||||||
|
if (!Inited) return quads;
|
||||||
|
|
||||||
var vf = camera.ViewFrustum;
|
var vf = camera.ViewFrustum;
|
||||||
for (int i = 0; i < WaterQuads.Count; i++)
|
foreach (var quad in allQuads)
|
||||||
{
|
{
|
||||||
var quad = WaterQuads[i];
|
|
||||||
|
|
||||||
Vector3 camrel = quad.BSCenter - camera.Position;
|
Vector3 camrel = quad.BSCenter - camera.Position;
|
||||||
if (vf.ContainsSphereNoClipNoOpt(ref camrel, quad.BSRadius))
|
if (vf.ContainsSphereNoClipNoOpt(ref camrel, quad.BSRadius))
|
||||||
{
|
{
|
||||||
quads.Add(quad);
|
quads.Add(quad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return quads;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class BaseWaterQuad
|
||||||
public class WaterQuad
|
|
||||||
{
|
{
|
||||||
|
public int xmlNodeIndex { get; set; }
|
||||||
public float minX { get; set; }
|
public float minX { get; set; }
|
||||||
public float maxX { get; set; }
|
public float maxX { get; set; }
|
||||||
public float minY { get; set; }
|
public float minY { get; set; }
|
||||||
public float maxY { get; set; }
|
public float maxY { get; set; }
|
||||||
|
public float? z { get; set; } = null;
|
||||||
|
|
||||||
|
public abstract void Init(XmlNode node, int index);
|
||||||
|
|
||||||
|
public void CalcBS()
|
||||||
|
{
|
||||||
|
BSCenter = new Vector3((minX + maxX) * 0.5f, (minY + maxY) * 0.5f, z ?? 0);
|
||||||
|
BSRadius = new Vector2(maxX - minX, maxY - minY).Length() * 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3 BSCenter { get; private set; }
|
||||||
|
public float BSRadius { get; private set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("[{0}] X=({1} : {2}), Y=({3} : {4})", xmlNodeIndex, minX, maxX, minY, maxY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class WaterQuad : BaseWaterQuad
|
||||||
|
{
|
||||||
public int Type { get; set; }
|
public int Type { get; set; }
|
||||||
public bool IsInvisible { get; set; }
|
public bool IsInvisible { get; set; }
|
||||||
public bool HasLimitedDepth { get; set; }
|
public bool HasLimitedDepth { get; set; }
|
||||||
public float z { get; set; }
|
|
||||||
public float a1 { get; set; }
|
public float a1 { get; set; }
|
||||||
public float a2 { get; set; }
|
public float a2 { get; set; }
|
||||||
public float a3 { get; set; }
|
public float a3 { get; set; }
|
||||||
public float a4 { get; set; }
|
public float a4 { get; set; }
|
||||||
public bool NoStencil { get; set; }
|
public bool NoStencil { get; set; }
|
||||||
|
|
||||||
public Vector3 BSCenter;
|
|
||||||
public float BSRadius;
|
|
||||||
|
|
||||||
|
public override void Init(XmlNode node, int index)
|
||||||
public void Init(XmlNode node)
|
|
||||||
{
|
{
|
||||||
|
xmlNodeIndex = index;
|
||||||
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
||||||
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
||||||
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
||||||
@ -133,29 +153,17 @@ namespace CodeWalker.World
|
|||||||
<NoStencil value="false" />
|
<NoStencil value="false" />
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
CalcBS();
|
||||||
BSCenter = new Vector3((minX + maxX) * 0.5f, (minY + maxY) * 0.5f, z);
|
|
||||||
BSRadius = new Vector2(maxX - minX, maxY - minY).Length() * 0.5f;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return string.Format("{0}, {1}, {2}", FloatUtil.ToString(minX), FloatUtil.ToString(minY), FloatUtil.ToString(z), FloatUtil.ToString(maxX), FloatUtil.ToString(maxY));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WaterCalmingQuad
|
public class WaterCalmingQuad : BaseWaterQuad
|
||||||
{
|
{
|
||||||
public float minX { get; set; }
|
|
||||||
public float maxX { get; set; }
|
|
||||||
public float minY { get; set; }
|
|
||||||
public float maxY { get; set; }
|
|
||||||
public float fDampening { get; set; }
|
public float fDampening { get; set; }
|
||||||
|
|
||||||
public void Init(XmlNode node)
|
public override void Init(XmlNode node, int index)
|
||||||
{
|
{
|
||||||
|
xmlNodeIndex = index;
|
||||||
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
||||||
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
||||||
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
||||||
@ -170,22 +178,22 @@ namespace CodeWalker.World
|
|||||||
<fDampening value="0.05" />
|
<fDampening value="0.05" />
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
CalcBS();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WaterWaveQuad
|
public class WaterWaveQuad : BaseWaterQuad
|
||||||
{
|
{
|
||||||
public float minX { get; set; }
|
|
||||||
public float maxX { get; set; }
|
|
||||||
public float minY { get; set; }
|
|
||||||
public float maxY { get; set; }
|
|
||||||
public float Amplitude { get; set; }
|
public float Amplitude { get; set; }
|
||||||
public float XDirection { get; set; }
|
public float XDirection { get; set; }
|
||||||
public float YDirection { get; set; }
|
public float YDirection { get; set; }
|
||||||
|
public Quaternion WaveOrientation { get; set; }
|
||||||
|
|
||||||
public void Init(XmlNode node)
|
|
||||||
|
public override void Init(XmlNode node, int index)
|
||||||
{
|
{
|
||||||
|
xmlNodeIndex = index;
|
||||||
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
minX = Xml.GetChildFloatAttribute(node, "minX", "value");
|
||||||
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
maxX = Xml.GetChildFloatAttribute(node, "maxX", "value");
|
||||||
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
minY = Xml.GetChildFloatAttribute(node, "minY", "value");
|
||||||
@ -194,6 +202,9 @@ namespace CodeWalker.World
|
|||||||
XDirection = Xml.GetChildFloatAttribute(node, "XDirection", "value");
|
XDirection = Xml.GetChildFloatAttribute(node, "XDirection", "value");
|
||||||
YDirection = Xml.GetChildFloatAttribute(node, "YDirection", "value");
|
YDirection = Xml.GetChildFloatAttribute(node, "YDirection", "value");
|
||||||
|
|
||||||
|
float angl = (float)Math.Atan2(YDirection, XDirection);
|
||||||
|
WaveOrientation = Quaternion.RotationYawPitchRoll(0.0f, 0.0f, angl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
<minX value="1664" />
|
<minX value="1664" />
|
||||||
<maxX value="1988" />
|
<maxX value="1988" />
|
||||||
@ -204,6 +215,7 @@ namespace CodeWalker.World
|
|||||||
<YDirection value="-0.797584" />
|
<YDirection value="-0.797584" />
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
CalcBS();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7244,7 +7244,7 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
public void GetVisibleWaterQuads(Camera camera, List<WaterQuad> quads)
|
public void GetVisibleWaterQuads<T>(Camera camera, List<T> quads) where T : BaseWaterQuad
|
||||||
{
|
{
|
||||||
if (hidegtavmap)
|
if (hidegtavmap)
|
||||||
{
|
{
|
||||||
|
@ -1767,16 +1767,16 @@ namespace CodeWalker.Rendering
|
|||||||
|
|
||||||
VertexCount = 4;
|
VertexCount = 4;
|
||||||
Vertices = new VertexTypePCT[4];
|
Vertices = new VertexTypePCT[4];
|
||||||
Vertices[0].Position = new Vector3(key.minX, key.minY, key.z);
|
Vertices[0].Position = new Vector3(key.minX, key.minY, key.z.Value);
|
||||||
Vertices[0].Texcoord = new Vector2(0.0f, 0.0f);
|
Vertices[0].Texcoord = new Vector2(0.0f, 0.0f);
|
||||||
Vertices[0].Colour = (uint)new Color4(key.a1 / 255.0f).ToRgba();
|
Vertices[0].Colour = (uint)new Color4(key.a1 / 255.0f).ToRgba();
|
||||||
Vertices[1].Position = new Vector3(key.maxX, key.minY, key.z);
|
Vertices[1].Position = new Vector3(key.maxX, key.minY, key.z.Value);
|
||||||
Vertices[1].Texcoord = new Vector2(sx, 0.0f);
|
Vertices[1].Texcoord = new Vector2(sx, 0.0f);
|
||||||
Vertices[1].Colour = (uint)new Color4(key.a2 / 255.0f).ToRgba();
|
Vertices[1].Colour = (uint)new Color4(key.a2 / 255.0f).ToRgba();
|
||||||
Vertices[2].Position = new Vector3(key.minX, key.maxY, key.z);
|
Vertices[2].Position = new Vector3(key.minX, key.maxY, key.z.Value);
|
||||||
Vertices[2].Texcoord = new Vector2(0.0f, sy);
|
Vertices[2].Texcoord = new Vector2(0.0f, sy);
|
||||||
Vertices[2].Colour = (uint)new Color4(key.a3 / 255.0f).ToRgba();
|
Vertices[2].Colour = (uint)new Color4(key.a3 / 255.0f).ToRgba();
|
||||||
Vertices[3].Position = new Vector3(key.maxX, key.maxY, key.z);
|
Vertices[3].Position = new Vector3(key.maxX, key.maxY, key.z.Value);
|
||||||
Vertices[3].Texcoord = new Vector2(sx, sy);
|
Vertices[3].Texcoord = new Vector2(sx, sy);
|
||||||
Vertices[3].Colour = (uint)new Color4(key.a4 / 255.0f).ToRgba();
|
Vertices[3].Colour = (uint)new Color4(key.a4 / 255.0f).ToRgba();
|
||||||
|
|
||||||
|
@ -1242,6 +1242,8 @@ namespace CodeWalker.Rendering
|
|||||||
{
|
{
|
||||||
case MapSelectionMode.NavMesh:
|
case MapSelectionMode.NavMesh:
|
||||||
case MapSelectionMode.WaterQuad:
|
case MapSelectionMode.WaterQuad:
|
||||||
|
case MapSelectionMode.CalmingQuad:
|
||||||
|
case MapSelectionMode.WaveQuad:
|
||||||
case MapSelectionMode.MloInstance:
|
case MapSelectionMode.MloInstance:
|
||||||
clip = false;
|
clip = false;
|
||||||
break;
|
break;
|
||||||
@ -1326,6 +1328,8 @@ namespace CodeWalker.Rendering
|
|||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case MapSelectionMode.WaterQuad:
|
case MapSelectionMode.WaterQuad:
|
||||||
|
case MapSelectionMode.CalmingQuad:
|
||||||
|
case MapSelectionMode.WaveQuad:
|
||||||
case MapSelectionMode.MloInstance:
|
case MapSelectionMode.MloInstance:
|
||||||
clip = false;
|
clip = false;
|
||||||
break;
|
break;
|
||||||
|
@ -36,6 +36,8 @@ namespace CodeWalker
|
|||||||
Watermap = 17,
|
Watermap = 17,
|
||||||
Audio = 18,
|
Audio = 18,
|
||||||
Occlusion = 19,
|
Occlusion = 19,
|
||||||
|
CalmingQuad = 20,
|
||||||
|
WaveQuad = 21,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -58,6 +60,8 @@ namespace CodeWalker
|
|||||||
public YmapEntityDef MloEntityDef { get; set; }
|
public YmapEntityDef MloEntityDef { get; set; }
|
||||||
public MCMloRoomDef MloRoomDef { get; set; }
|
public MCMloRoomDef MloRoomDef { get; set; }
|
||||||
public WaterQuad WaterQuad { get; set; }
|
public WaterQuad WaterQuad { get; set; }
|
||||||
|
public WaterCalmingQuad CalmingQuad { get; set; }
|
||||||
|
public WaterWaveQuad WaveQuad { get; set; }
|
||||||
public Bounds CollisionBounds { get; set; }
|
public Bounds CollisionBounds { get; set; }
|
||||||
public BoundPolygon CollisionPoly { get; set; }
|
public BoundPolygon CollisionPoly { get; set; }
|
||||||
public BoundVertex CollisionVertex { get; set; }
|
public BoundVertex CollisionVertex { get; set; }
|
||||||
@ -100,6 +104,8 @@ namespace CodeWalker
|
|||||||
(CarGenerator != null) ||
|
(CarGenerator != null) ||
|
||||||
(GrassBatch != null) ||
|
(GrassBatch != null) ||
|
||||||
(WaterQuad != null) ||
|
(WaterQuad != null) ||
|
||||||
|
(CalmingQuad != null) ||
|
||||||
|
(WaveQuad != null) ||
|
||||||
(CollisionBounds != null) ||
|
(CollisionBounds != null) ||
|
||||||
(CollisionPoly != null) ||
|
(CollisionPoly != null) ||
|
||||||
(CollisionVertex != null) ||
|
(CollisionVertex != null) ||
|
||||||
@ -139,6 +145,8 @@ namespace CodeWalker
|
|||||||
|| (BoxOccluder != mhit.BoxOccluder)
|
|| (BoxOccluder != mhit.BoxOccluder)
|
||||||
|| (OccludeModelTri != mhit.OccludeModelTri)
|
|| (OccludeModelTri != mhit.OccludeModelTri)
|
||||||
|| (WaterQuad != mhit.WaterQuad)
|
|| (WaterQuad != mhit.WaterQuad)
|
||||||
|
|| (CalmingQuad != mhit.CalmingQuad)
|
||||||
|
|| (WaveQuad != mhit.WaveQuad)
|
||||||
|| (CollisionBounds != mhit.CollisionBounds)
|
|| (CollisionBounds != mhit.CollisionBounds)
|
||||||
|| (CollisionPoly != mhit.CollisionPoly)
|
|| (CollisionPoly != mhit.CollisionPoly)
|
||||||
|| (CollisionVertex != mhit.CollisionVertex)
|
|| (CollisionVertex != mhit.CollisionVertex)
|
||||||
@ -166,6 +174,8 @@ namespace CodeWalker
|
|||||||
|| (BoxOccluder != null)
|
|| (BoxOccluder != null)
|
||||||
|| (OccludeModelTri != null)
|
|| (OccludeModelTri != null)
|
||||||
|| (WaterQuad != null)
|
|| (WaterQuad != null)
|
||||||
|
|| (CalmingQuad != null)
|
||||||
|
|| (WaveQuad != null)
|
||||||
|| (CollisionBounds != null)
|
|| (CollisionBounds != null)
|
||||||
|| (CollisionPoly != null)
|
|| (CollisionPoly != null)
|
||||||
|| (CollisionVertex != null)
|
|| (CollisionVertex != null)
|
||||||
@ -195,6 +205,8 @@ namespace CodeWalker
|
|||||||
BoxOccluder = null;
|
BoxOccluder = null;
|
||||||
OccludeModelTri = null;
|
OccludeModelTri = null;
|
||||||
WaterQuad = null;
|
WaterQuad = null;
|
||||||
|
CalmingQuad = null;
|
||||||
|
WaveQuad = null;
|
||||||
CollisionBounds = null;
|
CollisionBounds = null;
|
||||||
CollisionPoly = null;
|
CollisionPoly = null;
|
||||||
CollisionVertex = null;
|
CollisionVertex = null;
|
||||||
@ -277,6 +289,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
name = "WaterQuad " + WaterQuad.ToString();
|
name = "WaterQuad " + WaterQuad.ToString();
|
||||||
}
|
}
|
||||||
|
else if (CalmingQuad != null)
|
||||||
|
{
|
||||||
|
name = "WaterCalmingQuad " + CalmingQuad.ToString();
|
||||||
|
}
|
||||||
|
else if (WaveQuad != null)
|
||||||
|
{
|
||||||
|
name = "WaterWaveQuad " + WaveQuad.ToString();
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
name = "NavPoly " + NavPoly.ToString();
|
name = "NavPoly " + NavPoly.ToString();
|
||||||
|
@ -129,6 +129,16 @@ namespace CodeWalker.World
|
|||||||
SelectionEntityTabPage.Text = "Water Quad";
|
SelectionEntityTabPage.Text = "Water Quad";
|
||||||
SelEntityPropertyGrid.SelectedObject = item.WaterQuad;
|
SelEntityPropertyGrid.SelectedObject = item.WaterQuad;
|
||||||
}
|
}
|
||||||
|
else if (item.CalmingQuad != null)
|
||||||
|
{
|
||||||
|
SelectionEntityTabPage.Text = "Water Calming Quad";
|
||||||
|
SelEntityPropertyGrid.SelectedObject = item.CalmingQuad;
|
||||||
|
}
|
||||||
|
else if (item.WaveQuad != null)
|
||||||
|
{
|
||||||
|
SelectionEntityTabPage.Text = "Water Wave Quad";
|
||||||
|
SelEntityPropertyGrid.SelectedObject = item.WaveQuad;
|
||||||
|
}
|
||||||
else if (item.NavPoly != null)
|
else if (item.NavPoly != null)
|
||||||
{
|
{
|
||||||
SelectionEntityTabPage.Text = "Nav Poly";
|
SelectionEntityTabPage.Text = "Nav Poly";
|
||||||
|
22
CodeWalker/WorldForm.Designer.cs
generated
22
CodeWalker/WorldForm.Designer.cs
generated
@ -312,6 +312,8 @@ namespace CodeWalker
|
|||||||
this.ToolbarPanel = new System.Windows.Forms.Panel();
|
this.ToolbarPanel = new System.Windows.Forms.Panel();
|
||||||
this.SubtitleLabel = new System.Windows.Forms.Label();
|
this.SubtitleLabel = new System.Windows.Forms.Label();
|
||||||
this.SubtitleTimer = new System.Windows.Forms.Timer(this.components);
|
this.SubtitleTimer = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.ToolbarSelectCalmingQuadButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.ToolbarSelectWaveQuadButton = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.StatusStrip.SuspendLayout();
|
this.StatusStrip.SuspendLayout();
|
||||||
this.ToolsPanel.SuspendLayout();
|
this.ToolsPanel.SuspendLayout();
|
||||||
this.ToolsTabControl.SuspendLayout();
|
this.ToolsTabControl.SuspendLayout();
|
||||||
@ -1084,6 +1086,8 @@ namespace CodeWalker
|
|||||||
"Car Generator",
|
"Car Generator",
|
||||||
"Grass",
|
"Grass",
|
||||||
"Water Quad",
|
"Water Quad",
|
||||||
|
"Water Calming Quad",
|
||||||
|
"Water Wave Quad",
|
||||||
"Collision",
|
"Collision",
|
||||||
"Nav Mesh",
|
"Nav Mesh",
|
||||||
"Path",
|
"Path",
|
||||||
@ -3080,6 +3084,8 @@ namespace CodeWalker
|
|||||||
this.ToolbarSelectCarGeneratorButton,
|
this.ToolbarSelectCarGeneratorButton,
|
||||||
this.ToolbarSelectGrassButton,
|
this.ToolbarSelectGrassButton,
|
||||||
this.ToolbarSelectWaterQuadButton,
|
this.ToolbarSelectWaterQuadButton,
|
||||||
|
this.ToolbarSelectCalmingQuadButton,
|
||||||
|
this.ToolbarSelectWaveQuadButton,
|
||||||
this.ToolbarSelectCollisionButton,
|
this.ToolbarSelectCollisionButton,
|
||||||
this.ToolbarSelectNavMeshButton,
|
this.ToolbarSelectNavMeshButton,
|
||||||
this.ToolbarSelectPathButton,
|
this.ToolbarSelectPathButton,
|
||||||
@ -3604,6 +3610,20 @@ namespace CodeWalker
|
|||||||
//
|
//
|
||||||
this.SubtitleTimer.Tick += new System.EventHandler(this.SubtitleTimer_Tick);
|
this.SubtitleTimer.Tick += new System.EventHandler(this.SubtitleTimer_Tick);
|
||||||
//
|
//
|
||||||
|
// ToolbarSelectCalmingQuadButton
|
||||||
|
//
|
||||||
|
this.ToolbarSelectCalmingQuadButton.Name = "ToolbarSelectCalmingQuadButton";
|
||||||
|
this.ToolbarSelectCalmingQuadButton.Size = new System.Drawing.Size(185, 22);
|
||||||
|
this.ToolbarSelectCalmingQuadButton.Text = "Water Calming Quad";
|
||||||
|
this.ToolbarSelectCalmingQuadButton.Click += new System.EventHandler(this.ToolbarSelectCalmingQuadButton_Click);
|
||||||
|
//
|
||||||
|
// ToolbarSelectWaveQuadButton
|
||||||
|
//
|
||||||
|
this.ToolbarSelectWaveQuadButton.Name = "ToolbarSelectWaveQuadButton";
|
||||||
|
this.ToolbarSelectWaveQuadButton.Size = new System.Drawing.Size(185, 22);
|
||||||
|
this.ToolbarSelectWaveQuadButton.Text = "Water Wave Quad";
|
||||||
|
this.ToolbarSelectWaveQuadButton.Click += new System.EventHandler(this.ToolbarSelectWaveQuadButton_Click);
|
||||||
|
//
|
||||||
// WorldForm
|
// WorldForm
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
@ -3975,5 +3995,7 @@ namespace CodeWalker
|
|||||||
private System.Windows.Forms.ToolStripMenuItem ToolbarRotationSnapping90Button;
|
private System.Windows.Forms.ToolStripMenuItem ToolbarRotationSnapping90Button;
|
||||||
private System.Windows.Forms.ToolStripMenuItem ToolbarSnapGridSizeButton;
|
private System.Windows.Forms.ToolStripMenuItem ToolbarSnapGridSizeButton;
|
||||||
private System.Windows.Forms.CheckBox HDLightsCheckBox;
|
private System.Windows.Forms.CheckBox HDLightsCheckBox;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem ToolbarSelectCalmingQuadButton;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem ToolbarSelectWaveQuadButton;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -127,7 +127,6 @@ namespace CodeWalker
|
|||||||
List<YndFile> renderpathynds = new List<YndFile>();
|
List<YndFile> renderpathynds = new List<YndFile>();
|
||||||
|
|
||||||
bool renderwaterquads = true;
|
bool renderwaterquads = true;
|
||||||
List<WaterQuad> renderwaterquadlist = new List<WaterQuad>();
|
|
||||||
|
|
||||||
bool rendertraintracks = false;
|
bool rendertraintracks = false;
|
||||||
List<TrainTrack> rendertraintracklist = new List<TrainTrack>();
|
List<TrainTrack> rendertraintracklist = new List<TrainTrack>();
|
||||||
@ -710,6 +709,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
RenderWorldWaterQuads();
|
RenderWorldWaterQuads();
|
||||||
}
|
}
|
||||||
|
if (SelectionMode == MapSelectionMode.WaveQuad)
|
||||||
|
{
|
||||||
|
RenderWorldWaterWaveQuads();
|
||||||
|
}
|
||||||
|
if (SelectionMode == MapSelectionMode.CalmingQuad)
|
||||||
|
{
|
||||||
|
RenderWorldWaterCalmingQuads();
|
||||||
|
}
|
||||||
if (rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision))
|
if (rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision))
|
||||||
{
|
{
|
||||||
RenderWorldCollisionMeshes();
|
RenderWorldCollisionMeshes();
|
||||||
@ -804,19 +811,23 @@ namespace CodeWalker
|
|||||||
|
|
||||||
private void RenderWorldWaterQuads()
|
private void RenderWorldWaterQuads()
|
||||||
{
|
{
|
||||||
renderwaterquadlist.Clear();
|
var quads = RenderWorldBaseWaterQuads(water.WaterQuads, MapSelectionMode.WaterQuad);
|
||||||
|
Renderer.RenderWaterQuads(quads);
|
||||||
|
}
|
||||||
|
|
||||||
water.GetVisibleQuads(camera, renderwaterquadlist);
|
private void RenderWorldWaterCalmingQuads() => RenderWorldBaseWaterQuads(water.CalmingQuads, MapSelectionMode.CalmingQuad);
|
||||||
|
|
||||||
if (ProjectForm != null)
|
private void RenderWorldWaterWaveQuads() => RenderWorldBaseWaterQuads(water.WaveQuads, MapSelectionMode.WaveQuad);
|
||||||
{
|
|
||||||
ProjectForm.GetVisibleWaterQuads(camera, renderwaterquadlist);
|
|
||||||
}
|
|
||||||
|
|
||||||
Renderer.RenderWaterQuads(renderwaterquadlist);
|
private List<T> RenderWorldBaseWaterQuads<T>(IEnumerable<T> quads, MapSelectionMode requiredMode) where T : BaseWaterQuad
|
||||||
|
{
|
||||||
|
List<T> renderwaterquadlist = water.GetVisibleQuads<T>(camera, quads);
|
||||||
|
|
||||||
UpdateMouseHits(renderwaterquadlist);
|
ProjectForm?.GetVisibleWaterQuads<T>(camera, renderwaterquadlist);
|
||||||
|
|
||||||
|
if(SelectionMode == requiredMode) UpdateMouseHits(renderwaterquadlist);
|
||||||
|
|
||||||
|
return renderwaterquadlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RenderWorldPaths()
|
private void RenderWorldPaths()
|
||||||
@ -1379,6 +1390,15 @@ namespace CodeWalker
|
|||||||
Renderer.RenderCar(cg.Position, cgori, cg._CCarGen.carModel, cg._CCarGen.popGroup);
|
Renderer.RenderCar(cg.Position, cgori, cg._CCarGen.carModel, cg._CCarGen.popGroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (selectionItem.WaveQuad != null)
|
||||||
|
{
|
||||||
|
var quad = selectionItem.WaveQuad;
|
||||||
|
Vector3 quadArrowPos = new Vector3(quad.minX + (quad.maxX - quad.minX) * 0.5f, quad.minY + (quad.maxY - quad.minY) * 0.5f, 5);
|
||||||
|
Quaternion waveOri = quad.WaveOrientation;
|
||||||
|
float arrowlen = quad.Amplitude * 50;
|
||||||
|
float arrowrad = arrowlen * 0.066f;
|
||||||
|
Renderer.RenderSelectionArrowOutline(quadArrowPos, Vector3.UnitX, Vector3.UnitY, waveOri, arrowlen, arrowrad, cgrn);
|
||||||
|
}
|
||||||
if (selectionItem.LodLight != null)
|
if (selectionItem.LodLight != null)
|
||||||
{
|
{
|
||||||
Renderer.RenderSelectionLodLight(selectionItem.LodLight);
|
Renderer.RenderSelectionLodLight(selectionItem.LodLight);
|
||||||
@ -2900,35 +2920,42 @@ namespace CodeWalker
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
private void UpdateMouseHits(List<WaterQuad> waterquads)
|
private void UpdateMouseHits<T>(List<T> waterquads) where T : BaseWaterQuad
|
||||||
{
|
{
|
||||||
if (SelectionMode != MapSelectionMode.WaterQuad) return;
|
|
||||||
|
|
||||||
BoundingBox bbox = new BoundingBox();
|
BoundingBox bbox = new BoundingBox();
|
||||||
Ray mray = new Ray();
|
Ray mray = new Ray();
|
||||||
mray.Position = camera.MouseRay.Position + camera.Position;
|
mray.Position = camera.MouseRay.Position + camera.Position;
|
||||||
mray.Direction = camera.MouseRay.Direction;
|
mray.Direction = camera.MouseRay.Direction;
|
||||||
float hitdist = float.MaxValue;
|
float hitdist;
|
||||||
|
|
||||||
|
|
||||||
foreach (var quad in waterquads)
|
foreach (T quad in waterquads)
|
||||||
{
|
{
|
||||||
MapBox mb = new MapBox();
|
MapBox mb = new MapBox();
|
||||||
mb.CamRelPos = -camera.Position;
|
mb.CamRelPos = -camera.Position;
|
||||||
mb.BBMin = new Vector3(quad.minX, quad.minY, quad.z);
|
mb.BBMin = new Vector3(quad.minX, quad.minY, quad.z ?? 0);
|
||||||
mb.BBMax = new Vector3(quad.maxX, quad.maxY, quad.z);
|
mb.BBMax = new Vector3(quad.maxX, quad.maxY, quad.z ?? 0);
|
||||||
mb.Orientation = Quaternion.Identity;
|
mb.Orientation = Quaternion.Identity;
|
||||||
mb.Scale = Vector3.One;
|
mb.Scale = Vector3.One;
|
||||||
Renderer.BoundingBoxes.Add(mb);
|
Renderer.BoundingBoxes.Add(mb);
|
||||||
|
|
||||||
bbox.Minimum = mb.BBMin;
|
bbox.Minimum = mb.BBMin;
|
||||||
bbox.Maximum = mb.BBMax;
|
bbox.Maximum = mb.BBMax;
|
||||||
if (mray.Intersects(ref bbox, out hitdist) && (hitdist < CurMouseHit.HitDist) && (hitdist > 0))
|
|
||||||
|
if(mray.Intersects(ref bbox, out hitdist) && hitdist > 0 && hitdist <= CurMouseHit.HitDist)
|
||||||
{
|
{
|
||||||
CurMouseHit.WaterQuad = quad;
|
float curSize = CurMouseHit.AABB.Size.X * CurMouseHit.AABB.Size.Y;
|
||||||
CurMouseHit.HitDist = hitdist;
|
float newSize = bbox.Size.X * bbox.Size.Y;
|
||||||
CurMouseHit.CamRel = mb.CamRelPos;
|
if ((curSize == 0) || (newSize < curSize))
|
||||||
CurMouseHit.AABB = bbox;
|
{
|
||||||
|
CurMouseHit.HitDist = hitdist;
|
||||||
|
CurMouseHit.CamRel = mb.CamRelPos;
|
||||||
|
CurMouseHit.AABB = bbox;
|
||||||
|
|
||||||
|
CurMouseHit.WaterQuad = quad as WaterQuad;
|
||||||
|
CurMouseHit.WaveQuad = quad as WaterWaveQuad;
|
||||||
|
CurMouseHit.CalmingQuad = quad as WaterCalmingQuad;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3722,6 +3749,16 @@ namespace CodeWalker
|
|||||||
SelectionEntityTabPage.Text = "WaterQuad";
|
SelectionEntityTabPage.Text = "WaterQuad";
|
||||||
SelEntityPropertyGrid.SelectedObject = item.WaterQuad;
|
SelEntityPropertyGrid.SelectedObject = item.WaterQuad;
|
||||||
}
|
}
|
||||||
|
else if (item.CalmingQuad != null)
|
||||||
|
{
|
||||||
|
SelectionEntityTabPage.Text = "CalmingQuad";
|
||||||
|
SelEntityPropertyGrid.SelectedObject = item.CalmingQuad;
|
||||||
|
}
|
||||||
|
else if (item.WaveQuad != null)
|
||||||
|
{
|
||||||
|
SelectionEntityTabPage.Text = "WaveQuad";
|
||||||
|
SelEntityPropertyGrid.SelectedObject = item.WaveQuad;
|
||||||
|
}
|
||||||
else if (item.PathNode != null)
|
else if (item.PathNode != null)
|
||||||
{
|
{
|
||||||
SelectionEntityTabPage.Text = "PathNode";
|
SelectionEntityTabPage.Text = "PathNode";
|
||||||
@ -5551,6 +5588,14 @@ namespace CodeWalker
|
|||||||
mode = MapSelectionMode.WaterQuad;
|
mode = MapSelectionMode.WaterQuad;
|
||||||
ToolbarSelectWaterQuadButton.Checked = true;
|
ToolbarSelectWaterQuadButton.Checked = true;
|
||||||
break;
|
break;
|
||||||
|
case "Water Calming Quad":
|
||||||
|
mode = MapSelectionMode.CalmingQuad;
|
||||||
|
ToolbarSelectCalmingQuadButton.Checked = true;
|
||||||
|
break;
|
||||||
|
case "Water Wave Quad":
|
||||||
|
mode = MapSelectionMode.WaveQuad;
|
||||||
|
ToolbarSelectWaveQuadButton.Checked = true;
|
||||||
|
break;
|
||||||
case "Collision":
|
case "Collision":
|
||||||
mode = MapSelectionMode.Collision;
|
mode = MapSelectionMode.Collision;
|
||||||
ToolbarSelectCollisionButton.Checked = true;
|
ToolbarSelectCollisionButton.Checked = true;
|
||||||
@ -7309,6 +7354,18 @@ namespace CodeWalker
|
|||||||
SetMouseSelect(true);
|
SetMouseSelect(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ToolbarSelectCalmingQuadButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
SetSelectionMode("Water Calming Quad");
|
||||||
|
SetMouseSelect(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToolbarSelectWaveQuadButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
SetSelectionMode("Water Wave Quad");
|
||||||
|
SetMouseSelect(true);
|
||||||
|
}
|
||||||
|
|
||||||
private void ToolbarSelectCollisionButton_Click(object sender, EventArgs e)
|
private void ToolbarSelectCollisionButton_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SetSelectionMode("Collision");
|
SetSelectionMode("Collision");
|
||||||
|
Loading…
Reference in New Issue
Block a user