Merge pull request #143 from Skylumz/master

Implemented a lights editor in model viewer fixed
This commit is contained in:
dexyfex 2021-12-31 18:02:47 +11:00 committed by GitHub
commit f91ef89580
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 3251 additions and 246 deletions

View File

@ -2118,7 +2118,7 @@ namespace CodeWalker.GameFiles
var dd = db as Drawable;
var fd = db as FragDrawable;
var skel = db.Skeleton;
LightAttributes_s[] lightAttrs = null;
LightAttributes[] lightAttrs = null;
Bounds b = null;
if (dd != null)
{
@ -2246,7 +2246,7 @@ namespace CodeWalker.GameFiles
[TypeConverter(typeof(ExpandableObjectConverter))]
public class LightInstance
{
public LightAttributes_s Attributes { get; set; } //just for display purposes!
public LightAttributes Attributes { get; set; } //just for display purposes!
public uint Hash { get; set; }
public Vector3 Position { get; set; }
public Vector3 Direction { get; set; }

View File

@ -4493,8 +4493,13 @@ namespace CodeWalker.GameFiles
Capsule = 4,
}
[TypeConverter(typeof(ExpandableObjectConverter))] public struct LightAttributes_s : IMetaXmlItem
[TypeConverter(typeof(ExpandableObjectConverter))] public class LightAttributes : ResourceSystemBlock, IMetaXmlItem
{
public override long BlockLength
{
get { return 168; }
}
// structure data
public uint Unknown_0h { get; set; } // 0x00000000
public uint Unknown_4h { get; set; } // 0x00000000
@ -4542,6 +4547,107 @@ namespace CodeWalker.GameFiles
public MetaHash ProjectedTextureHash { get; set; }
public uint Unknown_A4h { get; set; } // 0x00000000
public bool HasChanged = false; //used by model light form
public override void Read(ResourceDataReader reader, params object[] parameters)
{
//read structure data
Unknown_0h = reader.ReadUInt32();
Unknown_4h = reader.ReadUInt32();
Position = reader.ReadVector3();
Unknown_14h = reader.ReadUInt32();
ColorR = reader.ReadByte();
ColorG = reader.ReadByte();
ColorB = reader.ReadByte();
Flashiness = reader.ReadByte();
Intensity = reader.ReadSingle();
Flags = reader.ReadUInt32();
BoneId = reader.ReadUInt16();
Type = (LightType)reader.ReadByte();
GroupId = reader.ReadByte();
TimeFlags = reader.ReadUInt32();
Falloff = reader.ReadSingle();
FalloffExponent = reader.ReadSingle();
CullingPlaneNormal = reader.ReadVector3();
CullingPlaneOffset = reader.ReadSingle();
ShadowBlur = reader.ReadByte();
Unknown_45h = reader.ReadByte();
Unknown_46h = reader.ReadUInt16();
Unknown_48h = reader.ReadUInt32();
VolumeIntensity = reader.ReadSingle();
VolumeSizeScale = reader.ReadSingle();
VolumeOuterColorR = reader.ReadByte();
VolumeOuterColorG = reader.ReadByte();
VolumeOuterColorB = reader.ReadByte();
LightHash = reader.ReadByte();
VolumeOuterIntensity = reader.ReadSingle();
CoronaSize = reader.ReadSingle();
VolumeOuterExponent = reader.ReadSingle();
LightFadeDistance = reader.ReadByte();
ShadowFadeDistance = reader.ReadByte();
SpecularFadeDistance = reader.ReadByte();
VolumetricFadeDistance = reader.ReadByte();
ShadowNearClip = reader.ReadSingle();
CoronaIntensity = reader.ReadSingle();
CoronaZBias = reader.ReadSingle();
Direction = reader.ReadVector3();
Tangent = reader.ReadVector3();
ConeInnerAngle = reader.ReadSingle();
ConeOuterAngle = reader.ReadSingle();
Extent = reader.ReadVector3();
ProjectedTextureHash = new MetaHash(reader.ReadUInt32());
Unknown_A4h = reader.ReadUInt32();
}
public override void Write(ResourceDataWriter writer, params object[] parameters)
{
//write structure data
writer.Write(this.Unknown_0h);
writer.Write(this.Unknown_4h);
writer.Write(this.Position);
writer.Write(this.Unknown_14h);
writer.Write(this.ColorR);
writer.Write(this.ColorG);
writer.Write(this.ColorB);
writer.Write(this.Flashiness);
writer.Write(this.Intensity);
writer.Write(this.Flags);
writer.Write(this.BoneId);
writer.Write((byte)this.Type);
writer.Write(this.GroupId);
writer.Write(this.TimeFlags);
writer.Write(this.Falloff);
writer.Write(this.FalloffExponent);
writer.Write(this.CullingPlaneNormal);
writer.Write(this.CullingPlaneOffset);
writer.Write(this.ShadowBlur);
writer.Write(this.Unknown_45h);
writer.Write(this.Unknown_46h);
writer.Write(this.Unknown_48h);
writer.Write(this.VolumeIntensity);
writer.Write(this.VolumeSizeScale);
writer.Write(this.VolumeOuterColorR);
writer.Write(this.VolumeOuterColorG);
writer.Write(this.VolumeOuterColorB);
writer.Write(this.LightHash);
writer.Write(this.VolumeOuterIntensity);
writer.Write(this.CoronaSize);
writer.Write(this.VolumeOuterExponent);
writer.Write(this.LightFadeDistance);
writer.Write(this.ShadowFadeDistance);
writer.Write(this.SpecularFadeDistance);
writer.Write(this.VolumetricFadeDistance);
writer.Write(this.ShadowNearClip);
writer.Write(this.CoronaIntensity);
writer.Write(this.CoronaZBias);
writer.Write(this.Direction);
writer.Write(this.Tangent);
writer.Write(this.ConeInnerAngle);
writer.Write(this.ConeOuterAngle);
writer.Write(this.Extent);
writer.Write(this.ProjectedTextureHash.Hash);
writer.Write(this.Unknown_A4h);
}
public void WriteXml(StringBuilder sb, int indent)
{
YdrXml.SelfClosingTag(sb, indent, "Position " + FloatUtil.GetVector3XmlString(Position));
@ -4622,6 +4728,40 @@ namespace CodeWalker.GameFiles
Extent = Xml.GetChildVector3Attributes(node, "Extent");
ProjectedTextureHash = XmlMeta.GetHash(Xml.GetChildInnerText(node, "ProjectedTextureHash"));
}
public Quaternion GetRotation()
{
Vector3 tx = new Vector3();
Vector3 ty = new Vector3();
switch (Type)
{
case LightType.Point:
return Quaternion.Identity;
case LightType.Spot:
tx = Vector3.Normalize(Direction.GetPerpVec());
ty = Vector3.Normalize(Vector3.Cross(Direction, Tangent));
break;
case LightType.Capsule:
tx = -Vector3.Normalize(Direction.GetPerpVec());
ty = Vector3.Normalize(Vector3.Cross(Direction, Tangent));
break;
}
var m = new Matrix();
m.Row1 = new Vector4(tx, 0);
m.Row2 = new Vector4(ty, 0);
m.Row3 = new Vector4(Direction, 0);
return Quaternion.RotationMatrix(m);
}
public void SetRotation(Quaternion rot)
{
var inv = Quaternion.Invert(GetRotation());
var delta = rot * inv;
Direction = Vector3.Normalize(delta.Multiply(Direction));
Tangent = Vector3.Normalize(Direction.GetPerpVec());
}
}
@ -5336,7 +5476,7 @@ namespace CodeWalker.GameFiles
// structure data
public ulong NamePointer { get; set; }
public ResourceSimpleList64_s<LightAttributes_s> LightAttributes { get; set; }
public ResourceSimpleList64<LightAttributes> LightAttributes { get; set; }
public ulong UnkPointer { get; set; }
public ulong BoundPointer { get; set; }
@ -5361,7 +5501,7 @@ namespace CodeWalker.GameFiles
// read structure data
this.NamePointer = reader.ReadUInt64();
this.LightAttributes = reader.ReadBlock<ResourceSimpleList64_s<LightAttributes_s>>();
this.LightAttributes = reader.ReadBlock<ResourceSimpleList64<LightAttributes>>();
this.UnkPointer = reader.ReadUInt64();
this.BoundPointer = reader.ReadUInt64();
@ -5431,8 +5571,8 @@ namespace CodeWalker.GameFiles
Bound = Bounds.ReadXmlNode(bnode, this);
}
LightAttributes = new ResourceSimpleList64_s<LightAttributes_s>();
LightAttributes.data_items = XmlMeta.ReadItemArray<LightAttributes_s>(node, "Lights");
LightAttributes = new ResourceSimpleList64<LightAttributes>();
LightAttributes.data_items = XmlMeta.ReadItemArray<LightAttributes>(node, "Lights");
}
public static void WriteXmlNode(Drawable d, StringBuilder sb, int indent, string ddsfolder, string name = "Drawable")

View File

@ -86,7 +86,7 @@ namespace CodeWalker.GameFiles
public ulong DrawableClothPointer { get; set; }
public ulong Unknown_100h; // 0x0000000000000000
public ulong Unknown_108h; // 0x0000000000000000
public ResourceSimpleList64_s<LightAttributes_s> LightAttributes { get; set; }
public ResourceSimpleList64<LightAttributes> LightAttributes { get; set; }
public ulong VehicleGlassWindowsPointer { get; set; }
public ulong Unknown_128h; // 0x0000000000000000
@ -155,7 +155,7 @@ namespace CodeWalker.GameFiles
this.DrawableClothPointer = reader.ReadUInt64();
this.Unknown_100h = reader.ReadUInt64();
this.Unknown_108h = reader.ReadUInt64();
this.LightAttributes = reader.ReadBlock<ResourceSimpleList64_s<LightAttributes_s>>();
this.LightAttributes = reader.ReadBlock<ResourceSimpleList64<LightAttributes>>();
this.VehicleGlassWindowsPointer = reader.ReadUInt64();
this.Unknown_128h = reader.ReadUInt64();
@ -510,8 +510,8 @@ namespace CodeWalker.GameFiles
GlassWindows = new ResourcePointerArray64<FragGlassWindow>();
GlassWindows.data_items = gwinds;
}
LightAttributes = new ResourceSimpleList64_s<LightAttributes_s>();
LightAttributes.data_items = XmlMeta.ReadItemArray<LightAttributes_s>(node, "Lights");
LightAttributes = new ResourceSimpleList64<LightAttributes>();
LightAttributes.data_items = XmlMeta.ReadItemArray<LightAttributes>(node, "Lights");
Cloths = new ResourcePointerList64<EnvironmentCloth>();
var cnode = node.SelectSingleNode("Cloths");
if (cnode != null)

View File

@ -194,7 +194,7 @@ namespace CodeWalker
d.BuildRenderMasks();
d.LightAttributes = new ResourceSimpleList64_s<LightAttributes_s>();
d.LightAttributes = new ResourceSimpleList64<LightAttributes>();
//todo: light attributes?

View File

