Commits

filipkunc committed abdf6ba

VertexWindowController for adding and connecting vertices, not finished yet.

Comments (0)

Files changed (11)

     Latest = TextureNames
 };
 
+EnumClass VertexWindowMode
+{
+    Add = 0,
+    Connect = 1,
+};
+
     // make
     
     VertexNode *addVertex(const Vector3D &position);
+    TriangleNode *connectVerticesNearPosition(const Vector3D &position);
+    VertexNode *findNearestVertex(const Vector3D &position, const vector<VertexNode *> &skipVertices) const;
+
     TriangleNode *addTriangle(VertexNode *v0, VertexNode *v1, VertexNode *v2);
     TriangleNode *addQuad(VertexNode *v0, VertexNode *v1, VertexNode *v2, VertexNode *v3);
-    void removeTriQuad(TriangleNode *&triQuad);
+    void removeTriQuad(TriangleNode *&triQuad);    
     
     const FPList<VertexNode, Vertex2> &vertices() const { return _vertices; }
 	const FPList<TriangleNode, Triangle2> &triangles() const { return _triangles; }

Classes/Mesh2.make.cpp

 //
 
 #include "Mesh2.h"
+#include <algorithm>
 
 VertexNode *Mesh2::addVertex(const Vector3D &position)
 {
     return _vertices.add(position);
 }
 
+TriangleNode *Mesh2::connectVerticesNearPosition(const Vector3D &position)
+{
+    vector<VertexNode *> vertices;
+    
+    for (uint i = 0; i < 4; i++)
+    {
+        vertices.push_back(findNearestVertex(position, vertices));
+    }
+    
+    TriangleNode *quad = addQuad(vertices[0], vertices[1], vertices[2], vertices[3]);
+    
+    makeEdges();
+    
+    setSelectionMode(_selectionMode);
+    
+    return quad;
+}
+
+VertexNode *Mesh2::findNearestVertex(const Vector3D &position, const vector<VertexNode *> &skipVertices) const
+{
+    VertexNode *nearest = NULL;
+    
+    for (VertexNode *node = _vertices.begin(), *end = _vertices.end(); node != end; node = node->next())
+    {
+        if (find(skipVertices.begin(), skipVertices.end(), node) != skipVertices.end())
+        {
+            continue;
+        }
+        
+        if (nearest == NULL ||
+            node->data().position.Distance(position) < nearest->data().position.Distance(position))
+        {
+            nearest = node;
+        }
+    }
+    
+    return nearest;
+}
+
 TriangleNode *Mesh2::addTriangle(VertexNode *v0, VertexNode *v1, VertexNode *v2)
 {
     TexCoordNode *t0 = _texCoords.add(v0->data().position);

Classes/MyDocument.cpp

     return NO;
 }
 
+- (void)viewVertexTool:(id)sender
+{
+    [vertexWindowController showWindow:nil];
+}
+
 - (BOOL)addVertexEnabled
 {
-    // TODO: add tool window
-    return YES;
+    if (vertexWindowController.isWindowLoaded)
+    {
+        if (vertexWindowController.window.isVisible)
+            return YES;
+    }
+    return NO;
 }
 
 - (void)addVertex:(Vector3D)position
 {
-    Mesh2 *mesh = [self currentMesh];
-    mesh->addVertex(position);
+    if (vertexWindowController.isWindowLoaded && vertexWindowController.window.isVisible)
+    {
+        Mesh2 *mesh = [self currentMesh];
+        switch (vertexWindowController.vertexMode)
+        {
+            case VertexWindowMode::Add:
+                mesh->addVertex(position);
+                break;
+            case VertexWindowMode::Connect:
+                mesh->connectVerticesNearPosition(position);
+                mesh->resetTriangleCache();
+                break;
+            default:
+                break;
+        }
+    }
 }
 
 - (NSString *)windowNibName

Classes/MyDocument.h

 #import "FPTextureBrowserWindowController.h"
 #import "ScriptWindowController.h"
 #import "FPSelectionWindowController.h"
+#import "VertexWindowController.h"
 
 @interface UndoStatePointer : NSObject
 {
     IBOutlet FPTextureBrowserWindowController *textureBrowserWindowController;
     IBOutlet ScriptWindowController *scriptWindowController;
     IBOutlet FPSelectionWindowController *selectionWindowController;
+    IBOutlet VertexWindowController *vertexWindowController;
     
     IBOutlet NSPopUpButton *scriptPullDown;
 }
 @property (readwrite, assign) IOpenGLManipulating *manipulated;
 @property (readonly) NSPopUpButton *scriptPullDown;
 
