Import Wavefront .obj as Terrain mode now works in all map formats.

Import Wavefront .obj as Terrain mode: floor height of each created sector is now set to the average height of an .obj polygon it was created from.
Import Wavefront .obj as Terrain Settings window: added "Use slopes" checkbox. When enabled, the mode will create slopes using vertex height offsets (UDMF) or Floor Vertex Height things (1504).
Fixed, Visual Mode: things were rendered at wrong height after using "Lower/Raise Height" actions in sectors with sloped floor (or ceiling for ceiling-aligned things) 
Fixed: info panel was not updated after switching to another Edit Mode.
This commit is contained in:
MaxED 2014-12-10 21:11:56 +00:00
parent 979244a163
commit 33a35e2148
11 changed files with 145 additions and 41 deletions

View file

@ -150,6 +150,9 @@ namespace CodeImp.DoomBuilder.Editing
//mxd. Show hints for this mode
General.Hints.ShowHints(this.GetType(), HintsManager.GENERAL);
//mxd. Display new mode name
General.Interface.HideInfo();
}
// Mode disengages

View file

@ -541,8 +541,6 @@ namespace CodeImp.DoomBuilder
[STAThread]
internal static void Main(string[] args)
{
Uri localpath;
// Determine states
#if DEBUG
debugbuild = true;
@ -571,7 +569,7 @@ namespace CodeImp.DoomBuilder
thisasm = Assembly.GetExecutingAssembly();
// Find application path
localpath = new Uri(Path.GetDirectoryName(thisasm.GetName().CodeBase));
Uri localpath = new Uri(Path.GetDirectoryName(thisasm.GetName().CodeBase));
apppath = Uri.UnescapeDataString(localpath.AbsolutePath);
// Setup directories

View file

@ -2999,7 +2999,7 @@ namespace CodeImp.DoomBuilder.Windows
//create path
string date = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss.fff");
string revision = "R" + General.ThisAssembly.GetName().Version.MinorRevision;
string revision = (General.DebugBuild ? "DEVBUILD" : "R" + General.ThisAssembly.GetName().Version.MinorRevision);
string path = Path.Combine(folder, name + date + " [" + revision + "].jpg");
//save image

View file

@ -141,6 +141,9 @@
<Private>False</Private>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\Folder.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -30,7 +30,6 @@
this.cancel = new System.Windows.Forms.Button();
this.import = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.browse = new System.Windows.Forms.Button();
this.tbImportPath = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.axisx = new System.Windows.Forms.RadioButton();
@ -38,6 +37,8 @@
this.axisz = new System.Windows.Forms.RadioButton();
this.panel1 = new System.Windows.Forms.Panel();
this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
this.cbusevertexheight = new System.Windows.Forms.CheckBox();
this.browse = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.nudScale)).BeginInit();
this.panel1.SuspendLayout();
this.SuspendLayout();
@ -78,7 +79,7 @@
//
this.cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancel.Location = new System.Drawing.Point(279, 82);
this.cancel.Location = new System.Drawing.Point(226, 82);
this.cancel.Name = "cancel";
this.cancel.Size = new System.Drawing.Size(75, 23);
this.cancel.TabIndex = 14;
@ -89,7 +90,7 @@
// import
//
this.import.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.import.Location = new System.Drawing.Point(360, 82);
this.import.Location = new System.Drawing.Point(307, 82);
this.import.Name = "import";
this.import.Size = new System.Drawing.Size(75, 23);
this.import.TabIndex = 13;
@ -106,16 +107,6 @@
this.label1.TabIndex = 12;
this.label1.Text = "Path:";
//
// browse
//
this.browse.Location = new System.Drawing.Point(360, 10);
this.browse.Name = "browse";
this.browse.Size = new System.Drawing.Size(75, 23);
this.browse.TabIndex = 11;
this.browse.Text = "Browse...";
this.browse.UseVisualStyleBackColor = true;
this.browse.Click += new System.EventHandler(this.browse_Click);
//
// tbImportPath
//
this.tbImportPath.Location = new System.Drawing.Point(55, 12);
@ -182,13 +173,34 @@
this.openFileDialog.Filter = "Wavefront obj files|*.obj";
this.openFileDialog.Title = "Choose .obj file to import:";
//
// cbusevertexheight
//
this.cbusevertexheight.AutoSize = true;
this.cbusevertexheight.Location = new System.Drawing.Point(55, 64);
this.cbusevertexheight.Name = "cbusevertexheight";
this.cbusevertexheight.Size = new System.Drawing.Size(95, 17);
this.cbusevertexheight.TabIndex = 22;
this.cbusevertexheight.Text = "Sloped Terrian";
this.cbusevertexheight.UseVisualStyleBackColor = true;
//
// browse
//
this.browse.Image = global::CodeImp.DoomBuilder.BuilderEffects.Properties.Resources.Folder;
this.browse.Location = new System.Drawing.Point(360, 10);
this.browse.Name = "browse";
this.browse.Size = new System.Drawing.Size(28, 23);
this.browse.TabIndex = 11;
this.browse.UseVisualStyleBackColor = true;
this.browse.Click += new System.EventHandler(this.browse_Click);
//
// ObjImportSettingsForm
//
this.AcceptButton = this.import;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.CancelButton = this.cancel;
this.ClientSize = new System.Drawing.Size(447, 109);
this.ClientSize = new System.Drawing.Size(394, 109);
this.Controls.Add(this.cbusevertexheight);
this.Controls.Add(this.panel1);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
@ -202,6 +214,7 @@
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ObjImportSettingsForm";
this.Opacity = 1;
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "Import Wavefront .obj";
@ -228,5 +241,6 @@
private System.Windows.Forms.RadioButton axisz;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.OpenFileDialog openFileDialog;
private System.Windows.Forms.CheckBox cbusevertexheight;
}
}