@ -52,42 +52,49 @@
this.ClipDictComboBox = new System.Windows.Forms.ComboBox();
this.ModelsTreeView = new CodeWalker.WinForms.TreeViewFix();
this.ToolsMaterialsTabPage = new System.Windows.Forms.TabPage();
this.MaterialEditorButton = new System.Windows.Forms.Button();
this.TextureViewerButton = new System.Windows.Forms.Button();
this.TexturesTreeView = new CodeWalker.WinForms.TreeViewFix();
this.ToolsDetailsTabPage = new System.Windows.Forms.TabPage();
this.DetailsPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid();
this.ToolsOptionsTabPage = new System.Windows.Forms.TabPage();
this.OptionsTabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.RenderModeComboBox = new System.Windows.Forms.ComboBox();
this.FragGlassCheckBox = new System.Windows.Forms.CheckBox();
this.label14 = new System.Windows.Forms.Label();
this.HDTexturesCheckBox = new System.Windows.Forms.CheckBox();
this.AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox();
this.SkeletonsCheckBox = new System.Windows.Forms.CheckBox();
this.TimeOfDayLabel = new System.Windows.Forms.Label();
this.label19 = new System.Windows.Forms.Label();
this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar();
this.ControlLightDirCheckBox = new System.Windows.Forms.CheckBox();
this.label10 = new System.Windows.Forms.Label();
this.TextureCoordsComboBox = new System.Windows.Forms.ComboBox();
this.TextureSamplerComboBox = new System.Windows.Forms.ComboBox();
this.label11 = new System.Windows.Forms.Label();
this.WireframeCheckBox = new System.Windows.Forms.CheckBox();
this.ShowCollisionMeshesCheckBox = new System.Windows.Forms.CheckBox();
this.GridCheckBox = new System.Windows.Forms.CheckBox();
this.GridCountComboBox = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.GridSizeComboBox = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.StatusBarCheckBox = new System.Windows.Forms.CheckBox();
this.ErrorConsoleCheckBox = new System.Windows.Forms.CheckBox();
this.GridSizeComboBox = new System.Windows.Forms.ComboBox();
this.StatusBarCheckBox = new System.Windows.Forms.CheckBox();
this.label1 = new System.Windows.Forms.Label();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.DeferredShadingCheckBox = new System.Windows.Forms.CheckBox();
this.HDLightsCheckBox = new System.Windows.Forms.CheckBox();
this.label19 = new System.Windows.Forms.Label();
this.HDRRenderingCheckBox = new System.Windows.Forms.CheckBox();
this.SkydomeCheckBox = new System.Windows.Forms.CheckBox();
this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar();
this.ShadowsCheckBox = new System.Windows.Forms.CheckBox();
this.WireframeCheckBox = new System.Windows.Forms.CheckBox();
this.RenderModeComboBox = new System.Windows.Forms.ComboBox();
this.label11 = new System.Windows.Forms.Label();
this.TextureSamplerComboBox = new System.Windows.Forms.ComboBox();
this.TextureCoordsComboBox = new System.Windows.Forms.ComboBox();
this.label10 = new System.Windows.Forms.Label();
this.AnisotropicFilteringCheckBox = new System.Windows.Forms.CheckBox();
this.label14 = new System.Windows.Forms.Label();
this.ControlLightDirCheckBox = new System.Windows.Forms.CheckBox();
this.SkydomeCheckBox = new System.Windows.Forms.CheckBox();
this.TimeOfDayLabel = new System.Windows.Forms.Label();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.LightEditorButton = new System.Windows.Forms.Button();
this.MaterialEditorButton = new System.Windows.Forms.Button();
this.ToolsPanelHideButton = new System.Windows.Forms.Button();
this.ToolsDragPanel = new System.Windows.Forms.Panel();
this.ToolsPanelShowButton = new System.Windows.Forms.Button();
this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog();
this.FragGlassCheckBox = new System.Windows.Forms.CheckBox();
this.StatusStrip.SuspendLayout();
this.ConsolePanel.SuspendLayout();
this.ToolsPanel.SuspendLayout();
@ -98,7 +105,11 @@
this.ToolsMaterialsTabPage.SuspendLayout();
this.ToolsDetailsTabPage.SuspendLayout();
this.ToolsOptionsTabPage.SuspendLayout();
this.OptionsTabControl.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).BeginInit();
this.tabPage3.SuspendLayout();
this.SuspendLayout();
//
// StatsUpdateTimer
@ -338,7 +349,6 @@
//
// ToolsMaterialsTabPage
//
this.ToolsMaterialsTabPage.Controls.Add(this.MaterialEditorButton);
this.ToolsMaterialsTabPage.Controls.Add(this.TextureViewerButton);
this.ToolsMaterialsTabPage.Controls.Add(this.TexturesTreeView);
this.ToolsMaterialsTabPage.Location = new System.Drawing.Point(4, 22);
@ -349,16 +359,6 @@
this.ToolsMaterialsTabPage.Text = "Materials";
this.ToolsMaterialsTabPage.UseVisualStyleBackColor = true;
//
// MaterialEditorButton
//
this.MaterialEditorButton.Location = new System.Drawing.Point(3, 6);
this.MaterialEditorButton.Name = "MaterialEditorButton";
this.MaterialEditorButton.Size = new System.Drawing.Size(91, 23);
this.MaterialEditorButton.TabIndex = 3;
this.MaterialEditorButton.Text = "Material editor";
this.MaterialEditorButton.UseVisualStyleBackColor = true;
this.MaterialEditorButton.Click += new System.EventHandler(this.MaterialEditorButton_Click);
//
// TextureViewerButton
//
this.TextureViewerButton.Location = new System.Drawing.Point(111, 6);
@ -406,32 +406,7 @@
//
// ToolsOptionsTabPage
//
this.ToolsOptionsTabPage.Controls.Add(this.FragGlassCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.HDTexturesCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.SkeletonsCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.TimeOfDayLabel);
this.ToolsOptionsTabPage.Controls.Add(this.label19);
this.ToolsOptionsTabPage.Controls.Add(this.TimeOfDayTrackBar);
this.ToolsOptionsTabPage.Controls.Add(this.ControlLightDirCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.ShowCollisionMeshesCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.GridCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.GridCountComboBox);
this.ToolsOptionsTabPage.Controls.Add(this.label2);
this.ToolsOptionsTabPage.Controls.Add(this.GridSizeComboBox);
this.ToolsOptionsTabPage.Controls.Add(this.label1);
this.ToolsOptionsTabPage.Controls.Add(this.StatusBarCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.ErrorConsoleCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.HDRRenderingCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.SkydomeCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.ShadowsCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.WireframeCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.RenderModeComboBox);
this.ToolsOptionsTabPage.Controls.Add(this.label11);
this.ToolsOptionsTabPage.Controls.Add(this.TextureSamplerComboBox);
this.ToolsOptionsTabPage.Controls.Add(this.TextureCoordsComboBox);
this.ToolsOptionsTabPage.Controls.Add(this.label10);
this.ToolsOptionsTabPage.Controls.Add(this.AnisotropicFilteringCheckBox);
this.ToolsOptionsTabPage.Controls.Add(this.label14);
this.ToolsOptionsTabPage.Controls.Add(this.OptionsTabControl);
this.ToolsOptionsTabPage.Location = new System.Drawing.Point(4, 22);
this.ToolsOptionsTabPage.Name = "ToolsOptionsTabPage";
this.ToolsOptionsTabPage.Size = new System.Drawing.Size(217, 500);
@ -439,12 +414,93 @@
this.ToolsOptionsTabPage.Text = "Options";
this.ToolsOptionsTabPage.UseVisualStyleBackColor = true;
//
// OptionsTabControl
//
this.OptionsTabControl.Controls.Add(this.tabPage1);
this.OptionsTabControl.Controls.Add(this.tabPage2);
this.OptionsTabControl.Controls.Add(this.tabPage3);
this.OptionsTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.OptionsTabControl.Location = new System.Drawing.Point(0, 0);
this.OptionsTabControl.Name = "OptionsTabControl";
this.OptionsTabControl.SelectedIndex = 0;
this.OptionsTabControl.Size = new System.Drawing.Size(217, 500);
this.OptionsTabControl.TabIndex = 26;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.RenderModeComboBox);
this.tabPage1.Controls.Add(this.FragGlassCheckBox);
this.tabPage1.Controls.Add(this.label14);
this.tabPage1.Controls.Add(this.HDTexturesCheckBox);
this.tabPage1.Controls.Add(this.AnisotropicFilteringCheckBox);
this.tabPage1.Controls.Add(this.SkeletonsCheckBox);
this.tabPage1.Controls.Add(this.label10);
this.tabPage1.Controls.Add(this.TextureCoordsComboBox);
this.tabPage1.Controls.Add(this.TextureSamplerComboBox);
this.tabPage1.Controls.Add(this.label11);
this.tabPage1.Controls.Add(this.WireframeCheckBox);
this.tabPage1.Controls.Add(this.ShowCollisionMeshesCheckBox);
this.tabPage1.Controls.Add(this.GridCheckBox);
this.tabPage1.Controls.Add(this.GridCountComboBox);
this.tabPage1.Controls.Add(this.label2);
this.tabPage1.Controls.Add(this.ErrorConsoleCheckBox);
this.tabPage1.Controls.Add(this.GridSizeComboBox);
this.tabPage1.Controls.Add(this.StatusBarCheckBox);
this.tabPage1.Controls.Add(this.label1);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(209, 474);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Render";
this.tabPage1.UseVisualStyleBackColor = true;
//
// RenderModeComboBox
//
this.RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.RenderModeComboBox.FormattingEnabled = true;
this.RenderModeComboBox.Items.AddRange(new object[] {
"Default",
"Single texture",
"Vertex normals",
"Vertex tangents",
"Vertex colour 1",
"Vertex colour 2",
"Texture coord 1",
"Texture coord 2",
"Texture coord 3"});
this.RenderModeComboBox.Location = new System.Drawing.Point(86, 15);
this.RenderModeComboBox.Name = "RenderModeComboBox";
this.RenderModeComboBox.Size = new System.Drawing.Size(114, 21);
this.RenderModeComboBox.TabIndex = 12;
this.RenderModeComboBox.SelectedIndexChanged += new System.EventHandler(this.RenderModeComboBox_SelectedIndexChanged);
//
// FragGlassCheckBox
//
this.FragGlassCheckBox.AutoSize = true;
this.FragGlassCheckBox.Location = new System.Drawing.Point(6, 218);
this.FragGlassCheckBox.Name = "FragGlassCheckBox";
this.FragGlassCheckBox.Size = new System.Drawing.Size(175, 17);
this.FragGlassCheckBox.TabIndex = 25;
this.FragGlassCheckBox.Text = "Show Fragments Glass Outlines";
this.FragGlassCheckBox.UseVisualStyleBackColor = true;
this.FragGlassCheckBox.CheckedChanged += new System.EventHandler(this.FragGlassCheckBox_CheckedChanged);
//
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(6, 72);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(63, 13);
this.label14.TabIndex = 15;
this.label14.Text = "Tex coords:";
//
// HDTexturesCheckBox
//
this.HDTexturesCheckBox.AutoSize = true;
this.HDTexturesCheckBox.Checked = true;
this.HDTexturesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.HDTexturesCheckBox.Location = new System.Drawing.Point(19, 231);
this.HDTexturesCheckBox.Location = new System.Drawing.Point(6, 149);
this.HDTexturesCheckBox.Name = "HDTexturesCheckBox";
this.HDTexturesCheckBox.Size = new System.Drawing.Size(82, 17);
this.HDTexturesCheckBox.TabIndex = 10;
@ -452,10 +508,23 @@
this.HDTexturesCheckBox.UseVisualStyleBackColor = true;
this.HDTexturesCheckBox.CheckedChanged += new System.EventHandler(this.HDTexturesCheckBox_CheckedChanged);
//
// AnisotropicFilteringCheckBox
//
this.AnisotropicFilteringCheckBox.AutoSize = true;
this.AnisotropicFilteringCheckBox.Checked = true;
this.AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(6, 126);
this.AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox";
this.AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(114, 17);
this.AnisotropicFilteringCheckBox.TabIndex = 9;
this.AnisotropicFilteringCheckBox.Text = "Anisotropic filtering";
this.AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true;
this.AnisotropicFilteringCheckBox.CheckedChanged += new System.EventHandler(this.AnisotropicFilteringCheckBox_CheckedChanged);
//
// SkeletonsCheckBox
//
this.SkeletonsCheckBox.AutoSize = true;
this.SkeletonsCheckBox.Location = new System.Drawing.Point(19, 426);
this.SkeletonsCheckBox.Location = new System.Drawing.Point(6, 195);
this.SkeletonsCheckBox.Name = "SkeletonsCheckBox";
this.SkeletonsCheckBox.Size = new System.Drawing.Size(103, 17);
this.SkeletonsCheckBox.TabIndex = 22;
@ -463,54 +532,65 @@
this.SkeletonsCheckBox.UseVisualStyleBackColor = true;
this.SkeletonsCheckBox.CheckedChanged += new System.EventHandler(this.SkeletonsCheckBox_CheckedChanged);
//
// TimeOfDayLabel
// label10
//
this.TimeOfDayLabel.AutoSize = true;
this.TimeOfDayLabel.Location = new System.Drawing.Point(78, 99);
this.TimeOfDayLabel.Name = "TimeOfDayLabel";
this.TimeOfDayLabel.Size = new System.Drawing.Size(34, 13);
this.TimeOfDayLabel.TabIndex = 5;
this.TimeOfDayLabel.Text = "12:00";
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(6, 18);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(74, 13);
this.label10.TabIndex = 11;
this.label10.Text = "Render mode:";
//
// label19
// TextureCoordsComboBox
//
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(7, 99);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(65, 13);
this.label19.TabIndex = 4;
this.label19.Text = "Time of day:";
this.TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TextureCoordsComboBox.Enabled = false;
this.TextureCoordsComboBox.FormattingEnabled = true;
this.TextureCoordsComboBox.Items.AddRange(new object[] {
"Texture coord 1",
"Texture coord 2",
"Texture coord 3"});
this.TextureCoordsComboBox.Location = new System.Drawing.Point(86, 69);
this.TextureCoordsComboBox.Name = "TextureCoordsComboBox";
this.TextureCoordsComboBox.Size = new System.Drawing.Size(114, 21);
this.TextureCoordsComboBox.TabIndex = 16;
this.TextureCoordsComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureCoordsComboBox_SelectedIndexChanged);
//
// TimeOfDayTrackBar
// TextureSamplerComboBox
//
this.TimeOfDayTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.TimeOfDayTrackBar.LargeChange = 60;
this.TimeOfDayTrackBar.Location = new System.Drawing.Point(9, 115);
this.TimeOfDayTrackBar.Maximum = 1440;
this.TimeOfDayTrackBar.Name = "TimeOfDayTrackBar";
this.TimeOfDayTrackBar.Size = new System.Drawing.Size(188, 45);
this.TimeOfDayTrackBar.TabIndex = 6;
this.TimeOfDayTrackBar.TickFrequency = 60;
this.TimeOfDayTrackBar.Value = 720;
this.TimeOfDayTrackBar.Scroll += new System.EventHandler(this.TimeOfDayTrackBar_Scroll);
this.TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TextureSamplerComboBox.Enabled = false;
this.TextureSamplerComboBox.FormattingEnabled = true;
this.TextureSamplerComboBox.Location = new System.Drawing.Point(86, 42);
this.TextureSamplerComboBox.Name = "TextureSamplerComboBox";
this.TextureSamplerComboBox.Size = new System.Drawing.Size(114, 21);
this.TextureSamplerComboBox.TabIndex = 14;
this.TextureSamplerComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureSamplerComboBox_SelectedIndexChanged);
//
// ControlLightDirCheckBox
// label11
//
this.ControlLightDirCheckBox.AutoSize = true;
this.ControlLightDirCheckBox.Location = new System.Drawing.Point(19, 77);
this.ControlLightDirCheckBox.Name = "ControlLightDirCheckBox";
this.ControlLightDirCheckBox.Size = new System.Drawing.Size(124, 17);
this.ControlLightDirCheckBox.TabIndex = 3;
this.ControlLightDirCheckBox.Text = "Control light direction";
this.ControlLightDirCheckBox.UseVisualStyleBackColor = true;
this.ControlLightDirCheckBox.CheckedChanged += new System.EventHandler(this.ControlLightDirCheckBox_CheckedChanged);
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(6, 45);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(67, 13);
this.label11.TabIndex = 13;
this.label11.Text = "Tex sampler:";
//
// WireframeCheckBox
//
this.WireframeCheckBox.AutoSize = true;
this.WireframeCheckBox.Location = new System.Drawing.Point(6, 103);
this.WireframeCheckBox.Name = "WireframeCheckBox";
this.WireframeCheckBox.Size = new System.Drawing.Size(74, 17);
this.WireframeCheckBox.TabIndex = 8;
this.WireframeCheckBox.Text = "Wireframe";
this.WireframeCheckBox.UseVisualStyleBackColor = true;
this.WireframeCheckBox.CheckedChanged += new System.EventHandler(this.WireframeCheckBox_CheckedChanged);
//
// ShowCollisionMeshesCheckBox
//
this.ShowCollisionMeshesCheckBox.AutoSize = true;
this.ShowCollisionMeshesCheckBox.Location = new System.Drawing.Point(19, 162);
this.ShowCollisionMeshesCheckBox.Location = new System.Drawing.Point(6, 172);
this.ShowCollisionMeshesCheckBox.Name = "ShowCollisionMeshesCheckBox";
this.ShowCollisionMeshesCheckBox.Size = new System.Drawing.Size(132, 17);
this.ShowCollisionMeshesCheckBox.TabIndex = 7;
@ -521,7 +601,7 @@
// GridCheckBox
//
this.GridCheckBox.AutoSize = true;
this.GridCheckBox.Location = new System.Drawing.Point(19, 345);
this.GridCheckBox.Location = new System.Drawing.Point(6, 257);
this.GridCheckBox.Name = "GridCheckBox";
this.GridCheckBox.Size = new System.Drawing.Size(45, 17);
this.GridCheckBox.TabIndex = 17;
@ -538,7 +618,7 @@
"40",
"60",
"100"});
this.GridCountComboBox.Location = new System.Drawing.Point(83, 392);
this.GridCountComboBox.Location = new System.Drawing.Point(86, 308);
this.GridCountComboBox.Name = "GridCountComboBox";
this.GridCountComboBox.Size = new System.Drawing.Size(114, 21);
this.GridCountComboBox.TabIndex = 21;
@ -547,12 +627,23 @@
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(7, 395);
this.label2.Location = new System.Drawing.Point(6, 311);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(59, 13);
this.label2.TabIndex = 20;
this.label2.Text = "Grid count:";
//
// ErrorConsoleCheckBox
//
this.ErrorConsoleCheckBox.AutoSize = true;
this.ErrorConsoleCheckBox.Location = new System.Drawing.Point(94, 476);
this.ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox";
this.ErrorConsoleCheckBox.Size = new System.Drawing.Size(88, 17);
this.ErrorConsoleCheckBox.TabIndex = 24;
this.ErrorConsoleCheckBox.Text = "Error console";
this.ErrorConsoleCheckBox.UseVisualStyleBackColor = true;
this.ErrorConsoleCheckBox.CheckedChanged += new System.EventHandler(this.ErrorConsoleCheckBox_CheckedChanged);
//
// GridSizeComboBox
//
this.GridSizeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
@ -562,27 +653,18 @@
"1.0",
"10",
"100"});
this.GridSizeComboBox.Location = new System.Drawing.Point(83, 365);
this.GridSizeComboBox.Location = new System.Drawing.Point(86, 281);
this.GridSizeComboBox.Name = "GridSizeComboBox";
this.GridSizeComboBox.Size = new System.Drawing.Size(114, 21);
this.GridSizeComboBox.TabIndex = 19;
this.GridSizeComboBox.SelectedIndexChanged += new System.EventHandler(this.GridSizeComboBox_SelectedIndexChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(7, 368);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(70, 13);
this.label1.TabIndex = 18;
this.label1.Text = "Grid unit size:";
//
// StatusBarCheckBox
//
this.StatusBarCheckBox.AutoSize = true;
this.StatusBarCheckBox.Checked = true;
this.StatusBarCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.StatusBarCheckBox.Location = new System.Drawing.Point(19, 480);
this.StatusBarCheckBox.Location = new System.Drawing.Point(8, 476);
this.StatusBarCheckBox.Name = "StatusBarCheckBox";
this.StatusBarCheckBox.Size = new System.Drawing.Size(74, 17);
this.StatusBarCheckBox.TabIndex = 23;
@ -590,23 +672,73 @@
this.StatusBarCheckBox.UseVisualStyleBackColor = true;
this.StatusBarCheckBox.CheckedChanged += new System.EventHandler(this.StatusBarCheckBox_CheckedChanged);
//
// ErrorConsoleCheckBox
// label1
//
this.ErrorConsoleCheckBox.AutoSize = true;
this.ErrorConsoleCheckBox.Location = new System.Drawing.Point(105, 480);
this.ErrorConsoleCheckBox.Name = "ErrorConsoleCheckBox";
this.ErrorConsoleCheckBox.Size = new System.Drawing.Size(88, 17);
this.ErrorConsoleCheckBox.TabIndex = 24;
this.ErrorConsoleCheckBox.Text = "Error console";
this.ErrorConsoleCheckBox.UseVisualStyleBackColor = true;
this.ErrorConsoleCheckBox.CheckedChanged += new System.EventHandler(this.ErrorConsoleCheckBox_CheckedChanged);
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(6, 284);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(70, 13);
this.label1.TabIndex = 18;
this.label1.Text = "Grid unit size:";
//
// tabPage2
//
this.tabPage2.Controls.Add(this.DeferredShadingCheckBox);
this.tabPage2.Controls.Add(this.HDLightsCheckBox);
this.tabPage2.Controls.Add(this.label19);
this.tabPage2.Controls.Add(this.HDRRenderingCheckBox);
this.tabPage2.Controls.Add(this.TimeOfDayTrackBar);
this.tabPage2.Controls.Add(this.ShadowsCheckBox);
this.tabPage2.Controls.Add(this.ControlLightDirCheckBox);
this.tabPage2.Controls.Add(this.SkydomeCheckBox);
this.tabPage2.Controls.Add(this.TimeOfDayLabel);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(209, 474);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Lighting";
this.tabPage2.UseVisualStyleBackColor = true;
//
// DeferredShadingCheckBox
//
this.DeferredShadingCheckBox.AutoSize = true;
this.DeferredShadingCheckBox.Location = new System.Drawing.Point(7, 6);
this.DeferredShadingCheckBox.Name = "DeferredShadingCheckBox";
this.DeferredShadingCheckBox.Size = new System.Drawing.Size(107, 17);
this.DeferredShadingCheckBox.TabIndex = 36;
this.DeferredShadingCheckBox.Text = "Deferred shading";
this.DeferredShadingCheckBox.UseVisualStyleBackColor = true;
this.DeferredShadingCheckBox.CheckedChanged += new System.EventHandler(this.DeferredShadingCheckBox_CheckedChanged);
//
// HDLightsCheckBox
//
this.HDLightsCheckBox.AutoSize = true;
this.HDLightsCheckBox.Checked = true;
this.HDLightsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.HDLightsCheckBox.Location = new System.Drawing.Point(7, 98);
this.HDLightsCheckBox.Name = "HDLightsCheckBox";
this.HDLightsCheckBox.Size = new System.Drawing.Size(69, 17);
this.HDLightsCheckBox.TabIndex = 35;
this.HDLightsCheckBox.Text = "HD lights";
this.HDLightsCheckBox.UseVisualStyleBackColor = true;
this.HDLightsCheckBox.CheckedChanged += new System.EventHandler(this.HDLightsCheckBox_CheckedChanged);
//
// label19
//
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(4, 147);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(65, 13);
this.label19.TabIndex = 4;
this.label19.Text = "Time of day:";
//
// HDRRenderingCheckBox
//
this.HDRRenderingCheckBox.AutoSize = true;
this.HDRRenderingCheckBox.Checked = true;
this.HDRRenderingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.HDRRenderingCheckBox.Location = new System.Drawing.Point(19, 14);
this.HDRRenderingCheckBox.Location = new System.Drawing.Point(7, 29);
this.HDRRenderingCheckBox.Name = "HDRRenderingCheckBox";
this.HDRRenderingCheckBox.Size = new System.Drawing.Size(97, 17);
this.HDRRenderingCheckBox.TabIndex = 0;
@ -614,23 +746,27 @@
this.HDRRenderingCheckBox.UseVisualStyleBackColor = true;
this.HDRRenderingCheckBox.CheckedChanged += new System.EventHandler(this.HDRRenderingCheckBox_CheckedChanged);
//
// SkydomeCheckBox
// TimeOfDayTrackBar
//
this.SkydomeCheckBox.AutoSize = true;
this.SkydomeCheckBox.Location = new System.Drawing.Point(19, 56);
this.SkydomeCheckBox.Name = "SkydomeCheckBox";
this.SkydomeCheckBox.Size = new System.Drawing.Size(70, 17);
this.SkydomeCheckBox.TabIndex = 2;
this.SkydomeCheckBox.Text = "Skydome";
this.SkydomeCheckBox.UseVisualStyleBackColor = true;
this.SkydomeCheckBox.CheckedChanged += new System.EventHandler(this.SkydomeCheckBox_CheckedChanged);
this.TimeOfDayTrackBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.TimeOfDayTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.TimeOfDayTrackBar.LargeChange = 60;
this.TimeOfDayTrackBar.Location = new System.Drawing.Point(3, 163);
this.TimeOfDayTrackBar.Maximum = 1440;
this.TimeOfDayTrackBar.Name = "TimeOfDayTrackBar";
this.TimeOfDayTrackBar.Size = new System.Drawing.Size(205, 45);
this.TimeOfDayTrackBar.TabIndex = 6;
this.TimeOfDayTrackBar.TickFrequency = 60;
this.TimeOfDayTrackBar.Value = 720;
this.TimeOfDayTrackBar.Scroll += new System.EventHandler(this.TimeOfDayTrackBar_Scroll);
//
// ShadowsCheckBox
//
this.ShadowsCheckBox.AutoSize = true;
this.ShadowsCheckBox.Checked = true;
this.ShadowsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.ShadowsCheckBox.Location = new System.Drawing.Point(19, 35);
this.ShadowsCheckBox.Location = new System.Drawing.Point(7, 52);
this.ShadowsCheckBox.Name = "ShadowsCheckBox";
this.ShadowsCheckBox.Size = new System.Drawing.Size(70, 17);
this.ShadowsCheckBox.TabIndex = 1;
@ -638,102 +774,68 @@
this.ShadowsCheckBox.UseVisualStyleBackColor = true;
this.ShadowsCheckBox.CheckedChanged += new System.EventHandler(this.ShadowsCheckBox_CheckedChanged);
//
// WireframeCheckBox
// ControlLightDirCheckBox
//
this.WireframeCheckBox.AutoSize = true;
this.WireframeCheckBox.Location = new System.Drawing.Point(19, 185);
this.WireframeCheckBox.Name = "WireframeCheckBox";
this.WireframeCheckBox.Size = new System.Drawing.Size(74, 17);
this.WireframeCheckBox.TabIndex = 8;
this.WireframeCheckBox.Text = "Wireframe";
this.WireframeCheckBox.UseVisualStyleBackColor = true;
this.WireframeCheckBox.CheckedChanged += new System.EventHandler(this.WireframeCheckBox_CheckedChanged);
this.ControlLightDirCheckBox.AutoSize = true;
this.ControlLightDirCheckBox.Location = new System.Drawing.Point(7, 121);
this.ControlLightDirCheckBox.Name = "ControlLightDirCheckBox";
this.ControlLightDirCheckBox.Size = new System.Drawing.Size(124, 17);
this.ControlLightDirCheckBox.TabIndex = 3;
this.ControlLightDirCheckBox.Text = "Control light direction";
this.ControlLightDirCheckBox.UseVisualStyleBackColor = true;
this.ControlLightDirCheckBox.CheckedChanged += new System.EventHandler(this.ControlLightDirCheckBox_CheckedChanged);
//
// RenderModeComboBox
// SkydomeCheckBox
//
this.RenderModeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.RenderModeComboBox.FormattingEnabled = true;
this.RenderModeComboBox.Items.AddRange(new object[] {
"Default",
"Single texture",
"Vertex normals",
"Vertex tangents",
"Vertex colour 1",
"Vertex colour 2",
"Texture coord 1",
"Texture coord 2",
"Texture coord 3"});
this.RenderModeComboBox.Location = new System.Drawing.Point(83, 255);
this.RenderModeComboBox.Name = "RenderModeComboBox";
this.RenderModeComboBox.Size = new System.Drawing.Size(114, 21);
this.RenderModeComboBox.TabIndex = 12;
this.RenderModeComboBox.SelectedIndexChanged += new System.EventHandler(this.RenderModeComboBox_SelectedIndexChanged);
this.SkydomeCheckBox.AutoSize = true;
this.SkydomeCheckBox.Location = new System.Drawing.Point(7, 75);
this.SkydomeCheckBox.Name = "SkydomeCheckBox";
this.SkydomeCheckBox.Size = new System.Drawing.Size(70, 17);
this.SkydomeCheckBox.TabIndex = 2;
this.SkydomeCheckBox.Text = "Skydome";
this.SkydomeCheckBox.UseVisualStyleBackColor = true;
this.SkydomeCheckBox.CheckedChanged += new System.EventHandler(this.SkydomeCheckBox_CheckedChanged);
//
// label11
// TimeOfDayLabel
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(7, 285);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(67, 13);
this.label11.TabIndex = 13;
this.label11.Text = "Tex sampler:";
this.TimeOfDayLabel.AutoSize = true;
this.TimeOfDayLabel.Location = new System.Drawing.Point(75, 147);
this.TimeOfDayLabel.Name = "TimeOfDayLabel";
this.TimeOfDayLabel.Size = new System.Drawing.Size(34, 13);
this.TimeOfDayLabel.TabIndex = 5;
this.TimeOfDayLabel.Text = "12:00";
//
// TextureSamplerComboBox
// tabPage3
//
this.TextureSamplerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TextureSamplerComboBox.Enabled = false;
this.TextureSamplerComboBox.FormattingEnabled = true;
this.TextureSamplerComboBox.Location = new System.Drawing.Point(83, 282);
this.TextureSamplerComboBox.Name = "TextureSamplerComboBox";
this.TextureSamplerComboBox.Size = new System.Drawing.Size(114, 21);
this.TextureSamplerComboBox.TabIndex = 14;
this.TextureSamplerComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureSamplerComboBox_SelectedIndexChanged);
this.tabPage3.Controls.Add(this.LightEditorButton);
this.tabPage3.Controls.Add(this.MaterialEditorButton);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(209, 474);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "Editors";
this.tabPage3.UseVisualStyleBackColor = true;
//
// TextureCoordsComboBox
// LightEditorButton
//
this.TextureCoordsComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TextureCoordsComboBox.Enabled = false;
this.TextureCoordsComboBox.FormattingEnabled = true;
this.TextureCoordsComboBox.Items.AddRange(new object[] {
"Texture coord 1",
"Texture coord 2",
"Texture coord 3"});
this.TextureCoordsComboBox.Location = new System.Drawing.Point(83, 309);
this.TextureCoordsComboBox.Name = "TextureCoordsComboBox";
this.TextureCoordsComboBox.Size = new System.Drawing.Size(114, 21);
this.TextureCoordsComboBox.TabIndex = 16;
this.TextureCoordsComboBox.SelectedIndexChanged += new System.EventHandler(this.TextureCoordsComboBox_SelectedIndexChanged);
this.LightEditorButton.Location = new System.Drawing.Point(6, 35);
this.LightEditorButton.Name = "LightEditorButton";
this.LightEditorButton.Size = new System.Drawing.Size(197, 23);
this.LightEditorButton.TabIndex = 37;
this.LightEditorButton.Text = "Light editor";
this.LightEditorButton.UseVisualStyleBackColor = true;
this.LightEditorButton.Click += new System.EventHandler(this.LightEditorButton_Click);
//
// label10
// MaterialEditorButton
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(7, 258);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(74, 13);
this.label10.TabIndex = 11;
this.label10.Text = "Render mode:";
//
// AnisotropicFilteringCheckBox
//
this.AnisotropicFilteringCheckBox.AutoSize = true;
this.AnisotropicFilteringCheckBox.Checked = true;
this.AnisotropicFilteringCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.AnisotropicFilteringCheckBox.Location = new System.Drawing.Point(19, 208);
this.AnisotropicFilteringCheckBox.Name = "AnisotropicFilteringCheckBox";
this.AnisotropicFilteringCheckBox.Size = new System.Drawing.Size(114, 17);
this.AnisotropicFilteringCheckBox.TabIndex = 9;
this.AnisotropicFilteringCheckBox.Text = "Anisotropic filtering";
this.AnisotropicFilteringCheckBox.UseVisualStyleBackColor = true;
this.AnisotropicFilteringCheckBox.CheckedChanged += new System.EventHandler(this.AnisotropicFilteringCheckBox_CheckedChanged);
//
// label14
//
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(7, 312);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(63, 13);
this.label14.TabIndex = 15;
this.label14.Text = "Tex coords:";
this.MaterialEditorButton.Location = new System.Drawing.Point(6, 6);
this.MaterialEditorButton.Name = "MaterialEditorButton";
this.MaterialEditorButton.Size = new System.Drawing.Size(197, 23);
this.MaterialEditorButton.TabIndex = 3;
this.MaterialEditorButton.Text = "Material editor";
this.MaterialEditorButton.UseVisualStyleBackColor = true;
this.MaterialEditorButton.Click += new System.EventHandler(this.MaterialEditorButton_Click);
//
// ToolsPanelHideButton
//
@ -772,17 +874,6 @@
//
this.SaveFileDialog.Filter = "All files|*.*";
//
// FragGlassCheckBox
//
this.FragGlassCheckBox.AutoSize = true;
this.FragGlassCheckBox.Location = new System.Drawing.Point(19, 449);
this.FragGlassCheckBox.Name = "FragGlassCheckBox";
this.FragGlassCheckBox.Size = new System.Drawing.Size(175, 17);
this.FragGlassCheckBox.TabIndex = 25;
this.FragGlassCheckBox.Text = "Show Fragments Glass Outlines";
this.FragGlassCheckBox.UseVisualStyleBackColor = true;
this.FragGlassCheckBox.CheckedChanged += new System.EventHandler(this.FragGlassCheckBox_CheckedChanged);
//
// ModelForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -819,8 +910,13 @@
this.ToolsMaterialsTabPage.ResumeLayout(false);
this.ToolsDetailsTabPage.ResumeLayout(false);
this.ToolsOptionsTabPage.ResumeLayout(false);
this.ToolsOptionsTabPage.PerformLayout();
this.OptionsTabControl.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage1.PerformLayout();
this.tabPage2.ResumeLayout(false);
this.tabPage2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).EndInit();
this.tabPage3.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@ -886,5 +982,12 @@
private System.Windows.Forms.Label label21;
private System.Windows.Forms.ComboBox ClipDictComboBox;
private System.Windows.Forms.CheckBox FragGlassCheckBox;
private System.Windows.Forms.TabControl OptionsTabControl;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.CheckBox HDLightsCheckBox;
private System.Windows.Forms.CheckBox DeferredShadingCheckBox;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.Button LightEditorButton;
}
}