-+ (BOOL)softSelection;
-+ (void)setSoftSelection:(BOOL)value;
 - (void)setNeedsDisplayExceptView:(OpenGLSceneView *)view;
 - (void)setNeedsDisplayOnAllViews;
 - (Mesh2 *)currentMesh;
 - (IBAction)extrudeSelected:(id)sender;
 - (IBAction)detachSelected:(id)sender;
 - (IBAction)subdivision:(id)sender;
-- (IBAction)softSelection:(id)sender;
 - (IBAction)cleanTexture:(id)sender;
 - (IBAction)resetTexCoords:(id)sender;
 - (IBAction)triangulate:(id)sender;
 - (IBAction)viewTextureBrowser:(id)sender;
 - (IBAction)viewScriptEditor:(id)sender;
 - (IBAction)viewSelectionTool:(id)sender;
+- (IBAction)viewVertexTool:(id)sender;
 
 @end
 

Classes/VertexWindowController.h

+//
+//  VertexWindowController.h
+//  MeshMaker
+//
+//  Created by Filip Kunc on 3/10/13.
+//
+//
+
+#pragma once
+
+#import "OpenGLDrawing.h"
+
+@interface VertexWindowController : NSWindowController
+
+@property (readonly) VertexWindowMode vertexMode;
+
+@end

Classes/VertexWindowController.mm

+//
+//  VertexWindowController.mm
+//  MeshMaker
+//
+//  Created by Filip Kunc on 3/10/13.
+//
+//
+
+#import "VertexWindowController.h"
+
+@interface VertexWindowController ()
+{
+    IBOutlet NSMatrix *radioButtons;
+}
+
+@end
+
+@implementation VertexWindowController
+
+- (id)init
+{
+    self = [super initWithWindowNibName:@"VertexWindowController"];
+    return self;
+}
+
+- (void)windowDidLoad
+{
+    [super windowDidLoad];
+}
+
+- (VertexWindowMode)vertexMode
+{
+    NSButtonCell *cell = [radioButtons selectedCell];
+    return (VertexWindowMode)cell.tag;
+}
+
+@end

Classes/VertexWindowController.xib