View file

@ -14,6 +14,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
#region ================== Variables
private ImportObjAsTerrainMode.UpAxis axis;
private bool slopessupported;
#endregion
@ -22,6 +23,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
internal string FilePath { get { return tbImportPath.Text.Trim(); } }
internal ImportObjAsTerrainMode.UpAxis UpAxis { get { return axis; } }
internal float ObjScale { get { return (float)nudScale.Value; } }
internal bool UseVertexHeights { get { return slopessupported && cbusevertexheight.Checked; } }
//todo: floor/ceiling textures? height offsets? ceiling extra height?
@ -34,6 +36,11 @@ namespace CodeImp.DoomBuilder.BuilderEffects
//restore settings
axis = (ImportObjAsTerrainMode.UpAxis)General.Settings.ReadPluginSetting("objexportupaxis", 0);
nudScale.Value = (decimal)General.Settings.ReadPluginSetting("objexportscale", 1.0f);
slopessupported = (General.Map.UDMF || General.Map.Data.GetThingInfoEx(ImportObjAsTerrainMode.VERTEX_HEIGHT_THING_TYPE) != null);
if(slopessupported)
cbusevertexheight.Checked = General.Settings.ReadPluginSetting("objusevertexheights", true);
else
cbusevertexheight.Enabled = false;
switch(axis)
{
@ -69,6 +76,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
//save settings
General.Settings.WritePluginSetting("objexportupaxis", (int)axis);
General.Settings.WritePluginSetting("objexportscale", (float)nudScale.Value);
if(slopessupported) General.Settings.WritePluginSetting("objusevertexheights", cbusevertexheight.Checked);
this.DialogResult = DialogResult.OK;
this.Close();

View file

@ -25,6 +25,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
private readonly static char[] space = { ' ' };
private const string slash = "/";
internal const int VERTEX_HEIGHT_THING_TYPE = 1504;
#endregion
@ -72,12 +73,6 @@ namespace CodeImp.DoomBuilder.BuilderEffects
public override void OnEngage()
{
if(!General.Map.UDMF)
{
General.Interface.DisplayStatus(StatusType.Warning, "Terrain importer works only in UDMF map format!");
OnCancel();
}
base.OnEngage();
General.Map.Map.ClearAllSelected();
@ -104,7 +99,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
int maxZ = int.MinValue;
// Read .obj, create and select sectors
if(!ReadGeometry(form.FilePath, form.ObjScale, form.UpAxis, verts, faces, ref minZ, ref maxZ) || !CreateGeometry(verts, faces, minZ, maxZ + (maxZ - minZ)/2))
if(!ReadGeometry(form.FilePath, form.ObjScale, form.UpAxis, verts, faces, ref minZ, ref maxZ) || !CreateGeometry(verts, faces, maxZ + (maxZ - minZ)/2))
{
// Fial!
Cursor.Current = Cursors.Default;
@ -114,9 +109,14 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
// Update caches
General.Map.Map.SnapAllToAccuracy();
General.Map.Map.UpdateConfiguration();
General.Map.Map.Update();
General.Map.IsChanged = true;
// Update things filter so that it includes added things
if(form.UseVertexHeights && !General.Map.UDMF) General.Map.ThingsFilter.Update();
// Done
Cursor.Current = Cursors.Default;
@ -137,29 +137,80 @@ namespace CodeImp.DoomBuilder.BuilderEffects
#region ================== Geometry creation
private static bool CreateGeometry(List<Vector3D> verts, List<Face> faces, int minZ, int maxZ)
private bool CreateGeometry(List<Vector3D> verts, List<Face> faces, int maxZ)
{
MapSet map = General.Map.Map;
// Capacity checks
int totalverts = map.Vertices.Count + verts.Count;
int totalsides = map.Sidedefs.Count + faces.Count * 6;
int totallines = map.Linedefs.Count + faces.Count * 3;
int totalsectors = map.Sectors.Count + faces.Count;
int totalthings = 0;
if(form.UseVertexHeights && !General.Map.UDMF)
{
// We'll use vertex height things in non-udmf maps, if such things are defined in Game Configuration
totalthings = map.Things.Count + verts.Count;
}
if(totalverts > General.Map.FormatInterface.MaxVertices)
{
MessageBox.Show("Cannot import the model: resulting vertex count (" + totalverts
+ ") is larger than map format's maximum (" + General.Map.FormatInterface.MaxVertices + ")!",
"Terrain Importer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if(totalsides > General.Map.FormatInterface.MaxSidedefs)
{
MessageBox.Show("Cannot import the model: resulting sidedefs count (" + totalsides
+ ") is larger than map format's maximum (" + General.Map.FormatInterface.MaxSidedefs + ")!",
"Terrain Importer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if(totallines > General.Map.FormatInterface.MaxLinedefs)
{
MessageBox.Show("Cannot import the model: resulting sidedefs count (" + totallines
+ ") is larger than map format's maximum (" + General.Map.FormatInterface.MaxLinedefs + ")!",
"Terrain Importer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if(totalsectors > General.Map.FormatInterface.MaxSectors)
{
MessageBox.Show("Cannot import the model: resulting sidedefs count (" + totalsectors
+ ") is larger than map format's maximum (" + General.Map.FormatInterface.MaxSectors + ")!",
"Terrain Importer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if(totalthings > General.Map.FormatInterface.MaxThings)
{
MessageBox.Show("Cannot import the model: resulting things count (" + totalthings
+ ") is larger than map format's maximum (" + General.Map.FormatInterface.MaxThings + ")!",
"Terrain Importer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
//make undo
General.Map.UndoRedo.CreateUndo("Import Terrain");
//prepare mapset
List<Linedef> newlines = new List<Linedef>();
MapSet map = General.Map.Map;
map.BeginAddRemove();
map.SetCapacity(map.Vertices.Count + verts.Count, map.Linedefs.Count + faces.Count * 3, map.Sidedefs.Count + faces.Count * 3, map.Sectors.Count + faces.Count, 0);
map.SetCapacity(totalverts, totallines, totalsides, totalsectors, totalthings);
//terrain has many faces... let's create them
Dictionary<Vector3D, Vertex> newverts = new Dictionary<Vector3D, Vertex>();
foreach(Face face in faces)
{
// Create sector
Sector s = map.CreateSector();
s.Selected = true;
s.FloorHeight = minZ;
s.FloorHeight = (int)Math.Round((face.V1.z + face.V2.z + face.V3.z) / 3);
s.CeilHeight = maxZ;
s.Brightness = General.Settings.DefaultBrightness; //todo: allow user to change this
s.SetCeilTexture(General.Map.Config.SkyFlatName);
s.SetFloorTexture(General.Map.Options.DefaultFloorTexture); //todo: allow user to change this
// And linedefs
Linedef newline = GetLine(newverts, s, face.V1, face.V2);
if(newline != null) newlines.Add(newline);
@ -172,6 +223,19 @@ namespace CodeImp.DoomBuilder.BuilderEffects
s.UpdateCache();
}
// Add slope things
if(form.UseVertexHeights && !General.Map.UDMF)
{
foreach (Vector3D pos in newverts.Keys)
{
Thing t = map.CreateThing();
General.Settings.ApplyDefaultThingSettings(t);
t.Type = VERTEX_HEIGHT_THING_TYPE;
t.Move(pos);
t.Selected = true;
}
}
//update new lines
foreach(Linedef l in newlines) l.ApplySidedFlags();
@ -179,7 +243,7 @@ namespace CodeImp.DoomBuilder.BuilderEffects
return true;
}
private static Linedef GetLine(Dictionary<Vector3D, Vertex> verts, Sector sector, Vector3D v1, Vector3D v2)
private Linedef GetLine(Dictionary<Vector3D, Vertex> verts, Sector sector, Vector3D v1, Vector3D v2)
{
Linedef line = null;
@ -198,31 +262,33 @@ namespace CodeImp.DoomBuilder.BuilderEffects
}
//create a new line?
Sidedef side;
if(line == null)
{
line = General.Map.Map.CreateLinedef(start, end);
//create front sidedef and attach sector to it
General.Map.Map.CreateSidedef(line, true, sector);
side = General.Map.Map.CreateSidedef(line, true, sector);
}
else
{
//create back sidedef and attach sector to it
General.Map.Map.CreateSidedef(line, false, sector);
side = General.Map.Map.CreateSidedef(line, false, sector);
}
if(!form.UseVertexHeights) side.SetTextureLow(General.Map.Options.DefaultWallTexture);
line.Selected = true;
return line;
}
private static Vertex GetVertex(Dictionary<Vector3D, Vertex> verts, Vector3D pos)
private Vertex GetVertex(Dictionary<Vector3D, Vertex> verts, Vector3D pos)
{
//already there?
if(verts.ContainsKey(pos)) return verts[pos];
//make a new one
Vertex v = General.Map.Map.CreateVertex(pos);
v.ZFloor = pos.z;
if(form.UseVertexHeights) v.ZFloor = pos.z;
verts.Add(pos, v);
return v;
}

View file

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.4927
// Runtime Version:2.0.50727.5466
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -60,6 +60,13 @@ namespace CodeImp.DoomBuilder.BuilderEffects.Properties {
}
}
internal static System.Drawing.Bitmap Folder {
get {
object obj = ResourceManager.GetObject("Folder", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
internal static System.Drawing.Bitmap Jitter {
get {
object obj = ResourceManager.GetObject("Jitter", resourceCulture);

View file

@ -118,13 +118,16 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Terrain" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Terrain.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Jitter" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Jitter.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Update" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Update.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Terrain" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Terrain.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="Folder" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

View file

@ -230,10 +230,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(Thing.Sector != null)
{
SectorData sd = mode.GetSectorData(Thing.Sector);
if(Thing.Position.z > 0)
pos.z = sd.Ceiling.plane.GetZ(Thing.Position) - info.Height;
/*if(Thing.Position.z > 0)
pos.z = sd.Ceiling.plane.GetZ(Thing.Position) - info.Height;
else
pos.z = Thing.Sector.CeilHeight - info.Height; //mxd. was [pos.z = Thing.Sector.CeilHeight;]
pos.z = Thing.Sector.CeilHeight - info.Height;*/
}
pos.z -= Thing.Position.z;
@ -252,10 +253,11 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(Thing.Sector != null)
{
SectorData sd = mode.GetSectorData(Thing.Sector);
if(Thing.Position.z == 0)
pos.z = sd.Floor.plane.GetZ(Thing.Position);
/*if(Thing.Position.z == 0)
pos.z = sd.Floor.plane.GetZ(Thing.Position);
else
pos.z = Thing.Sector.FloorHeight;
pos.z = Thing.Sector.FloorHeight;*/
}
pos.z += Thing.Position.z;