View File

@ -103,6 +103,13 @@ namespace CodeWalker.Forms
ModelMatForm materialForm = null;
bool modelModified = false;
TransformWidget Widget = new TransformWidget();
TransformWidget GrabbedWidget = null;
ModelLightForm lightForm = null;
bool editingLights = false;
public LightAttributes selectedLight = null;
public bool showLightGizmos = true;
ExploreForm exploreForm = null;
RpfFileEntry rpfFileEntry = null;
@ -166,6 +173,13 @@ namespace CodeWalker.Forms
return;
}
Widget.Position = new Vector3(0f, 0f, 0f);
Widget.Rotation = Quaternion.Identity;
Widget.Scale = Vector3.One;
Widget.Visible = false;
Widget.OnPositionChange += Widget_OnPositionChange;
Widget.OnRotationChange += Widget_OnRotationChange;
ShaderParamNames[] texsamplers = RenderableGeometry.GetTextureSamplerList();
foreach (var texsampler in texsamplers)
{
@ -259,6 +273,7 @@ namespace CodeWalker.Forms
Renderer.Update(elapsed, MouseLastPoint.X, MouseLastPoint.Y);
UpdateWidgets();
Renderer.BeginRender(context);
@ -270,6 +285,7 @@ namespace CodeWalker.Forms
RenderGrid(context);
RenderLightSelection();
Renderer.RenderQueued();
@ -277,6 +293,7 @@ namespace CodeWalker.Forms
Renderer.RenderFinalPass();
RenderWidgets();
Renderer.EndRender();
@ -520,10 +537,98 @@ namespace CodeWalker.Forms
}
}
public void SetCameraPosition(Vector3 p, float distance = 2.0f)
{
Renderer.camera.FollowEntity.Position = p;
camera.TargetDistance = distance;
}
private void RenderLightSelection()
{
if (editingLights)
{
if (selectedLight != null)
{
if (showLightGizmos)
{
Renderer.RenderSelectionDrawableLight(selectedLight);
}
}
}
}
private void RenderWidgets()
{
if (Widget.Visible)
{
Renderer.RenderTransformWidget(Widget);
}
}
private void UpdateWidgets()
{
Widget.Update(camera);
}
public void UpdateWidget(bool rotate = false)
{
if(selectedLight != null)
{
if (!rotate)
{
SetWidgetPosition(selectedLight.Position);
}
else
{
SetWidgetRotation(selectedLight.GetRotation());
}
}
}
public void SetWidgetPosition(Vector3 pos)
{
SetWidgetMode("Position");
Widget.Position = pos;
}
public void SetWidgetRotation(Quaternion q)
{
SetWidgetMode("Rotation");
Widget.Rotation = q;
}
public void SetWidgetMode(string mode)
{
lock (Renderer.RenderSyncRoot)
{
switch (mode)
{
case "Default":
Widget.Mode = WidgetMode.Default;
break;
case "Position":
Widget.Mode = WidgetMode.Position;
break;
case "Rotation":
Widget.Mode = WidgetMode.Rotation;
break;
case "Scale":
Widget.Mode = WidgetMode.Scale;
break;
}
}
}
private void Widget_OnPositionChange(Vector3 newpos, Vector3 oldpos)
{
//called during UpdateWidgets()
if (newpos == oldpos) return;
if (selectedLight == null || lightForm == null || !editingLights) return;
selectedLight.Position = newpos;
selectedLight.HasChanged = true;
}
private void Widget_OnRotationChange(Quaternion newrot, Quaternion oldrot)
{
//called during UpdateWidgets()
if (newrot == oldrot) return;
if (selectedLight == null || lightForm == null || !editingLights) return;
selectedLight.SetRotation(newrot);
selectedLight.HasChanged = true;
}
private void RenderSingleItem()
@ -631,6 +736,11 @@ namespace CodeWalker.Forms
MoveCameraToView(ydr.Drawable.BoundingCenter, ydr.Drawable.BoundingSphereRadius);
}
if(ydr.Drawable?.LightAttributes.data_items.Length > 0)
{
DeferredShadingCheckBox.Checked = true;
}
UpdateModelsUI(ydr.Drawable);
}
public void LoadModels(YddFile ydd)
@ -651,6 +761,15 @@ namespace CodeWalker.Forms
MoveCameraToView(Vector3.Zero, maxrad);
}
foreach(var draw in ydd.Drawables)
{
if (draw?.LightAttributes.data_items.Length > 0)
{
DeferredShadingCheckBox.Checked = true;
break;
}
}
UpdateModelsUI(ydd.Dict);
DetailsPropertyGrid.SelectedObject = ydd;
@ -680,6 +799,11 @@ namespace CodeWalker.Forms
MoveCameraToView(dr.BoundingCenter, dr.BoundingSphereRadius);
}
if (yft.Fragment?.LightAttributes.data_items.Length > 0)
{
DeferredShadingCheckBox.Checked = true;
}
UpdateModelsUI(yft.Fragment?.Drawable, yft.Fragment);
}
public void LoadModel(YbnFile ybn)
@ -1220,7 +1344,13 @@ namespace CodeWalker.Forms
}
public void OnLightFormClosed()
{
lightForm = null;
editingLights = false;
selectedLight = null;
Widget.Visible = false;
}
public void OnMaterialFormClosed()
{
@ -1409,6 +1539,23 @@ namespace CodeWalker.Forms
MouseDownPoint = e.Location;
MouseLastPoint = MouseDownPoint;
if (MouseLButtonDown)
{
if (Widget.IsUnderMouse && !Input.kbmoving)
{
GrabbedWidget = Widget;
GrabbedWidget.IsDragging = true;
}
}
else
{
if (GrabbedWidget != null)
{
GrabbedWidget.IsDragging = false;
GrabbedWidget = null;
}
}
if (MouseRButtonDown)
{
@ -1427,11 +1574,20 @@ namespace CodeWalker.Forms
case MouseButtons.Right: MouseRButtonDown = false; break;
}
if (e.Button == MouseButtons.Left)
{
if (GrabbedWidget != null)
{
GrabbedWidget.IsDragging = false;
//GrabbedWidget.Position = SelectedItem.WidgetPosition;//in case of any snapping, make sure widget is in correct position at the end
GrabbedWidget = null;
lightForm.UpdateUI(); //do this so position and direction textboxes are updated after a drag
}
}
//lock (MouseControlSyncRoot)
//{
// MouseControlButtons &= ~e.Button;
//}
}
private void ModelForm_MouseMove(object sender, MouseEventArgs e)
@ -1446,7 +1602,10 @@ namespace CodeWalker.Forms
if (MouseLButtonDown)
{
camera.MouseRotate(dx, dy);
if (GrabbedWidget == null)
{
camera.MouseRotate(dx, dy);
}
}
if (MouseRButtonDown)
{
@ -1979,6 +2138,59 @@ namespace CodeWalker.Forms
}
private void LightEditorButton_Click(object sender, EventArgs e)
{
DrawableBase drawable = null;
Dictionary<uint, Drawable> dict = null;
if ((Ydr != null) && (Ydr.Loaded))
{
drawable = Ydr.Drawable;
}
else if ((Ydd != null) && (Ydd.Loaded))
{
dict = Ydd.Dict;
}
else if ((Yft != null) && (Yft.Loaded))
{
drawable = Yft.Fragment?.Drawable;
}
else if ((Ypt != null) && (Ypt.Loaded))
{
//dict = Ypt.DrawableDict;
}
else
{
MessageBox.Show("Light editor not supported for the current file.");
}
if (lightForm == null)
{
lightForm = new ModelLightForm(this);
if (drawable != null)
{
lightForm.LoadModel(drawable);
}
else if (dict != null)
{
lightForm.LoadModels(dict);
}
editingLights = true;
Widget.Visible = true;
lightForm.Show(this);
}
else
{
if (lightForm.WindowState == FormWindowState.Minimized)
{
lightForm.WindowState = FormWindowState.Normal;
}
lightForm.Focus();
}
}
private void SaveButton_ButtonClick(object sender, EventArgs e)
{
Save();
@ -2008,5 +2220,15 @@ namespace CodeWalker.Forms
{
EnableRootMotion = EnableRootMotionCheckBox.Checked;
}
private void DeferredShadingCheckBox_CheckedChanged(object sender, EventArgs e)
{
Renderer.shaders.deferred = DeferredShadingCheckBox.Checked;
}
private void HDLightsCheckBox_CheckedChanged(object sender, EventArgs e)
{
Renderer.renderlights = HDLightsCheckBox.Checked;
}
}
}