+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+	<data>
+		<int key="IBDocument.SystemTarget">1080</int>
+		<string key="IBDocument.SystemVersion">12D78</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
+		<string key="IBDocument.AppKitVersion">1187.37</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			<string key="NS.object.0">3084</string>
+		</object>
+		<array key="IBDocument.IntegratedClassDependencies">
+			<string>IBNSLayoutConstraint</string>
+			<string>NSButtonCell</string>
+			<string>NSCustomObject</string>
+			<string>NSMatrix</string>
+			<string>NSView</string>
+			<string>NSWindowTemplate</string>
+		</array>
+		<array key="IBDocument.PluginDependencies">
+			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+		</array>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
+		</object>
+		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+			<object class="NSCustomObject" id="1001">
+				<string key="NSClassName">VertexWindowController</string>
+			</object>
+			<object class="NSCustomObject" id="1003">
+				<string key="NSClassName">FirstResponder</string>
+			</object>
+			<object class="NSCustomObject" id="1004">
+				<string key="NSClassName">NSApplication</string>
+			</object>
+			<object class="NSWindowTemplate" id="1005">
+				<int key="NSWindowStyleMask">19</int>
+				<int key="NSWindowBacking">2</int>
+				<string key="NSWindowRect">{{196, 240}, {134, 78}}</string>
+				<int key="NSWTFlags">544735232</int>
+				<string key="NSWindowTitle">Vertex</string>
+				<string key="NSWindowClass">NSPanel</string>
+				<nil key="NSViewClass"/>
+				<nil key="NSUserInterfaceItemIdentifier"/>
+				<object class="NSView" key="NSWindowView" id="1006">
+					<reference key="NSNextResponder"/>
+					<int key="NSvFlags">256</int>
+					<array class="NSMutableArray" key="NSSubviews">
+						<object class="NSMatrix" id="930369865">
+							<reference key="NSNextResponder" ref="1006"/>
+							<int key="NSvFlags">268</int>
+							<string key="NSFrame">{{20, 20}, {80, 38}}</string>
+							<reference key="NSSuperview" ref="1006"/>
+							<reference key="NSWindow"/>
+							<string key="NSReuseIdentifierKey">_NS:9</string>
+							<bool key="NSEnabled">YES</bool>
+							<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+							<int key="NSNumRows">2</int>
+							<int key="NSNumCols">1</int>
+							<array class="NSMutableArray" key="NSCells">
+								<object class="NSButtonCell" id="761936036">
+									<int key="NSCellFlags">-2080374784</int>
+									<int key="NSCellFlags2">0</int>
+									<string key="NSContents">Add</string>
+									<object class="NSFont" key="NSSupport" id="53045941">
+										<string key="NSName">LucidaGrande</string>
+										<double key="NSSize">13</double>
+										<int key="NSfFlags">1044</int>
+									</object>
+									<reference key="NSControlView" ref="930369865"/>
+									<int key="NSButtonFlags">1211912448</int>
+									<int key="NSButtonFlags2">0</int>
+									<object class="NSButtonImageSource" key="NSAlternateImage" id="772251471">
+										<string key="NSImageName">NSRadioButton</string>
+									</object>
+									<string key="NSAlternateContents"/>
+									<string key="NSKeyEquivalent"/>
+									<int key="NSPeriodicDelay">200</int>
+									<int key="NSPeriodicInterval">25</int>
+								</object>
+								<object class="NSButtonCell" id="959563247">
+									<int key="NSCellFlags">67108864</int>
+									<int key="NSCellFlags2">0</int>
+									<string key="NSContents">Connect</string>
+									<reference key="NSSupport" ref="53045941"/>
+									<reference key="NSControlView" ref="930369865"/>
+									<int key="NSTag">1</int>
+									<int key="NSButtonFlags">1211912448</int>
+									<int key="NSButtonFlags2">0</int>
+									<object class="NSImage" key="NSNormalImage">
+										<int key="NSImageFlags">549453824</int>
+										<string key="NSSize">{18, 18}</string>
+										<array class="NSMutableArray" key="NSReps">
+											<array>
+												<integer value="0"/>
+												<object class="NSBitmapImageRep">
+													<object class="NSData" key="NSTIFFRepresentation">
+														<bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw
+IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/
+29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5
+dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA
+AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG
+AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/
+0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/
+7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/
+5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/
+3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD
+AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns
+AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/
+6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/
+/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/
+///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl
+YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA
+AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD
+AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu
+AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB
+AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES
+AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS
+AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
+													</object>
+												</object>
+											</array>
+										</array>
+										<object class="NSColor" key="NSColor" id="379586536">
+											<int key="NSColorSpace">3</int>
+											<bytes key="NSWhite">MCAwAA</bytes>
+										</object>
+									</object>
+									<reference key="NSAlternateImage" ref="772251471"/>
+									<int key="NSPeriodicDelay">400</int>
+									<int key="NSPeriodicInterval">75</int>
+								</object>
+							</array>
+							<string key="NSCellSize">{80, 18}</string>
+							<string key="NSIntercellSpacing">{4, 2}</string>
+							<int key="NSMatrixFlags">1151868928</int>
+							<string key="NSCellClass">NSActionCell</string>
+							<object class="NSButtonCell" key="NSProtoCell" id="1005968726">
+								<int key="NSCellFlags">67108864</int>
+								<int key="NSCellFlags2">0</int>
+								<string key="NSContents">Radio</string>
+								<reference key="NSSupport" ref="53045941"/>
+								<int key="NSButtonFlags">1211912448</int>
+								<int key="NSButtonFlags2">0</int>
+								<object class="NSImage" key="NSNormalImage">
+									<int key="NSImageFlags">549453824</int>
+									<string key="NSSize">{18, 18}</string>
+									<array class="NSMutableArray" key="NSReps">
+										<array>
+											<integer value="0"/>
+											<object class="NSBitmapImageRep">
+												<object class="NSData" key="NSTIFFRepresentation">
+													<bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw
+IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/
+29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5
+dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA
+AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG
+AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/
+0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/
+7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/
+5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/
+3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD
+AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns
+AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/
+6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/
+/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/
+///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl
+YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA
+AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD
+AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu
+AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB
+AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES
+AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS
+AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
+												</object>
+											</object>
+										</array>
+									</array>
+									<reference key="NSColor" ref="379586536"/>
+								</object>
+								<reference key="NSAlternateImage" ref="772251471"/>
+								<int key="NSPeriodicDelay">400</int>
+								<int key="NSPeriodicInterval">75</int>
+							</object>
+							<reference key="NSSelectedCell" ref="761936036"/>
+							<object class="NSColor" key="NSBackgroundColor">
+								<int key="NSColorSpace">6</int>
+								<string key="NSCatalogName">System</string>
+								<string key="NSColorName">controlColor</string>
+								<object class="NSColor" key="NSColor">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+								</object>
+							</object>
+							<object class="NSColor" key="NSCellBackgroundColor">
+								<int key="NSColorSpace">3</int>
+								<bytes key="NSWhite">MQA</bytes>
+							</object>
+							<reference key="NSFont" ref="53045941"/>
+							<bool key="NSAutorecalculatesCellSize">YES</bool>
+						</object>
+					</array>
+					<string key="NSFrameSize">{134, 78}</string>
+					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
+					<reference key="NSNextKeyView" ref="930369865"/>
+				</object>
+				<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
+				<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
+				<bool key="NSWindowIsRestorable">YES</bool>
+			</object>
+		</array>
+		<object class="IBObjectContainer" key="IBDocument.Objects">
+			<array class="NSMutableArray" key="connectionRecords">
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">window</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="1005"/>
+					</object>
+					<int key="connectionID">3</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">radioButtons</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="930369865"/>
+					</object>
+					<int key="connectionID">16</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">delegate</string>
+						<reference key="source" ref="1005"/>
+						<reference key="destination" ref="1001"/>
+					</object>
+					<int key="connectionID">4</int>
+				</object>
+			</array>
+			<object class="IBMutableOrderedSet" key="objectRecords">
+				<array key="orderedObjects">
+					<object class="IBObjectRecord">
+						<int key="objectID">0</int>
+						<array key="object" id="0"/>
+						<reference key="children" ref="1000"/>
+						<nil key="parent"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-2</int>
+						<reference key="object" ref="1001"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-1</int>
+						<reference key="object" ref="1003"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">First Responder</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-3</int>
+						<reference key="object" ref="1004"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">Application</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">1</int>
+						<reference key="object" ref="1005"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="1006"/>
+						</array>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">2</int>
+						<reference key="object" ref="1006"/>
+						<array class="NSMutableArray" key="children">
+							<object class="IBNSLayoutConstraint" id="101225680">
+								<reference key="firstItem" ref="930369865"/>
+								<int key="firstAttribute">3</int>
+								<int key="relation">0</int>
+								<reference key="secondItem" ref="1006"/>
+								<int key="secondAttribute">3</int>
+								<float key="multiplier">1</float>
+								<object class="IBNSLayoutSymbolicConstant" key="constant">
+									<double key="value">20</double>
+								</object>
+								<float key="priority">1000</float>
+								<reference key="containingView" ref="1006"/>
+								<int key="scoringType">8</int>
+								<float key="scoringTypeFloat">29</float>
+								<int key="contentType">3</int>
+							</object>
+							<object class="IBNSLayoutConstraint" id="784199954">
+								<reference key="firstItem" ref="930369865"/>
+								<int key="firstAttribute">5</int>
+								<int key="relation">0</int>
+								<reference key="secondItem" ref="1006"/>
+								<int key="secondAttribute">5</int>
+								<float key="multiplier">1</float>
+								<object class="IBNSLayoutSymbolicConstant" key="constant">
+									<double key="value">20</double>
+								</object>
+								<float key="priority">1000</float>
+								<reference key="containingView" ref="1006"/>
+								<int key="scoringType">8</int>
+								<float key="scoringTypeFloat">29</float>
+								<int key="contentType">3</int>
+							</object>
+							<reference ref="930369865"/>
+						</array>
+						<reference key="parent" ref="1005"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">5</int>
+						<reference key="object" ref="930369865"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="1005968726"/>
+							<reference ref="761936036"/>
+							<reference ref="959563247"/>
+							<object class="IBNSLayoutConstraint" id="762697398">
+								<reference key="firstItem" ref="930369865"/>
+								<int key="firstAttribute">7</int>
+								<int key="relation">0</int>
+								<nil key="secondItem"/>
+								<int key="secondAttribute">0</int>
+								<float key="multiplier">1</float>
+								<object class="IBLayoutConstant" key="constant">
+									<double key="value">80</double>
+								</object>
+								<float key="priority">1000</float>
+								<reference key="containingView" ref="930369865"/>
+								<int key="scoringType">3</int>
+								<float key="scoringTypeFloat">9</float>
+								<int key="contentType">1</int>
+							</object>
+						</array>
+						<reference key="parent" ref="1006"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">6</int>
+						<reference key="object" ref="1005968726"/>
+						<reference key="parent" ref="930369865"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">7</int>
+						<reference key="object" ref="761936036"/>
+						<reference key="parent" ref="930369865"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">8</int>
+						<reference key="object" ref="959563247"/>
+						<reference key="parent" ref="930369865"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">13</int>
+						<reference key="object" ref="784199954"/>
+						<reference key="parent" ref="1006"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">14</int>
+						<reference key="object" ref="101225680"/>
+						<reference key="parent" ref="1006"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">15</int>
+						<reference key="object" ref="762697398"/>
+						<reference key="parent" ref="930369865"/>
+					</object>
+				</array>
+			</object>
+			<dictionary class="NSMutableDictionary" key="flattenedProperties">
+				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="1.IBWindowTemplateEditedContentRect">{{357, 418}, {480, 270}}</string>
+				<integer value="1" key="1.NSWindowTemplate.visibleAtLaunch"/>
+				<string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="15.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<array class="NSMutableArray" key="2.IBNSViewMetadataConstraints">
+					<reference ref="784199954"/>
+					<reference ref="101225680"/>
+				</array>
+				<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<array class="NSMutableArray" key="5.IBNSViewMetadataConstraints">
+					<reference ref="762697398"/>
+				</array>
+				<boolean value="NO" key="5.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="8.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+			</dictionary>
+			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+			<nil key="activeLocalization"/>
+			<dictionary class="NSMutableDictionary" key="localizations"/>
+			<nil key="sourceID"/>
+			<int key="maxID">16</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">NSLayoutConstraint</string>
+					<string key="superclassName">NSObject</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/NSLayoutConstraint.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">VertexWindowController</string>
+					<string key="superclassName">NSWindowController</string>
+					<object class="NSMutableDictionary" key="outlets">
+						<string key="NS.key.0">radioButtons</string>
+						<string key="NS.object.0">NSMatrix</string>
+					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<string key="NS.key.0">radioButtons</string>
+						<object class="IBToOneOutletInfo" key="NS.object.0">
+							<string key="name">radioButtons</string>
+							<string key="candidateClassName">NSMatrix</string>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VertexWindowController.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
+		<int key="IBDocument.localizationMode">0</int>
+		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
+		<bool key="IBDocument.UseAutolayout">YES</bool>
+	</data>
+</archive>