1183
CodeWalker/Forms/ModelLightForm.Designer.cs generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,877 @@
using CodeWalker.GameFiles;
using SharpDX;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeWalker.Forms
{
public partial class ModelLightForm : Form
{
private ModelForm ModelForm;
private Drawable Drawable;
private FragDrawable FragDrawable;
private Dictionary<uint, Drawable> DrawableDict;
LightAttributes selectedLight = null;
bool populatingui = false;
public ModelLightForm(ModelForm modelForm)
{
InitializeComponent();
ModelForm = modelForm;
}
public void LoadModel(DrawableBase drawable)
{
LightsTreeView.Nodes.Clear();
LightsTreeView.ShowRootLines = false;
var dr = drawable as Drawable;
var fr = drawable as FragDrawable;
if (dr != null)
{
Drawable = dr;
var lights = dr.LightAttributes;
if (lights != null)
{
AddLightsTreeNodes(lights.data_items);
}
}
else if (fr != null)
{
FragDrawable = fr;
var lights = fr.OwnerFragment?.LightAttributes;
if (lights != null)
{
AddLightsTreeNodes(lights.data_items);
}
}
}
public void LoadModels(Dictionary<uint, Drawable> dict)
{
DrawableDict = dict;
LightsTreeView.Nodes.Clear();
if (dict != null)
{
foreach (var kvp in dict)
{
MetaHash mhash = new MetaHash(kvp.Key);
var drawable = kvp.Value;
var dnode = LightsTreeView.Nodes.Add(mhash.ToString());
dnode.Tag = drawable;
var lights = drawable.LightAttributes.data_items;
if(lights != null)
{
AddLightsTreeNodes(lights, dnode);
}
dnode.Expand();
}
}
}
private void AddLightsTreeNodes(LightAttributes[] lights, TreeNode parent = null)
{
if (lights == null) return;
for (int mi = 0; mi < lights.Length; mi++)
{
var tnc = LightsTreeView.Nodes;
var light = lights[mi];
string mprefix = "Light" + (mi + 1).ToString();
var mnode = parent == null ? tnc.Add(mprefix) : parent.Nodes.Add(mprefix);
mnode.Tag = light;
mnode.Expand();
}
}
public void UpdateUI()
{
var light = selectedLight;
if(light == null)
{
populatingui = true;
PositionTextBox.Text = "";
DirectionTextBox.Text = "";
TypeComboBox.SelectedItem = "Point";
ColourRUpDown.Value = 0;
ColourGUpDown.Value = 0;
ColourBUpDown.Value = 0;
IntensityUpDown.Value = 0;
FlashinessTextBox.Text = "";
BoneIDTextBox.Text = "";
GroupIDTextBox.Text = "";
FalloffTextBox.Text = "";
FalloffExponentTextBox.Text = "";
InnerAngleUpDown.Value = 0;
OuterAngleUpDown.Value = 0;
CoronaSizeTextBox.Text = "";
CoronaIntensityUpDown.Value = 0;
ExtentTextBox.Text = "";
ShadowBlurTextBox.Text = "";
LightFadeDistanceTextBox.Text = "";
CoronaZBiasTextBox.Text = "";
HashTextBox.Text = "";
VolumeIntensityTextBox.Text = "";
VolumeSizeScaleTextBox.Text = "";
VolumeColorRUpDown.Value = 0;
VolumeColorGUpDown.Value = 0;
VolumeColorBUpDown.Value = 0;
VolumeOuterExponentTextBox.Text = "";
ShadowFadeDistanceTextBox.Text = "";
SpecularFadeDistanceTextBox.Text = "";
VolumetricFadeDistanceTextBox.Text = "";
ShadowNearClipTextBox.Text = "";
CullingPlaneNormalTextBox.Text = "";
CullingPlaneOffsetTextBox.Text = "";
TimeFlagsTextBox.Text = "";
populatingui = false;
}
else
{
populatingui = true;
PositionTextBox.Text = FloatUtil.GetVector3String(light.Position);
DirectionTextBox.Text = FloatUtil.GetVector3String(light.Direction);
TypeComboBox.SelectedItem = light.Type.ToString();
ColourRUpDown.Value = light.ColorR;
ColourGUpDown.Value = light.ColorG;
ColourBUpDown.Value = light.ColorB;
ColourLabel.BackColor = System.Drawing.Color.FromArgb(light.ColorR, light.ColorG, light.ColorB);
IntensityUpDown.Value = (decimal)light.Intensity > IntensityUpDown.Maximum ? IntensityUpDown.Maximum : (decimal)light.Intensity;
FlashinessTextBox.Text = FloatUtil.ToString(light.Flashiness);
BoneIDTextBox.Text = FloatUtil.ToString(light.BoneId);
GroupIDTextBox.Text = FloatUtil.ToString(light.GroupId);
FalloffTextBox.Text = FloatUtil.ToString(light.Falloff);
FalloffExponentTextBox.Text = FloatUtil.ToString(light.FalloffExponent);
InnerAngleUpDown.Value = (decimal)light.ConeInnerAngle > InnerAngleUpDown.Maximum ? InnerAngleUpDown.Maximum : (decimal)light.ConeInnerAngle;
OuterAngleUpDown.Value = (decimal)light.ConeOuterAngle > OuterAngleUpDown.Maximum ? OuterAngleUpDown.Maximum : (decimal)light.ConeOuterAngle;
CoronaSizeTextBox.Text = FloatUtil.ToString(light.CoronaSize);
CoronaIntensityUpDown.Value = (decimal)light.CoronaIntensity > CoronaIntensityUpDown.Maximum ? CoronaIntensityUpDown.Maximum : (decimal)light.CoronaIntensity;
ExtentTextBox.Text = FloatUtil.GetVector3String(light.Extent);
ShadowBlurTextBox.Text = FloatUtil.ToString(light.ShadowBlur);
LightFadeDistanceTextBox.Text = FloatUtil.ToString(light.LightFadeDistance);
CoronaZBiasTextBox.Text = FloatUtil.ToString(light.CoronaZBias);
HashTextBox.Text = light.ProjectedTextureHash.Hash.ToString();
VolumeIntensityTextBox.Text = FloatUtil.ToString(light.VolumeIntensity);
VolumeSizeScaleTextBox.Text = FloatUtil.ToString(light.VolumeSizeScale);
VolumeColorRUpDown.Value = light.VolumeOuterColorR;
VolumeColorGUpDown.Value = light.VolumeOuterColorG;
VolumeColorBUpDown.Value = light.VolumeOuterColorB;
VolumeColorLabel.BackColor = System.Drawing.Color.FromArgb(light.VolumeOuterColorR, light.VolumeOuterColorG, light.VolumeOuterColorB);
VolumeOuterExponentTextBox.Text = FloatUtil.ToString(light.VolumeOuterExponent);
ShadowFadeDistanceTextBox.Text = FloatUtil.ToString(light.ShadowFadeDistance);
SpecularFadeDistanceTextBox.Text = FloatUtil.ToString(light.SpecularFadeDistance);
VolumetricFadeDistanceTextBox.Text = FloatUtil.ToString(light.VolumetricFadeDistance);
ShadowNearClipTextBox.Text = FloatUtil.ToString(light.ShadowNearClip);
CullingPlaneNormalTextBox.Text = FloatUtil.GetVector3String(light.CullingPlaneNormal);
CullingPlaneOffsetTextBox.Text = FloatUtil.ToString(light.CullingPlaneOffset);
TimeFlagsTextBox.Text = light.TimeFlags.ToString();
UpdateFlagsCheckBoxes();
populatingui = false;
}
}
public void UpdateLightParams()
{
selectedLight.HasChanged = true;
}
private LightAttributes NewLightAttribute()
{
LightAttributes light = new LightAttributes();
light.Direction = Vector3.BackwardLH;
light.Tangent = Vector3.Normalize(Vector3.BackwardLH.GetPerpVec());
light.Intensity = 20;
light.ConeInnerAngle = 5;
light.ConeOuterAngle = 35;
light.Extent = Vector3.One;
light.Type = LightType.Spot;
light.Falloff = 10;
light.ColorR = 255;
light.ColorG = 255;
light.ColorB = 255;
return light;
}
private void SelectLight(LightAttributes light)
{
if (light == null)
{
selectedLight = null;
ModelForm.selectedLight = null;
UpdateUI();
ModelForm.UpdateWidget();
}
else
{
selectedLight = light;
ModelForm.selectedLight = light;
UpdateUI();
ModelForm.UpdateWidget();
}
}
private void CreateLight()
{
if(Drawable != null)
{
List<LightAttributes> lights = Drawable.LightAttributes.data_items.ToList();
lights.Add(NewLightAttribute());
Drawable.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModel(Drawable);
}
else if(FragDrawable != null)
{
List<LightAttributes> lights = FragDrawable.OwnerFragment.LightAttributes.data_items.ToList();
lights.Add(NewLightAttribute());
FragDrawable.OwnerFragment.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModel(FragDrawable);
}
else
{
var n = LightsTreeView.SelectedNode;
if (n != null)
{
var dr = n.Tag as Drawable;
if (dr == null) { dr = n.Parent.Tag as Drawable; } //try parent node tag also
if (dr!= null)
{
List<LightAttributes> lights = dr.LightAttributes.data_items.ToList();
lights.Add(NewLightAttribute());
dr.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModels(DrawableDict);
}
}
}
}
private void DeleteLight()
{
if (selectedLight == null) return;
if(Drawable != null)
{
List<LightAttributes> lights = Drawable.LightAttributes.data_items.ToList();
lights.Remove(selectedLight);
Drawable.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModel(Drawable);
}
else if(FragDrawable != null)
{
List<LightAttributes> lights = FragDrawable.OwnerFragment.LightAttributes.data_items.ToList();
lights.Remove(selectedLight);
FragDrawable.OwnerFragment.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModel(Drawable);
}
else
{
var dr = LightsTreeView.SelectedNode.Parent.Tag as Drawable;
if (dr != null)
{
List<LightAttributes> lights = dr.LightAttributes.data_items.ToList();
lights.Remove(selectedLight);
dr.LightAttributes.data_items = lights.ToArray();
UpdateLightParams();
LoadModels(DrawableDict);
}
}
}
private void UpdateFlagsCheckBoxes()
{
var l = selectedLight;
var tfam = (l.TimeFlags >> 0) & 0xFFF;
var tfpm = (l.TimeFlags >> 12) & 0xFFF;
for (int i = 0; i < TimeFlagsAMCheckedListBox.Items.Count; i++)
{
TimeFlagsAMCheckedListBox.SetItemCheckState(i, ((tfam & (1u << i)) > 0) ? CheckState.Checked : CheckState.Unchecked);
}
for (int i = 0; i < TimeFlagsPMCheckedListBox.Items.Count; i++)
{
TimeFlagsPMCheckedListBox.SetItemCheckState(i, ((tfpm & (1u << i)) > 0) ? CheckState.Checked : CheckState.Unchecked);
}
}
private uint GetFlagsFromItemCheck(CheckedListBox clb, ItemCheckEventArgs e)
{
uint flags = 0;
for (int i = 0; i < clb.Items.Count; i++)
{
if ((e != null) && (e.Index == i))
{
if (e.NewValue == CheckState.Checked)
{
flags += (uint)(1 << i);
}
}
else
{
if (clb.GetItemChecked(i))
{
flags += (uint)(1 << i);
}
}
}
return flags;
}
private void UpdateColour()
{
if (populatingui) return;
var r = (byte)ColourRUpDown.Value;
var g = (byte)ColourGUpDown.Value;
var b = (byte)ColourBUpDown.Value;
ColourLabel.BackColor = System.Drawing.Color.FromArgb(r, g, b);
if (selectedLight != null)
{
selectedLight.ColorR = r;
selectedLight.ColorG = g;
selectedLight.ColorB = b;
UpdateLightParams();
}
}
private void UpdateVolumeColour()
{
if (populatingui) return;
var r = (byte)VolumeColorRUpDown.Value;
var g = (byte)VolumeColorGUpDown.Value;
var b = (byte)VolumeColorBUpDown.Value;
VolumeColorLabel.BackColor = System.Drawing.Color.FromArgb(r, g, b);
if (selectedLight != null)
{
selectedLight.VolumeOuterColorR = r;
selectedLight.VolumeOuterColorG = g;
selectedLight.VolumeOuterColorB = b;
}
}
private void LightsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
SelectLight(e.Node.Tag as LightAttributes);
}
private void ModelLightForm_FormClosed(object sender, FormClosedEventArgs e)
{
ModelForm.OnLightFormClosed();
}
private void GoToButton_Click(object sender, EventArgs e)
{
ModelForm.SetCameraPosition(selectedLight.Position, selectedLight.Falloff * 2f);
}
private void NormalizeDirectionButton_Click(object sender, EventArgs e)
{
Vector3 d = Vector3.Normalize(FloatUtil.ParseVector3String(DirectionTextBox.Text));
DirectionTextBox.Text = FloatUtil.GetVector3String(d);
}
private void PositionTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
Vector3 v = FloatUtil.ParseVector3String(PositionTextBox.Text);
if (selectedLight.Position != v)
{
selectedLight.Position = v;
UpdateLightParams();
}
}
private void TypeComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
string type = TypeComboBox.Text;
switch (type)
{
case "Point":
selectedLight.Type = LightType.Point;
break;
case "Capsule":
selectedLight.Type = LightType.Capsule;
break;
default:
selectedLight.Type = LightType.Spot;
break;
}
UpdateLightParams();
}
private void IntensityUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(IntensityUpDown.Text);
if (selectedLight.Intensity != v)
{
selectedLight.Intensity = v;
UpdateLightParams();
}
}
private void ColourRUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateColour();
}
private void ColourGUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateColour();
}
private void ColourBUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateColour();
}
private void ColourLabel_Click(object sender, EventArgs e)
{
var colDiag = new ColorDialog { Color = ColourLabel.BackColor };
if (colDiag.ShowDialog(this) == DialogResult.OK)
{
var c = colDiag.Color;
ColourRUpDown.Value = c.R;
ColourGUpDown.Value = c.G;
ColourBUpDown.Value = c.B;
}
}
private void FalloffTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(FalloffTextBox.Text);
if (selectedLight.Falloff != v)
{
selectedLight.Falloff = v;
UpdateLightParams();
}
}
private void FalloffExponentTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(FalloffExponentTextBox.Text);
if (selectedLight.FalloffExponent != v)
{
selectedLight.FalloffExponent = v;
UpdateLightParams();
}
}
private void InnerAngleUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(InnerAngleUpDown.Text);
if (selectedLight.ConeInnerAngle != v)
{
selectedLight.ConeInnerAngle = v;
UpdateLightParams();
}
}
private void OuterAngleUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(OuterAngleUpDown.Text);
if (selectedLight.ConeOuterAngle != v)
{
selectedLight.ConeOuterAngle = v;
UpdateLightParams();
}
}
private void CoronaIntensityUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(CoronaIntensityUpDown.Text);
if (selectedLight.CoronaIntensity != v)
{
selectedLight.CoronaIntensity = v;
UpdateLightParams();
}
}
private void CoronaSizeTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(CoronaSizeTextBox.Text);
if (selectedLight.CoronaSize != v)
{
selectedLight.CoronaSize = v;
UpdateLightParams();
}
}
private void DirectionTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
Vector3 v = FloatUtil.ParseVector3String(DirectionTextBox.Text);
if (selectedLight.Direction != v)
{
selectedLight.Direction = v;
selectedLight.Tangent = Vector3.Normalize(selectedLight.Direction.GetPerpVec());
UpdateLightParams();
}
}
private void FlashinessTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(FlashinessTextBox.Text);
if (selectedLight.Flashiness != v)
{
selectedLight.Flashiness = (byte)v;
UpdateLightParams();
}
}
private void BoneIDTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(BoneIDTextBox.Text);
if (selectedLight.BoneId != v)
{
selectedLight.BoneId = (ushort)v;
UpdateLightParams();
}
}
private void GroupIDTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(GroupIDTextBox.Text);
if (selectedLight.GroupId != v)
{
selectedLight.GroupId = (byte)v;
UpdateLightParams();
}
}
private void ExtentTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
Vector3 v = FloatUtil.ParseVector3String(ExtentTextBox.Text);
if (selectedLight.Extent != v)
{
selectedLight.Extent = v;
UpdateLightParams();
}
}
private void ShadowBlurTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(ShadowBlurTextBox.Text);
if (selectedLight.ShadowBlur != v)
{
selectedLight.ShadowBlur = (byte)v;
UpdateLightParams();
}
}
private void LightFadeDistanceTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(LightFadeDistanceTextBox.Text);
if (selectedLight.LightFadeDistance != v)
{
selectedLight.LightFadeDistance = (byte)v;
UpdateLightParams();
}
}
private void CoronaZBiasTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(CoronaZBiasTextBox.Text);
if (selectedLight.CoronaZBias != v)
{
selectedLight.CoronaZBias = v;
UpdateLightParams();
}
}
private void VolumeIntensityTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(VolumeIntensityTextBox.Text);
if (selectedLight.VolumeIntensity != v)
{
selectedLight.VolumeIntensity = v;
UpdateLightParams();
}
}
private void VolumeSizeScaleTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(VolumeSizeScaleTextBox.Text);
if (selectedLight.VolumeSizeScale != v)
{
selectedLight.VolumeSizeScale = v;
UpdateLightParams();
}
}
private void VolumeOuterExponentTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(VolumeOuterExponentTextBox.Text);
if (selectedLight.VolumeOuterExponent != v)
{
selectedLight.VolumeOuterExponent = v;
UpdateLightParams();
}
}
private void ShadowFadeDistanceTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(ShadowFadeDistanceTextBox.Text);
if (selectedLight.ShadowFadeDistance != v)
{
selectedLight.ShadowFadeDistance = (byte)v;
UpdateLightParams();
}
}
private void SpecularFadeDistanceTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(SpecularFadeDistanceTextBox.Text);
if (selectedLight.SpecularFadeDistance != v)
{
selectedLight.SpecularFadeDistance = (byte)v;
UpdateLightParams();
}
}
private void VolumetricFadeDistance_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(VolumetricFadeDistanceTextBox.Text);
if (selectedLight.VolumetricFadeDistance != v)
{
selectedLight.VolumetricFadeDistance = (byte)v;
UpdateLightParams();
}
}
private void ShadowNearClipTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(ShadowNearClipTextBox.Text);
if (selectedLight.ShadowNearClip != v)
{
selectedLight.ShadowNearClip = v;
UpdateLightParams();
}
}
private void VolumeColorLabel_Click(object sender, EventArgs e)
{
var colDiag = new ColorDialog { Color = ColourLabel.BackColor };
if (colDiag.ShowDialog(this) == DialogResult.OK)
{
var c = colDiag.Color;
VolumeColorRUpDown.Value = c.R;
VolumeColorGUpDown.Value = c.G;
VolumeColorBUpDown.Value = c.B;
}
}
private void VolumeColorRUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateVolumeColour();
}
private void VolumeColorGUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateVolumeColour();
}
private void VolumeColorBUpDown_ValueChanged(object sender, EventArgs e)
{
UpdateVolumeColour();
}
private void TimeFlagsTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
uint.TryParse(TimeFlagsTextBox.Text, out uint v);
if (selectedLight.TimeFlags != v)
{
selectedLight.TimeFlags = v;
}
populatingui = true;
UpdateFlagsCheckBoxes();
populatingui = false;
}
private void TimeFlagsAMCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
var tfam = GetFlagsFromItemCheck(TimeFlagsAMCheckedListBox, e);
var tfpm = GetFlagsFromItemCheck(TimeFlagsPMCheckedListBox, null);
var v = tfam + (tfpm << 12);
if (selectedLight.TimeFlags != v)
{
selectedLight.TimeFlags = v;
}
populatingui = true;
TimeFlagsTextBox.Text = selectedLight.TimeFlags.ToString();
populatingui = false;
}
private void TimeFlagsPMCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
var tfam = GetFlagsFromItemCheck(TimeFlagsAMCheckedListBox, null);
var tfpm = GetFlagsFromItemCheck(TimeFlagsPMCheckedListBox, e);
var v = tfam + (tfpm << 12);
if (selectedLight.TimeFlags != v)
{
selectedLight.TimeFlags = v;
}
populatingui = true;
TimeFlagsTextBox.Text = selectedLight.TimeFlags.ToString();
populatingui = false;
}
private void HashTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
uint.TryParse(HashTextBox.Text, out uint v);
if (selectedLight.ProjectedTextureHash != v)
{
selectedLight.ProjectedTextureHash = v;
}
}
private void CullingPlaneNormalTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
Vector3 v = FloatUtil.ParseVector3String(CullingPlaneNormalTextBox.Text);
if (selectedLight.CullingPlaneNormal != v)
{
selectedLight.CullingPlaneNormal = v;
}
}
private void CullingPlaneOffsetTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (selectedLight == null) return;
float v = FloatUtil.Parse(CullingPlaneOffsetTextBox.Text);
if (selectedLight.CullingPlaneOffset != v)
{
selectedLight.CullingPlaneOffset = v;
UpdateLightParams();
}
}
private void lightToolStripMenuItem_Click(object sender, EventArgs e)
{
CreateLight();
}
private void deleteLightToolStripMenuItem_Click(object sender, EventArgs e)
{
DeleteLight();
}
private void showGizmosToolStripMenuItem_Click(object sender, EventArgs e)
{
showGizmosToolStripMenuItem.Checked = !showGizmosToolStripMenuItem.Checked;
ModelForm.showLightGizmos = showGizmosToolStripMenuItem.Checked;
}
private void moveToolStripMenuItem_Click(object sender, EventArgs e)
{
moveToolStripMenuItem.Checked = !moveToolStripMenuItem.Checked;
if (moveToolStripMenuItem.Checked)
{
moveToolStripMenuItem.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
rotateToolStripMenuItem.Checked = false;
rotateToolStripMenuItem.BackColor = System.Drawing.SystemColors.Control;
ModelForm.SetWidgetMode("Position");
}
else
{
moveToolStripMenuItem.BackColor = System.Drawing.SystemColors.Control;
ModelForm.SetWidgetMode("Default");
}
}
private void rotateToolStripMenuItem_Click(object sender, EventArgs e)
{
rotateToolStripMenuItem.Checked = !rotateToolStripMenuItem.Checked;
if (rotateToolStripMenuItem.Checked)
{
rotateToolStripMenuItem.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
moveToolStripMenuItem.Checked = false;
moveToolStripMenuItem.BackColor = System.Drawing.SystemColors.Control;
ModelForm.SetWidgetMode("Rotation");
}
else
{
rotateToolStripMenuItem.BackColor = System.Drawing.SystemColors.Control;
ModelForm.SetWidgetMode("Default");
}
}
}
}