English.lproj/MainMenu.xib

 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
-		<string key="IBDocument.SystemVersion">12C60</string>
+		<string key="IBDocument.SystemVersion">12D78</string>
 		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
-		<string key="IBDocument.AppKitVersion">1187.34</string>
-		<string key="IBDocument.HIToolboxVersion">625.00</string>
+		<string key="IBDocument.AppKitVersion">1187.37</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
 			<string key="NS.object.0">3084</string>
 									<reference key="NSOnImage" ref="1033313550"/>
 									<reference key="NSMixedImage" ref="310636482"/>
 								</object>
+								<object class="NSMenuItem" id="88195674">
+									<reference key="NSMenu" ref="466310130"/>
+									<string key="NSTitle">Vertex Tool...</string>
+									<string key="NSKeyEquiv">V</string>
+									<int key="NSKeyEquivModMask">1048576</int>
+									<int key="NSMnemonicLoc">2147483647</int>
+									<reference key="NSOnImage" ref="1033313550"/>
+									<reference key="NSMixedImage" ref="310636482"/>
+								</object>
 							</object>
 						</object>
 					</object>
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBActionConnection" key="connection">
+						<string key="label">viewVertexTool:</string>
+						<reference key="source" ref="1014"/>
+						<reference key="destination" ref="88195674"/>
+					</object>
+					<int key="connectionID">848</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBActionConnection" key="connection">
 						<string key="label">showHelp:</string>
 						<reference key="source" ref="823794944"/>
 						<reference key="destination" ref="238773614"/>
 							<reference ref="586266"/>
 							<reference ref="417741643"/>
 							<reference ref="999660025"/>
+							<reference ref="88195674"/>
 						</object>
 						<reference key="parent" ref="586577488"/>
 					</object>
 						<reference key="object" ref="999660025"/>
 						<reference key="parent" ref="466310130"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">846</int>
+						<reference key="object" ref="88195674"/>
+						<reference key="parent" ref="466310130"/>
+					</object>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="flattenedProperties">
 					<string>836.IBPluginDependency</string>
 					<string>842.IBPluginDependency</string>
 					<string>844.IBPluginDependency</string>
+					<string>846.IBPluginDependency</string>
 					<string>92.IBPluginDependency</string>
 				</object>
 				<object class="NSArray" key="dict.values">
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 				</object>
 			</object>
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="sourceID"/>
-			<int key="maxID">845</int>
+			<int key="maxID">848</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
+					<string key="className">FPCurveView</string>
+					<string key="superclassName">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/FPCurveView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
 					<string key="className">FPSelectionWindowController</string>
 					<string key="superclassName">NSWindowController</string>
+					<object class="NSMutableDictionary" key="outlets">
+						<string key="NS.key.0">curveView</string>
+						<string key="NS.object.0">FPCurveView</string>
+					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<string key="NS.key.0">curveView</string>
+						<object class="IBToOneOutletInfo" key="NS.object.0">
+							<string key="name">curveView</string>
+							<string key="candidateClassName">FPCurveView</string>
+						</object>
+					</object>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
 						<string key="minorKey">./Classes/FPSelectionWindowController.h</string>
 							<string>addCube:</string>
 							<string>addCylinder:</string>
 							<string>addIcosahedron:</string>
-							<string>addPlane:</string>
 							<string>addSphere:</string>
 							<string>changeEditMode:</string>
 							<string>changeManipulator:</string>
 							<string>mergeSelected:</string>
 							<string>resetTexCoords:</string>
 							<string>selectAll:</string>