View File

@ -0,0 +1,436 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStripFix1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="moveToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAAKtJREFUOE+lUlsOgCAM40iegcPxz0n9IfwqXTatk5EYmzQM1paHphlaa1vvfS+l
HCBqrGl7DTbnnIWfQrzZh6gsxhBdBjZjRE9lT9ixIQB1tyuA15T3dfydVShhHDDTSMiksaQPSbbgCfGs
ZsL7PwDHsJBaq4hXNC3GMd+jRxTaTjb35teXYCFGDuDgwfivNKPtxjV6KouBdDZzCHoqi+HfhM3hsT04
ZG1O6QTGlgf4FZ9QVAAAAABJRU5ErkJggg==
</value>
</data>
<data name="rotateToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAAVFJREFUOE99kzFug0AQRTlCjpAj5AgRPVJadyno6alSubXokVK65Aa4pqKhDz3F
FhgoN/PWO3hNiFf62tGfP3/ZnSH6b03T9DXPswXEnn6+lmV5F/H3OI4/TdPYw+HgQAxHDo2X35eQr5K8
cNowDLYoChvH8QPgyPkvuhhjXtZiIQ0Ckl3X2TRN/xjAkUNTliW7eIiJBBUEIpJJkti6rp1Ii4nhyKFR
jithsArDOM9zd3dAvKchXg2Ox+NDEnAiCDk0aDV2Bpwge7s12AMagfE1NwN/ujOgbXuFQL8yqLlf4Xw+
O2LbRn1UoJ1CS+7BAGRZ5oRwPB6t0508BmhU7wwYivBETQjavu93ZwJQQ210vV7fRGz0ZQEGFG87oPD3
N9S6afQmrfYcg60p0Nngv1iLwyVj/SmFFQZqGk5kYH7yJc8Xs46JdsH/TJXc/eOmiKJfGa9fWzDSupYA
AAAASUVORK5CYII=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>42</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA
AABAAAAAAQAYAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////v8/u3v+Pn6//7+////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//7+/vX3/rzA3OHl9fz9////////////////////////////////////////////////////////////
//////////////////////////////////////////////////7//+zv+3Z6qcLI5Pr7////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////7+/+br+15in6+33vf5//////////////////7+//7+////////////////////
//////////////////////////////3+//v8//v8//3+//////////////////////7+/+Ho+1dana20
4/b4//////////z9//P2/+Tp/ezw/vz9//////////////////////////////////////////7///X4
/9Pa+tPa+/H1//z9//////////////////7+/93k+SsscaSr3PX3//////7+//L1/7W98AcWgrvC8Pj6
//////////////////////////////////////////7+/+bs/xohiAEJdrvF9+7y//z9////////////
//7+/9rh+CEkapmh0/T3//////j6/9HZ/AEHcgEEb9LZ+/r7////////////////////////////////
//////////7//+/z/3F+zAAAXwQLcZai3fb4//////////////3+/97l/E9Tmaau4fT3/////+/0/1dd
sAAAV7a/8/H1//7+//////////////////////////////////////////////r8/+jv/46Y3QUUf6Ot
5PX4//////////////3+/9zj+3Z6wLe/7fX4//////D0/212xnaAzerw//z9////////////////////
//////////////////////////////////v8/+/z/+Dm+/D0//z9//////////7+//j6/9Pd+UhLjb/H
9/D0//3+//n7/+nt/+jt//n7////////////////////////////////////////////////////////
//7///7+//7+//7+//////////r8/+7z/83W+ImU2A0UdFNarr/K9env//X4//z9//3+//7/////////
//////////////////////////////////////////////////////////////////7///j6/+Pq/255
xhckjE5XsVVftUlTqwAKeTA9nr3H8+7z//v8////////////////////////////////////////////
//////////////////////////////7+//b4/9Tc+Sc0mRonj8rV/crX/ZSb48rX/brG8wwWgQAEdJei
4efu//n7//7+//z9//z9//z9//z9//3+//////////////////////////////3+//f5/+3y/+nv/+ft
/8vV+io2mImU2M7c/7vG9yIvlQAOfCg4mM3Y/s/c/4aR1AQRfGtzwtni/ebt/9vi/tri/tXd+9Tc+O3x
/vz9//////////////////////////n6/87V+FVftkRPrFlnvSEqjQoUfmJvwWFvvg0TfQQIcxEchwAD
cy89n19rvVVitQwZgwAAaiMrkT9NqTVBoiw3mhQihig1mNLX+fv8//////////////////////////b5
/52l4EFLqoCK03yF0VBctGhyw52o5GVrvQAAaneBzsHM+jA3mhYgiTtIpJOf3ouW2AAAbmh0wbbA8bS+
7qiz5pCb16+56e/z//3+//////////////////////////v8//H1/+vw/+zx/+nv/7/J9YqP3MbP/8LM
+hwqkFZftaCp5EhRrcTQ+9jj/8rW/UJMqn6J0ebt//X3//f5//b4//X3//f5//z9////////////////
//////////7+//z9//3+//////////3+/+7z/6at64iP3aWs7XN8zRIfhyUykp2o5MHM+oKM0xonjY6X
2+jv//v8//////7+//n7//b5//r7//7///////////////////7+//f5/+rw/9Pa9fL0/v7/////////
//v8//H1/+Tr/7i/91liu0NPq0VQrS06m0NNqDdCoYqU1+nv//v8//////////n7/9zi/qSt59ri/fL1
//v8//7///////z9//D0/8rT+h0sjkVQrPD0//////////////////////z9/+7z/8LL9Jqk4aGq6LW/
8c3W9+Xs/vH1//v8//////////////f5/6at5gAAbxIfh6u16+Po/fr7//////b5/6ev5gAIeAAPernC
8fX4//////////3+//v8//z9//////3+//j6//P3//P2//b4//r8//7+//7+//v8//r8//3+//////v8
/+Xr/nuIzwAAbBseg5Sb2fb5//////f5/8DF8pWe3d/n/vT3//39//////v8/+zx/87V9+3x/v3+////
//3+//j6//X4//v8//////////n7/+Dm/snR9fD0//39//z8/fv8/+3y/8LK9aGq4dfd9/n7//////z9
//b5//X4//v8//////////7+/+7z/4aP1gEPet7k/f39//////f5/83U+ZCZ2u3x/v7+//////P3/215
wgAJd7fB8/L1//7+//////3+//j6//f5//r8//7+//////////////////////////////j6/87W/AAA
X2duue3y//7+//////D0/05asBQfidzj/P39//////X4/6Su6AAAXBccgtff/vv8////////////////
//////////////////////////////////////P3/3F8xhYli9Xe/fn6/////////+3y/1pltQAJd9be
/fv8//////z9/+rw/36I0Bknjs/W+vv8////////////////////////////////////////////////
//////f5/8HI7tnf+/X4//7+/////////+/0/3R7xgAAb9ng/Pz9//////////n7/+Ln/dLY+fP2//3+
//////////////////////////////////////////////////////3+//r7//v8//7+////////////
//b4/7/F84eP0e/0//7+//////////7+//z9//v8//3+////////////////////////////////////
//////////////////////////////////////////////////z9//b5//X4//v8////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////w////4
P///+D////g8//D4MH/geCB/4Dggf+A4IH/wOCD/+DAB//hgAf//gAP//wAAB/AAAAPwAAAD8AAAA/AA
AAfjAAEHgYADAQPgBwEDEAEBAghgAQwIIEH8CCB//Bggf/wYMH/8ODD///h/////////////KAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///+vv/fL1/v///wAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4+Vx7/F5v///wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP///4CHtrS62////////////////////wAAAAAAAAAAAP////H0/vf6/v//
/////////4yTwrrB4f///+zw+7rA6P39/////wAAAAAAAAAAAP///56l2BkcguXr/P///////42Uw8jO
6P///ysvjWVqtP///////wAAAAAAAAAAAP////D0/0hPpsDG6////////6y02d7k8////3qAx+/z/f//
/wAAAAAAAAAAAAAAAAAAAP///////////////8zT8V5ns1Rcrdzh9f///////////wAAAAAAAAAAAAAA
AAAAAP////////7+/6ix3nmBxFthtmdwu09WqbC54/v9//r8//j6//39/wAAAAAAAAAAAOjt/H6I0FJc
skpSqHF+wRMahFZhs4iT1AsNc1pgrm52v2RsuO/z/gAAAP////////L2/cLJ7rrD64+V4DY+ozU+mYmU
0X2Hy1hfss7V8urv/PP2/v///wAAAP///+Pp+d/k9////////+Pp/4uR3ysymW14xYOM0fD0/P///+Xq
+ri/6Pj6/wAAAOrv/j5DnbS75P////////////X4/+/0/ubr+/r7/////////9rh+hgZhKGo2QAAAPDz
/eLn+f////j6/2Nqttrg9////+Hn+P3+//3+/1hescLJ6/////L2/eru/AAAAAAAAAAAAP///8rR70tR
p/3+//v8/zY6jNPY7////09WqWpwu////wAAAAAAAAAAAAAAAAAAAAAAAPb4/vr7//////v8/5Wd1eHm
+P////v8//T3/wAAAAAAAAAAAAAAAP//AAD8PwAA/D8AAPwDAACAAwAAgAMAAIAHAADABwAAwAEAAMAB
AAAAAQAAAAEAAAABAAAAAQAAwAcAAOAPAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////v7//f7//P3//P3//P3/
/f7//v7/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////v7//P3/
+fv/+fv/+Pr/+fv/+vv//P3//v//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////f7/+fr/8/b/7PL/5+3/6e/+9Pf/+vv//v7/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////P3/9/r/6O7/cXe1UVaet7z17fL/+Pr//f3/////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////+/z/9Pj/4Oj/NzyCUlOd2dz/6O//9Pf//P3/////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////+vv/8vb/2+P9X2OmREGLnqPd
4+v/8vb/+/z/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////+vv/8fb/
1N35bXK1JSRtbHGz5O7/8fX/+/z/////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////+vv/8PX/3Ob/U1eaDwtXjZLT4+z/8fX/+/z/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////+vv/8fb/2eP+MjR6AAA+c3i34Or/8fX/+/z/////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////+vv/8vb/1d/7MS91AAA1UFSS4On/8vb/+/z/////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////+vv/8fb/2OL+NjZ7AAArX2Ok
4uz/8fX/+/z/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////+vv/8fb/
2eP/LjJ1DAxKfYTE4Or/8fX/+/z//////////////////////////////v7//v7//f7//f7//v7//v//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////+vv/8PX/3OX/gILIR0eVeoHC3eb/8fX/+/z//////////////////////v7//P3/+fv/+Pr/
+Pr/+Pr/+vv//P3//v7/////////////////////////////////////////////////////////////
/////////////////////////////v7//f7//P3/+vv/+vv/+/z//f3//v7/////////////////////
////////////////////////+vv/8PX/2eP9ZWeqHx1obnOz4Or/8fX/+/z//////////////////v7/
+/z/9fj/8vb/8PX/7vT/8fb/9fj/+fr//f7/////////////////////////////////////////////
/////////////////////////////////////////v///P3/+Pr/9fj/9fj/9Pj/9Pf/9vn/+/z//v7/
////////////////////////////////////////+vv/8fb/2eP9ODp9AAA5jZDQ5O7/8PX/+/z/////
/////////v7/+/z/9Pf/7fP/5u//wsz6j5XfuMDx7fL/9vn//P3/////////////////////////////
/////////////////////////////////////////////////////////f7/+Pr/8/b/5+3/2eH/2uP/
5u3/7fP/8/b/+vv//f7/////////////////////////////////////+vv/8PX/3ef/U1ebBgVKio/O
4uz/8fX/+/z//////////v///P3/9fj/7fP/4uv/hIzZHSWPAABmU1i14ub/9/r/+/z/////////////
/////////////////////////////////////////////////////////////////////////P3/9Pf/
7/X/09z/TlSzNzWYj5bh5O7/6/L/8vb/+fv//f7/////////////////////////////////+vv/8fX/
2eP/QUWIEhBZbnSz3uj/8fb/+/z//////////f7/+Pr/7/T/6PH/iI7cAABvAABqAABncXjK6O//9fj/
+/z/////////////////////////////////////////////////////////////////////////////
////////+/z/8/f/2uD/Z27EAABnAABiBgl4jJTd5vD/6O//8vX/+fv//f7/////////////////////
////////+vv/8fb/2OP/Mjd6AQE6ZGup4er/8fX/+/z/////////+vz/8fX/6/T/xM/8ExyJAABwAABu
GySRxc387fT/9ff//P3/////////////////////////////////////////////////////////////
////////////////////////+vz/8/f/1Nr/MzqhAABhAxOBAARyBgp5jpLg5Oz/7PP/9Pf/+vz//v7/
////////////////////////+vv/8fb/2eP/KCtvBwZOjJHS4Or/8fX/+/z//////f7/9/n/7fP/3+j/
UFq3AABtAAZ3BAh6mZ/n5vD/7vP/+Pr//v7/////////////////////////////////////////////
////////////////////////////////////////+/z/9Pj/6e//sbb1KzWcAABwBhaBAAFyAgp6fITR
1d777/T/+Pr//f7/////////////////////////+vv/8PX/3+j/WF2hBglTnaTj5O3/8PX/+/z/////
/P3/9Pf/6vL/k5riAAByAAR0AABrY2vE4ur/6vH/9ff//P3/////////////////////////////////
/////////////////////////////////////////////////////////f3/9/n/7fL/5O3/ytX/RU6w
AABpAA5+AABuAABnhord6e7/+fv//f7/////////////////////////+vv/7/T/3+j/k5jbT1KdgYjJ
3uf+8fX/+/z/////+/z/9fn/4ef/NDqhAABnAABrJjCU0Nn/5/D/8fX/+vv//v7/////////////////
/////////////////////////////////////////////////////////////////////////v7/+/z/
9vn/7vP/6vP/ztb/O0CmAABpAABrQkuoxMn57PH/+Pr//f7/////////////////////////+vv/8PX/
2+X/en/CUFGak5nY3+j/8fX//P3//////P3/9fj/4en/i5DbNT2hIyuTpqzv4uz/7vP/9/n//f7/////
////////////////////////////////////////////////////////////////////////////////
/////////////v7//P3/9vn/7/P/6vL/ytH/X2i9XWi7wsf/6e//8/f/+Pr//v7/////////////////
////////+vv/8PX/3OX/WF2hW1ylvMD+3uf/8PX/+/z//////f7/9vn/7fP/4uj/j5Pgf4LV3+X/6fD/
9Pf//P3/////////////////////////////////////////////////////////////////////////
/////////////////////////////////v///P3/+Pr/8vX/7fP/5+//5u7/6vD/8PT/9vn//P3//v7/
/////////////////////f7/9/n/7fP/0tz9LDJzNjh/nqTk2uT/7fL/9/n//f7//f7/+fv/8/b/7PL/
3eX/zM//5ev/9fj/+fv//v7/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////v///f3/+vv/9/n/9vn/9fj/9vn/
+fr//P3//v7//////////////v///f7/+vv/9vn/7/T/5vD/2Ob/VFubERNdoajk4u//5O7/7vP/9vj/
+fr/+vv/+Pr/9fj/9Pj/9fj/9fj/+Pr//P3/////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////v///v7/
/f7//P3//P3//f3//v7//v///////////////f7/+vz/9vn/8fX/7vT/5O3/3eb/z9n/cHjICxN5d37L
z9n/2eP/5O3/6/L/8PT/9Pf/9/n/+vv/+vv/+/z//P3//f3//v7/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////P3/+Pr/8/b/7vT/6vL/z9r+jZjeQUeq
IiuQCBN3AAFrBRB8Nj2iUViym6XlydH/4+z/6/L/8PT/9/n/+/z//f7//v//////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////f3/9/n/8fX/6/L/3uf/
mKTkLzibAABoAAB0Fx+HDBh7FSGDAg16AABYAABlCBB/Ji2UhYza1+D/6PL/7fL/9Pf/+vv//f7/////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////v7//P3/9/n/
8PT/7PT/z9j/XmO+AABtAABcMDSXoajsu8X7VV+5hYzblZ/fTVSxFSKMAABkAABnAAN2Qkmpsbrz5e3/
6vH/8fX/+Pr//P3//v//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////P3/9/n/8PX/7PT/vcn3LTOZAABaAgR1ZWzD0Nf/5vL/1OP/l53lzs3/6fP/4+7/sLzwZ23CBxSD
AABnAABlHiaSmqHo3+j/5+//7/T/9vn//P3//v7/////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////v7/
/v7//v7//v7//f7/+/z/9vj/7vP/7PX/tcLzEBeGAABkPEWlqLPt2eX/4e7/3On/uMX1gofVe3vPhYzY
z93+5/X/4e3/lJ3gHiOPAABtAABqChiEbHLIytD/5/D/7PL/8/f/+Pr/+fr/+Pr/+Pr/+Pr/+Pr/+Pr/
+Pr/+fv/+vv/+/z//f7//v7/////////////////////////////////////////////////////////
/v7//f7/+/z/+fv/9/n/9vj/9fj/9Pf/8fX/7PL/4uv/l6HgDhF7AAN4iZDe0d7/3uz/4vD/w83/VVm3
ICiSAAFyAABlAABwaHTD1N//2un/3er/w838ZW3BEyOJJzKVAQ16NDmfwsn75fD/5u7/7PL/7vP/7fP/
7fP/7fL/7fP/7vP/7/T/8fb/9Pj/9vn/+fr//f3//v//////////////////////////////////////
/////////////v7//P3/+Pr/9Pf/8fX/7vT/7PL/6/L/6fH/5u7/6vX/tsD0CQx4AAFwkZvi7ff/4vD/
4fD/z9j/OkGlAABiAABwBxWAAAt7BBN+P0uofYLUztb/4O7/6fb/6fP/qa7xQkyoBg56AABqMjugx8/+
5fH/4Ov/4On/3uj/3eb/3+j/3uj/1+L/0d3/1d7/3+f/7fL/9vj/+vz//v7/////////////////////
/////////////////////////////f7/+fr/8/f/6/L/2d//v8j6vcf5ucP1wMv8wM3+vMj6PkqoAABo
UF25usP7tsPyvsr6sLrwQ0utAABqAAV1OUameIDRKDWZAAd2GyeOLDecmaHntsL0pbLom6riq7LzUlu0
AANzBhR/AAZ0NT+ja3bBY2i/XGG6UViyWl65XGG7XGC6TVWvQU6pPkalODygqK7p8vb/+vz//v7/////
/////////////////////////////////////////////P3/9/n/7/T/wcj2R0ysExeFERmGDxuIFB6K
FBqICxSEAABsAAByDBiDCRSBBRCADhaFCRODAAh4AxF/AAl4CxeDHSaPAAp6AAN0AA19AAd3CBOBEBqH
BhGBAAh5AABwAAByAAh5BhSCAxWCAABsAABvAABlAABnAABxAABjAABmAABhAABdAABYAABhCAt/q7Lr
8/f/+vv//v7//////////////////////////////////////////////////P3/+fv/3uT/SE2vAABn
CBB/GiCMLzmfLTWcGByJFRyKGCOOMj2gHymRDxiGGyOPLDCXBRF/AAh3BhaCEyKMICqTKC2WNDqfIzCV
Awx6Eh+JHiaPAAR3AAZ5CxSDICWQX2q7Q1CqAA1+AAFxDxuHiZTbVGC4dHnQnabrTVqzY23EUV62Slau
LjaZXWm9sLjz5ez/9vn/+fv//v7//////////////////////////////////////////////////P3/
+Pv/4+n+e4LPfoPVpqv2vsf/zNX/zdb/xtH/v8v8pK7spKfysLb3vcr4ws784ej/hI/YAAZ1AAJzVF25
yM//3Of/5+//i5LcAABpMzyfp6vxoKznlqHhqbbtx9H/8fz/kpvfAABiAABph4zc5PD/2OP/193/3un/
1+D/2OH/1+D/0Nr/zNL/3+j/6/L/7/T/9vn//P3//v//////////////////////////////////////
/////////////f7/+Pr/9Pf/6vD/5u3/3+b/4uv/6PD/5+//5O3/5/P/sL3sXmS7mZzoz9f/3+z/4e//
mKLiEiKKCBF/KTWZr7T06/f/3ev/VF2zChSBipPcz9v+4u7/3ur/3ev/5/X/qrPrISmSDRJ2Xmq/3ur/
4uv/6vH/7fP/7fL/7/T/7vP/7fP/7fP/8PX/8fX/9Pf/+Pr/+/z//v7/////////////////////////
/////////////////////////////v7//P3/+Pr/9vn/9Pf/8vb/8vb/8/b/9Pf/7/T/6/L/tL/ubXLH
en/Ti43gqavy0t3/nafjMj6fJzaaAAV1GyeOYmW7Nz6fAABgNj6i1N//3uz/2uX/3Oj/5PH/wcj7FR2J
AAN0gong0tr/6fH/7/P/9vj/+Pr/+fv/+fv/+Pr/+Pr/+Pr/+fv/+vv//P3//f7//v//////////////
/////////////////////////////////////////////////v7//f7//P3/+/z/+/z/+/z//f3//f7/
+fv/8fX/5Oz/jpbfc3jObnXLcXfOk5rks7b4iY3dR1KvDhuEAABoAABlEBV9U12ytcD13Or/3en/3ej/
1eL/q7fvGR+MKDKZbnnNxc/76PD/8fX/+fr//f7//v///////v7//f7//f3//P3//f3//f7//v//////
/////////////////////////////////////////////////////v7//f7//P3//P3//f7//v7/////
/////////////////f7/9vn/7/T/yNH5lJrleoDVmZ3pmpzpc3nPfoTWf4bYVFy3HSaLZ3PGsrb8v8r8
y9n9q7jre4LRf4fUgIvXAwZ1AABrhYjb0NX/6PH/8PX/+Pr//f7//////////v///f3/+vv/+Pr/9/r/
9/n/+Pr/+/z//f7//v7//////////////////////////////////////v///f7/+/z/+fr/9vj/9/n/
+vz/+vv/+/z//v7//////////////////v7/+vz/8/f/7PL/2uT/t8H1srP6vcH+nKTnSlOxV2C7TVaz
WGS8QUqmSlSuSFOtR1GtbXTKVl23ARB5AAh2AABnd33P3eP/4ur/7/T/9/n//P3//////////////P3/
9/n/8vb/7PH/6fD/7PL/7vP/8vb/9vn/+/z//f7//////////////////////////////v7/+/z/+Pr/
8/b/7/T/8Pb/6vH/3eP97vL++fr//P3//////////////////////f7/+vv/9fj/7/T/5+//z9f+t7v4
uLn9Z2zFLzucFCGIMz6gGCCMAAd4AAl2Dx2EER+GXWK8c3XLKzKXd4LP4er/6/L/8PX/9/n//P3//v//
/////////v7/+fv/8/b/7PP/y9H/i4/erLbt4er/5e3/7fP/8/b/+fv//f3//v7/////////////////
/v7/+/z/9vj/8PT/6/L/3+n/x9H9aHTAZGvG3+b9+Pr/+/z//////////////////////////v7/+/z/
+Pr/8vb/6/H/3OX+wMn4maDmdHrPWGG6T1a1eoHWcHfOTlayUlq1SlKubHjAxMj/0dn/4+v/7PL/8vb/
+Pr//P3//v7//////////////f7/+fr/7vP/xsv5YGXAHymRKjKYYWS9rbLz4u3/6/P/8vb/+fr//f7/
/////////////v//+/z/9vj/7fL/5e3/xs7/Y23BIiiSAABeLTab3+b/9/r/+/z/////////////////
/////////////////f7/+vz/9vj/8PX/6vH/3eb/ydL8xM/6uMPyt733w8j/zNb/1Nz/3OT/4uz/5u7/
7fP/8vb/9vj/+vz//f7//////////////////////f7/+fv/7vP/jpHiAAJ1CxaBER6GAABoFRmGbXbH
0Nf/7PL/9fj//P3//////////////v7/+fv/8/f/4Of/hYvbKDGZAABuAABdAAZyi5La5+7/9vn/+/z/
/////////////////////////////////////v7//P3/+fv/9ff/8vb/7/X/7fP/6/L/5u3/5ez/6fD/
7PP/7/T/8fX/9Pf/9/n/+vv//P3//v7//v///////////////////////v7/+fv/8fb/2eH9fIbQExqH
AABrAAp6AAFyAABwS0+uztX39vn/+vz//////////////f7/+Pr/8ff/qbLpAABrAABhAABwDBWAfobX
5e3/8PX/9vn//f3//////////v///f7/+/z/+vv/+vv/+vz//P3//v7//v///v7//P3/+vz/+Pr/9/n/
9vj/9vj/9vj/9vj/9/n/+fr/+/z//P3//f7//v7//f7//P3/+/z/+vz/+/z//P3//v7//////v7/+/z/
9fj/7/T/5/H/uML1U1e1AAh5AABuAABvMjmdv8bz9vr/+vv//////////////f7/+fv/7/T/iY7aDxSA
GiONa3XHsr7w4Oj/6/H/9Pf/+vz//v7//////v///P3/+Pr/9Pf/8/f/9fj/9fj/9vn/+/z//v7/////
/////////v7//f7//P3/+/z/+/z//P3//f7//v///////////////v7/+/z/9/n/9vn/9vn/9Pj/9vn/
+/z//v7//////f7/+vz/9fj/7/T/6vL/3ef/i5PbGRqJBQl5jJbZ6vH/9Pj/+/z//////////////f7/
+fv/8fT/1Nn9t7/0wcr54er/7fT/8fX/9fj/+vv//f7//////////f3/+Pr/8PT/6/L/3uX/ztb/5Or/
8/f/+Pr//f7//////////////f7/+vz/+Pr/+fv/+fv/+vv//f3//v///////////////P3/9/n/7vL/
193/ztf/5u3/7vP/9Pf/+/z//v7//////v7//P3/+Pr/8fX/7PP/5/D/sLfxoKnk4+r/8vf/9/n//f3/
/////////////v7/+/z/9vn/9Pf/8vb/8fb/8fX/9Pf/+Pr//P3//v7//////////v7/+vv/8vb/5+7/
y9H/WWO9KSmSkZXj6vD/+Pv//P3//////////f7/+Pr/9fj/8vb/6O7/7vP/9fj/+Pr//f7/////////
/v//+vv/8vb/7PP/hYraKiqKlp7i6PD/7fP/9ff/+/z//v7//////////f7/+vv/9ff/8fX/8PX/8vb/
8/f/9vn/+/z//v7//////////////////f7/+/z/+vv/+fr/+fr/+vv//P3//v7/////////////////
/P3/9fj/7PL/1d7/RUysAABhAABlg4ja6/D/+Pr//P3/////////+/z/9fj/6e7/2eD/h4/bnaXg7PH/
9fj/+/z//////////v7/+Pr/8PX/y9X1JDGVAABaERWDoKnp6PH/7vP/9/n//P3//////////////v7/
/P3/+vv/+fv/+fv/+vv//P3//v7//////////////////////////v7//v7//v7//v7//v//////////
/////////////v7/+fv/8PX/7PX/ipPdAABsAABlQ1Cp3Ob/7vP/9/n//f7/////////+fv/9Pj/yNH5
Ule2DBJ8Ljie0df+8fb/+fv//v7//////v7/+Pr/7/X/hY3YAABxAAl7AABuEBaEs7nz6fH/8fX/+vv/
/v7//////////////////v///v7//v7//v7/////////////////////////////////////////////
/////////////////////////////f3/9vn/7PL/0tn/LzidAQFsAAB0iZHb6vP/8PT/+fv//v//////
/v7/+Pr/8vf/r7rqAAV4AABdPUen1N//7PL/9vn//f7//////v7/+fr/7/T/yc75S1G0AABrARKAAABp
Qker0df/7fP/9/n//f7/////////////////////////////////////////////////////////////
/////////////////////////////////////////////P3/9/n/5+7/cXXNAAd2AABuMDebzdT97PL/
9vj//P3//////////v7/9/n/7/X/tL/uFCCLAABqHSqRvcf46fD/9Pf//f3/////////+vv/8vX/6vH/
yM3+JC2XAABtAAV2Agx9q7Ly7vT/9vn//f7/////////////////////////////////////////////
/////////////////////////////////////////////////////////////P3/9/r/4uj/WWO1AAVx
KTaYu8T07fT/8vb/+vv//v7//////////v7/9/n/7vX/vsn1Iy2SAABrAQ99mp/o6PD/9Pf//P3/////
/////P3/9/n/7vP/6fL/s7z2DBB/AABeQ0uttrr56e7/+Pr//f7/////////////////////////////
/////////////////////////////////////////////////////////////////////////////P3/
+fv/4ef6g4zNbXfFw8v27fT/8vb/+Pr//f3//////////////v7/9/n/7vT/yNL7MjucAABtBxF/nKLo
6fH/9Pf//P3//////////v7/+/z/9fj/7fL/6/T/jZXbLzScrrP14en/7fL/+fv//v7/////////////
////////////////////////////////////////////////////////////////////////////////
/////////////f7/+vz/8PP91dr34+f/8vb/8/f/9/r//P3//v///////////////v7/+Pr/8PX/1N3/
QUqmAQRxBQ98m6Dm7PL/9fj//P3//////////////v7/+/z/9ff/8PX/5ez/ytH94ej/8vb/9vj/+/z/
/v7/////////////////////////////////////////////////////////////////////////////
/////////////////////////////v7//P3/+vz/+fv/+Pr/+Pr/+vv//f3//v//////////////////
/v//+fv/9Pf/2+L/SVGtAABsLTaZytL58fX/9/n//f7//////////////////v7/+/z/9/n/9fj/9vn/
9fj/9vj/+vz//f7/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////v7//f7//f3//f3//f3//v7//v//////
////////////////////+/z/9vn/6e//mZ7gTVarr7bp6/H/9fj/+vv//v7/////////////////////
/v7//f7/+/z/+/z/+/z//P3//v7/////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////f3/+Pr/9fj/6e7/4+n/8fb/9Pf/+Pr//f3/////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////v7//P3/+fv/+fv/+vv/+Pr/+vv/
/P3//v7/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////v7//f7/
/f3//P3//f7//v7//v//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////4D/////////AH////////8Af////////wB/////////AH////////8Af////////wB///////
//AH////////8Af////////wB/////////AH////////8AfwP//////wB8Af//+Af/AHgB///wA/8AcA
H///AB/wBgAf//8AD/AGAB///wAH8AYAH///AAPwBAAf//8AA/AEAD///wAD8AQAP///AAPwBAB///+A
A/AEAP///8AD4AAA////4AcAAAH////wDgAAAf/////8AAAH//////gAAAf/////4AAAAf/////gAAAA
////+AAAAAAAD//AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+A
AAAAAAAP/4AAAAAAAB//wAAAAABAf/4HwAAAAYAf8APAAAADgA/gA+AAAAMAA8AD8AAABwADgAP8AAAf
AAOAA/4AAB8AA4ADAAAAAQADgAIAcA4AgAOABgBwDgBAA4AMAGAMADADwDwAYAwAOAfg+ABgBAAeH//4
AEAEAB////gAwAYAH///+ADABgAf///4AcAGAB////gBwAcAH///+APAB4A////8B+AHwH//////4A//
///////gD/////////Af//////////////8=
</value>
</data>
</root>