-							<string>softSelection:</string>
 							<string>splitSelected:</string>
 							<string>subdivision:</string>
 							<string>triangulate:</string>
 							<string>viewSelectionTool:</string>
 							<string>viewTextureBrowser:</string>
 							<string>viewTexturePaintTool:</string>
+							<string>viewVertexTool:</string>
 						</object>
 						<object class="NSArray" key="dict.values">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
-							<string>id</string>
 						</object>
 					</object>
 					<object class="NSMutableDictionary" key="actionInfosByName">
 							<string>addCube:</string>
 							<string>addCylinder:</string>
 							<string>addIcosahedron:</string>
-							<string>addPlane:</string>
 							<string>addSphere:</string>
 							<string>changeEditMode:</string>
 							<string>changeManipulator:</string>
 							<string>mergeSelected:</string>
 							<string>resetTexCoords:</string>
 							<string>selectAll:</string>
-							<string>softSelection:</string>
 							<string>splitSelected:</string>
 							<string>subdivision:</string>
 							<string>triangulate:</string>
 							<string>viewSelectionTool:</string>
 							<string>viewTextureBrowser:</string>
 							<string>viewTexturePaintTool:</string>
+							<string>viewVertexTool:</string>
 						</object>
 						<object class="NSArray" key="dict.values">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 								<string key="candidateClassName">id</string>
 							</object>
 							<object class="IBActionInfo">
-								<string key="name">addPlane:</string>
-								<string key="candidateClassName">id</string>
-							</object>
-							<object class="IBActionInfo">
 								<string key="name">addSphere:</string>
 								<string key="candidateClassName">id</string>
 							</object>
 								<string key="candidateClassName">id</string>
 							</object>
 							<object class="IBActionInfo">
-								<string key="name">softSelection:</string>
-								<string key="candidateClassName">id</string>
-							</object>
-							<object class="IBActionInfo">
 								<string key="name">splitSelected:</string>
 								<string key="candidateClassName">id</string>
 							</object>
 								<string key="name">viewTexturePaintTool:</string>
 								<string key="candidateClassName">id</string>
 							</object>
+							<object class="IBActionInfo">
+								<string key="name">viewVertexTool:</string>
+								<string key="candidateClassName">id</string>
+							</object>
 						</object>
 					</object>
 					<object class="NSMutableDictionary" key="outlets">
 							<string>textureBrowserWindowController</string>
 							<string>texturePaintToolWindowController</string>
 							<string>topSplit</string>
+							<string>vertexWindowController</string>
 							<string>viewFront</string>
 							<string>viewLeft</string>
 							<string>viewPerspective</string>
 							<string>FPTextureBrowserWindowController</string>
 							<string>FPTexturePaintToolWindowController</string>
 							<string>NSSplitView</string>
+							<string>VertexWindowController</string>
 							<string>OpenGLSceneView</string>
 							<string>OpenGLSceneView</string>
 							<string>OpenGLSceneView</string>
 							<string>textureBrowserWindowController</string>
 							<string>texturePaintToolWindowController</string>
 							<string>topSplit</string>
+							<string>vertexWindowController</string>
 							<string>viewFront</string>
 							<string>viewLeft</string>
 							<string>viewPerspective</string>
 								<string key="candidateClassName">NSSplitView</string>
 							</object>
 							<object class="IBToOneOutletInfo">
+								<string key="name">vertexWindowController</string>
+								<string key="candidateClassName">VertexWindowController</string>
+							</object>
+							<object class="IBToOneOutletInfo">
 								<string key="name">viewFront</string>
 								<string key="candidateClassName">OpenGLSceneView</string>
 							</object>
 						<string key="minorKey">./Classes/ScriptWindowController.h</string>
 					</object>
 				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">VertexWindowController</string>
+					<string key="superclassName">NSWindowController</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VertexWindowController.h</string>
+					</object>
+				</object>
 			</object>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>

English.lproj/MyDocument.xib

 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
 	<data>
 		<int key="IBDocument.SystemTarget">1070</int>
-		<string key="IBDocument.SystemVersion">12C60</string>
+		<string key="IBDocument.SystemVersion">12D78</string>
 		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
-		<string key="IBDocument.AppKitVersion">1187.34</string>
-		<string key="IBDocument.HIToolboxVersion">625.00</string>
+		<string key="IBDocument.AppKitVersion">1187.37</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
 			<string key="NS.object.0">3084</string>
 			<object class="NSCustomObject" id="144252658">
 				<string key="NSClassName">FPSelectionWindowController</string>
 			</object>
+			<object class="NSCustomObject" id="384879837">
+				<string key="NSClassName">VertexWindowController</string>
+			</object>
 		</array>
 		<object class="IBObjectContainer" key="IBDocument.Objects">
 			<array class="NSMutableArray" key="connectionRecords">
 				</object>
 				<object class="IBConnectionRecord">
 					<object class="IBOutletConnection" key="connection">
+						<string key="label">vertexWindowController</string>
+						<reference key="source" ref="512844837"/>
+						<reference key="destination" ref="384879837"/>
+					</object>
+					<int key="connectionID">101203</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
 						<string key="label">delegate</string>
 						<reference key="source" ref="275939982"/>
 						<reference key="destination" ref="512844837"/>
 						<reference key="object" ref="144252658"/>
 						<reference key="parent" ref="0"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">101202</int>
+						<reference key="object" ref="384879837"/>
+						<reference key="parent" ref="0"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
 				<string key="101192.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="101195.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="101200.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+				<string key="101202.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 				<string key="5.IBWindowTemplateEditedContentRect">{{381, 488}, {739, 467}}</string>
 				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">101201</int>
+			<int key="maxID">101203</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
+					<string key="className">FPCurveView</string>
+					<string key="superclassName">NSView</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/FPCurveView.h</string>
+					</object>
+				</object>
+				<object class="IBPartialClassDescription">
 					<string key="className">FPSelectionWindowController</string>
 					<string key="superclassName">NSWindowController</string>
+					<object class="NSMutableDictionary" key="outlets">
+						<string key="NS.key.0">curveView</string>
+						<string key="NS.object.0">FPCurveView</string>
+					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<string key="NS.key.0">curveView</string>
+						<object class="IBToOneOutletInfo" key="NS.object.0">
+							<string key="name">curveView</string>
+							<string key="candidateClassName">FPCurveView</string>
+						</object>
+					</object>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
 						<string key="minorKey">./Classes/FPSelectionWindowController.h</string>
 						<string key="addCube:">id</string>
 						<string key="addCylinder:">id</string>
 						<string key="addIcosahedron:">id</string>
-						<string key="addPlane:">id</string>
 						<string key="addSphere:">id</string>
 						<string key="changeEditMode:">id</string>
 						<string key="changeManipulator:">id</string>
 						<string key="mergeSelected:">id</string>
 						<string key="resetTexCoords:">id</string>
 						<string key="selectAll:">id</string>
-						<string key="softSelection:">id</string>
 						<string key="splitSelected:">id</string>
 						<string key="subdivision:">id</string>
 						<string key="triangulate:">id</string>
 						<string key="viewSelectionTool:">id</string>
 						<string key="viewTextureBrowser:">id</string>
 						<string key="viewTexturePaintTool:">id</string>
+						<string key="viewVertexTool:">id</string>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="actionInfosByName">
 						<object class="IBActionInfo" key="addCube:">
 							<string key="name">addIcosahedron:</string>
 							<string key="candidateClassName">id</string>
 						</object>
-						<object class="IBActionInfo" key="addPlane:">
-							<string key="name">addPlane:</string>
-							<string key="candidateClassName">id</string>
-						</object>
 						<object class="IBActionInfo" key="addSphere:">
 							<string key="name">addSphere:</string>
 							<string key="candidateClassName">id</string>
 							<string key="name">selectAll:</string>
 							<string key="candidateClassName">id</string>
 						</object>
-						<object class="IBActionInfo" key="softSelection:">
-							<string key="name">softSelection:</string>
-							<string key="candidateClassName">id</string>
-						</object>
 						<object class="IBActionInfo" key="splitSelected:">
 							<string key="name">splitSelected:</string>
 							<string key="candidateClassName">id</string>
 							<string key="name">viewTexturePaintTool:</string>
 							<string key="candidateClassName">id</string>
 						</object>
+						<object class="IBActionInfo" key="viewVertexTool:">
+							<string key="name">viewVertexTool:</string>
+							<string key="candidateClassName">id</string>
+						</object>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="outlets">
 						<string key="addItemWithStepsSheetController">AddItemWithStepsSheetController</string>
 						<string key="textureBrowserWindowController">FPTextureBrowserWindowController</string>
 						<string key="texturePaintToolWindowController">FPTexturePaintToolWindowController</string>
 						<string key="topSplit">NSSplitView</string>
+						<string key="vertexWindowController">VertexWindowController</string>
 						<string key="viewFront">OpenGLSceneView</string>
 						<string key="viewLeft">OpenGLSceneView</string>
 						<string key="viewPerspective">OpenGLSceneView</string>
 							<string key="name">topSplit</string>
 							<string key="candidateClassName">NSSplitView</string>
 						</object>
+						<object class="IBToOneOutletInfo" key="vertexWindowController">
+							<string key="name">vertexWindowController</string>
+							<string key="candidateClassName">VertexWindowController</string>
+						</object>
 						<object class="IBToOneOutletInfo" key="viewFront">
 							<string key="name">viewFront</string>
 							<string key="candidateClassName">OpenGLSceneView</string>
 						<string key="minorKey">./Classes/ScriptWindowController.h</string>
 					</object>
 				</object>