View File

@ -330,7 +330,7 @@ namespace CodeWalker.Rendering
{
var rlight = new RenderableLight();
rlight.Owner = this;
rlight.Init(ref lights[i]);
rlight.Init(lights[i]);
rlights[i] = rlight;
}
Lights = rlights;
@ -1353,6 +1353,7 @@ namespace CodeWalker.Rendering
public class RenderableLight
{
public LightAttributes OwnerLight;
public Renderable Owner;
public Vector3 Position;
public Vector3 Colour;
@ -1371,8 +1372,9 @@ namespace CodeWalker.Rendering
public uint TimeFlags;
public MetaHash TextureHash;
public void Init(ref LightAttributes_s l)
public void Init(LightAttributes l)
{
OwnerLight = l;
var pos = l.Position;
var dir = l.Direction;
var tan = l.Tangent;

View File

@ -1025,6 +1025,40 @@ namespace CodeWalker.Rendering
v.Position = c5; SelectionLineVerts.Add(v);
}
public void RenderSelectionDrawableLight(LightAttributes dlight)
{
var colblu = (uint)(new Color(0, 0, 255, 255).ToRgba());
var colwht = (uint)(new Color(255, 255, 255, 255).ToRgba());
RenderableLight light = new RenderableLight();
light.Init(dlight);
var pos = light.Position;
var dir = light.Direction;
var tx = light.TangentX;
var ty = light.TangentY;
var extent = light.Falloff;
var innerAngle = light.ConeInnerAngle;
var outerAngle = light.ConeOuterAngle;
var type = light.Type;
switch (type)
{
case LightType.Point:
RenderSelectionCircle(pos, Vector3.UnitX, Vector3.UnitZ, extent, colwht);
RenderSelectionCircle(pos, Vector3.UnitX, Vector3.UnitY, extent, colwht);
RenderSelectionCircle(pos, Vector3.UnitY, Vector3.UnitZ, extent, colwht);
break;
case LightType.Spot:
RenderSelectionCone(pos, tx, ty, dir, (float)Math.Sin(outerAngle) * extent, (float)Math.Cos(outerAngle) * extent, colblu);
RenderSelectionCone(pos, tx, ty, dir, (float)Math.Sin(innerAngle) * extent, (float)Math.Cos(innerAngle) * extent, colwht);
break;
case LightType.Capsule:
outerAngle = light.ConeOuterAngle * 0.25f;
RenderSelectionCapsule(pos, tx, ty, dir, extent, outerAngle, colwht);
break;
}
}
public void RenderSelectionLodLight(YmapLODLight lodlight)
{
@ -3266,7 +3300,6 @@ namespace CodeWalker.Rendering
RenderSkeleton(rndbl, entity);
}
if (renderlights && shaders.deferred && (rndbl.Lights != null))
{
entity?.EnsureLights(rndbl.Key);
@ -3274,9 +3307,18 @@ namespace CodeWalker.Rendering
var linst = new RenderableLightInst();
for (int i = 0; i < rndbl.Lights.Length; i++)
{
var rndlight = rndbl.Lights[i];
var light = rndlight.OwnerLight;
if (light.HasChanged == true)
{
rndlight.Init(light);
light.HasChanged = false;
}
linst.EntityPosition = position;
linst.EntityRotation = orientation;
linst.Light = rndbl.Lights[i];
linst.Light = rndlight;
shaders.Enqueue(ref linst);
}
}