+				<object class="IBPartialClassDescription">
+					<string key="className">VertexWindowController</string>
+					<string key="superclassName">NSWindowController</string>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VertexWindowController.h</string>
+					</object>
+				</object>
 			</array>
 		</object>
 		<int key="IBDocument.localizationMode">0</int>

MeshMaker.xcodeproj/project.pbxproj

 		A73659A113D228B100F9D7D1 /* MergeTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A736599E13D228B100F9D7D1 /* MergeTemplate.png */; };
 		A73659A213D228B100F9D7D1 /* SplitTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = A736599F13D228B100F9D7D1 /* SplitTemplate.png */; };
 		A736FC26165C0B8400961DC1 /* fragment.fs in Resources */ = {isa = PBXBuildFile; fileRef = A736FC24165C0B2300961DC1 /* fragment.fs */; };
+		A73FE08B16ECF4A7002A3B20 /* VertexWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A73FE08916ECF4A7002A3B20 /* VertexWindowController.mm */; };
+		A73FE08C16ECF4A7002A3B20 /* VertexWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A73FE08A16ECF4A7002A3B20 /* VertexWindowController.xib */; };
 		A7425A3F16B32EEE00440E61 /* TextureCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7425A3D16B32EEE00440E61 /* TextureCollection.cpp */; };
 		A746510512BD1C5A0030EEB0 /* MeshTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = A7064C8412BD109A00B14CFA /* MeshTest.mm */; };
 		A746510612BD1C5A0030EEB0 /* MyDocumentTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = A7064C8512BD109A00B14CFA /* MyDocumentTest.mm */; };
 		A736599F13D228B100F9D7D1 /* SplitTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SplitTemplate.png; sourceTree = "<group>"; };
 		A736FC24165C0B2300961DC1 /* fragment.fs */ = {isa = PBXFileReference; explicitFileType = sourcecode.glsl; fileEncoding = 4; path = fragment.fs; sourceTree = "<group>"; };
 		A73E3190151E409A00BCCEC2 /* MemoryStreaming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MemoryStreaming.h; path = Classes/MemoryStreaming.h; sourceTree = "<group>"; };
+		A73FE08816ECF4A7002A3B20 /* VertexWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VertexWindowController.h; path = Classes/VertexWindowController.h; sourceTree = "<group>"; };
+		A73FE08916ECF4A7002A3B20 /* VertexWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VertexWindowController.mm; path = Classes/VertexWindowController.mm; sourceTree = "<group>"; };
+		A73FE08A16ECF4A7002A3B20 /* VertexWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VertexWindowController.xib; path = Classes/VertexWindowController.xib; sourceTree = "<group>"; };
 		A7425A3D16B32EEE00440E61 /* TextureCollection.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = TextureCollection.cpp; path = Classes/TextureCollection.cpp; sourceTree = "<group>"; };
 		A7425A3E16B32EEE00440E61 /* TextureCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextureCollection.h; path = Classes/TextureCollection.h; sourceTree = "<group>"; };
 		A74BB39816C2FFC900B9C624 /* Exceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Exceptions.h; path = Classes/Exceptions.h; sourceTree = "<group>"; };
 				A7DF92C11514D352005E7EFC /* FPTexturePaintToolWindowController.h */,
 				A7DF92C21514D352005E7EFC /* FPTexturePaintToolWindowController.m */,
 				A7DF92C31514D352005E7EFC /* FPTexturePaintToolWindowController.xib */,
+				A73FE08816ECF4A7002A3B20 /* VertexWindowController.h */,
+				A73FE08916ECF4A7002A3B20 /* VertexWindowController.mm */,
+				A73FE08A16ECF4A7002A3B20 /* VertexWindowController.xib */,
 				A796A31F16AC59FA00339A58 /* Item.cpp */,
 				A7064C4212BD107800B14CFA /* Item.h */,
 				A796A32016AC59FA00339A58 /* ItemCollection.cpp */,
 				A76C2D271568F07200FEAAD5 /* PlaneTemplate.png in Resources */,
 				A7E8B3711631BDF500B8599D /* ScriptWindowController.xib in Resources */,
 				A7DACB9E16C7D66800FAF8ED /* FPSelectionWindowController.xib in Resources */,
+				A73FE08C16ECF4A7002A3B20 /* VertexWindowController.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 				A79F677216C6F8AC00BD3F9E /* JSWrappers.cpp in Sources */,
 				A7DACB9D16C7D66800FAF8ED /* FPSelectionWindowController.mm in Sources */,
 				A758EC8016CD12C0001C246E /* FPCurveView.cpp in Sources */,
+				A73FE08B16ECF4A7002A3B20 /* VertexWindowController.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};