Skip to content

Commit 9cf7fcd

Browse files
committed
Merge branch 'gltf-support'
2 parents b03aebe + f3ddfc6 commit 9cf7fcd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+4593
-1951
lines changed

Mafia2Libs/Controls/ControlOptionFrameAdd.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private FrameResourceObjectType GetTypeFromIndexToLookupTable()
6666
SelectedType = FrameResourceObjectType.Collision;
6767
break;
6868
case 12:
69-
SelectedType = FrameResourceObjectType.Joint;
69+
SelectedType = FrameResourceObjectType.Point;
7070
break;
7171
default:
7272
SelectedType = FrameResourceObjectType.NULL;

Mafia2Libs/Controls/FrameResourceModelExporter.Designer.cs

Lines changed: 341 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
using ResourceTypes.ModelHelpers.ModelExporter;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Windows.Forms;
5+
using Utils.Language;
6+
using Utils.Models;
7+
8+
namespace Forms.EditorControls
9+
{
10+
public partial class FrameResourceModelExporter : Form
11+
{
12+
// Generic Variables (fields)
13+
private MT_ObjectBundle CurrentBundle;
14+
private MT_ValidationTracker TrackerObject;
15+
private IImportHelper CurrentHelper;
16+
17+
public FrameResourceModelExporter(ModelWrapper Wrapper)
18+
{
19+
InitializeComponent();
20+
InitializeControls();
21+
22+
MT_Object Model = Wrapper.ModelObject;
23+
TreeView_Objects.Nodes.Add(ConvertObjectToNode(Model));
24+
25+
// Create a bundle to make it easier to validate
26+
CurrentBundle = new MT_ObjectBundle();
27+
CurrentBundle.Objects = new MT_Object[1];
28+
CurrentBundle.Objects[0] = Model;
29+
30+
InitiateValidation();
31+
}
32+
33+
public FrameResourceModelExporter(MT_ObjectBundle ObjectBundle)
34+
{
35+
InitializeComponent();
36+
InitializeControls();
37+
38+
CurrentBundle = ObjectBundle;
39+
40+
InitiateValidation();
41+
42+
TreeView_Objects.Nodes.Add(ConvertBundleToNode(ObjectBundle));
43+
}
44+
45+
private void InitializeControls()
46+
{
47+
Localise();
48+
}
49+
50+
private void Localise()
51+
{
52+
Button_Validate.Text = Language.GetString("$VALIDATE");
53+
Button_Continue.Text = Language.GetString("$CONTINUE");
54+
Button_StopImport.Text = Language.GetString("$STOP");
55+
TabPage_Model.Text = Language.GetString("$TAB_MODELS");
56+
TabPage_Validation.Text = Language.GetString("$TAB_VALIDATION");
57+
TabPage_ConvertLogs.Text = Language.GetString("$TAB_IMPORT_LOG");
58+
Text = Language.GetString("$TITLE_EXPORT_MODEL_BUNDLE");
59+
}
60+
61+
private TreeNode ConvertObjectToNode(MT_Object Object)
62+
{
63+
TreeNode Root = new TreeNode(Object.ObjectName);
64+
Root.Tag = Object;
65+
ValidateObject(Root);
66+
67+
if (Object.ObjectFlags.HasFlag(MT_ObjectFlags.HasLODs))
68+
{
69+
for (int i = 0; i < Object.Lods.Length; i++)
70+
{
71+
TreeNode LodNode = new TreeNode("LOD" + i);
72+
LodNode.Tag = Object.Lods[i];
73+
ValidateObject(LodNode);
74+
Root.Nodes.Add(LodNode);
75+
}
76+
}
77+
78+
if (Object.ObjectFlags.HasFlag(MT_ObjectFlags.HasSkinning))
79+
{
80+
if (Object.Skeleton != null)
81+
{
82+
TreeNode SkeletonNode = new TreeNode("Skeleton");
83+
SkeletonNode.Tag = Object.Skeleton;
84+
ValidateObject(SkeletonNode);
85+
Root.Nodes.Add(SkeletonNode);
86+
}
87+
}
88+
89+
if (Object.ObjectFlags.HasFlag(MT_ObjectFlags.HasCollisions))
90+
{
91+
TreeNode SCollisionNode = new TreeNode("Static Collision");
92+
SCollisionNode.Tag = Object.Collision;
93+
ValidateObject(SCollisionNode);
94+
Root.Nodes.Add(SCollisionNode);
95+
}
96+
97+
if (Object.ObjectFlags.HasFlag(MT_ObjectFlags.HasChildren))
98+
{
99+
foreach (MT_Object Child in Object.Children)
100+
{
101+
Root.Nodes.Add(ConvertObjectToNode(Child));
102+
}
103+
}
104+
105+
return Root;
106+
}
107+
108+
private TreeNode ConvertBundleToNode(MT_ObjectBundle Bundle)
109+
{
110+
TreeNode Root = new TreeNode("Bundle");
111+
Root.Tag = Bundle;
112+
ValidateObject(Root);
113+
114+
foreach (MT_Object ObjectInfo in Bundle.Objects)
115+
{
116+
Root.Nodes.Add(ConvertObjectToNode(ObjectInfo));
117+
}
118+
119+
return Root;
120+
}
121+
122+
private void TreeView_OnAfterSelect(object sender, TreeViewEventArgs e)
123+
{
124+
e.Node.SelectedImageIndex = e.Node.ImageIndex;
125+
126+
// Create a Helper based on the object we have selected.
127+
IImportHelper NewHelper = null;
128+
if (e.Node.Tag is MT_Lod)
129+
{
130+
NewHelper = new MT_LodHelper((MT_Lod)e.Node.Tag);
131+
}
132+
else if (e.Node.Tag is MT_Object)
133+
{
134+
NewHelper = new MT_ObjectHelper((MT_Object)e.Node.Tag);
135+
}
136+
else if (e.Node.Tag is MT_Collision)
137+
{
138+
NewHelper = new MT_CollisionHelper((MT_Collision)e.Node.Tag);
139+
}
140+
else if (e.Node.Tag is MT_Skeleton)
141+
{
142+
NewHelper = new MT_SkeletonHelper((MT_Skeleton)e.Node.Tag);
143+
}
144+
145+
// Then set it up from the object we pass into the helper,
146+
// and continue by caching it and assigning onto the property grid.
147+
// This is guarded as some items (like the bundle node) does not have a helper.
148+
if (NewHelper != null)
149+
{
150+
NewHelper.Setup();
151+
CurrentHelper = NewHelper;
152+
PropertyGrid_Model.SelectedObject = NewHelper;
153+
}
154+
155+
// Get validation messages for object and add to tab
156+
ListBox_Validation.Items.Clear();
157+
List<string> Messages = TrackerObject.GetObjectMessages((IValidator)e.Node.Tag);
158+
foreach (string Message in Messages)
159+
{
160+
ListBox_Validation.Items.Add(Message);
161+
}
162+
}
163+
164+
private void TreeView_OnBeforeSelect(object sender, TreeViewCancelEventArgs e)
165+
{
166+
// clear validation box
167+
ListBox_Validation.Items.Clear();
168+
169+
// clear helper
170+
CurrentHelper = null;
171+
}
172+
173+
private void ValidateObject(TreeNode CurrentNode)
174+
{
175+
IValidator ValidationObject = (CurrentNode.Tag as IValidator);
176+
if (ValidationObject != null)
177+
{
178+
bool bIsValid = TrackerObject.IsObjectValid((IValidator)CurrentNode.Tag);
179+
CurrentNode.ImageIndex = (bIsValid ? 1 : 0);
180+
}
181+
}
182+
183+
private void InitiateValidation()
184+
{
185+
TrackerObject = new MT_ValidationTracker();
186+
CurrentBundle.ValidateObject(TrackerObject);
187+
188+
Label_DebugMessage.Text = string.Format("[MESSAGE COUNT: {0}]", TrackerObject.GetMessageCount());
189+
}
190+
191+
private void Button_Continue_Click(object sender, EventArgs e)
192+
{
193+
DialogResult = DialogResult.OK;
194+
CleanupHelper();
195+
196+
Close();
197+
}
198+
199+
private void Button_StopImport_Click(object sender, EventArgs e)
200+
{
201+
DialogResult = DialogResult.Cancel;
202+
CleanupHelper();
203+
Close();
204+
}
205+
206+
private void CleanupHelper()
207+
{
208+
if (CurrentHelper != null)
209+
{
210+
CurrentHelper.Store();
211+
}
212+
}
213+
214+
private void Button_Validate_Click(object sender, EventArgs e)
215+
{
216+
InitiateValidation();
217+
218+
PropertyGrid_Model.SelectedObject = null;
219+
TreeView_Objects.Nodes.Clear();
220+
221+
TreeView_Objects.Nodes.Add(ConvertBundleToNode(CurrentBundle));
222+
}
223+
224+
private void PropertyGrid_Model_OnPropertyValueChanged(object s, PropertyValueChangedEventArgs e)
225+
{
226+
// Make sure we are selecting an object
227+
TreeNode Selected = TreeView_Objects.SelectedNode;
228+
if (Selected == null)
229+
{
230+
return;
231+
}
232+
233+
// We want to update the object.
234+
// This will essentially move all properties from the helper
235+
// directly into the object. This is used to avoid bloat on the
236+
// property grid.
237+
if (CurrentHelper != null)
238+
{
239+
CurrentHelper.Store();
240+
}
241+
}
242+
243+
private void HelperContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
244+
{
245+
HelperContextMenu.Items.Clear();
246+
247+
if (TreeView_Objects.SelectedNode == null)
248+
{
249+
// nothing selected
250+
e.Cancel = true;
251+
return;
252+
}
253+
254+
if (CurrentHelper == null)
255+
{
256+
// no valid helper
257+
e.Cancel = true;
258+
return;
259+
}
260+
261+
// Let the helper add their own context items
262+
string[] HelperItems = CurrentHelper.GetContextItems();
263+
foreach(string Item in HelperItems)
264+
{
265+
HelperContextMenu.Items.Add(Item);
266+
}
267+
268+
// cancel the context strip menu if we don't even have items
269+
if (HelperContextMenu.Items.Count == 0)
270+
{
271+
e.Cancel = true;
272+
}
273+
}
274+
275+
private void HelperContextMenu_OnItemClicked(object sender, ToolStripItemClickedEventArgs e)
276+
{
277+
if(CurrentHelper == null)
278+
{
279+
return;
280+
}
281+
282+
// The Current helper might want to chime in
283+
CurrentHelper.OnContextItemSelected(e.ClickedItem.Text);
284+
}
285+
}
286+
}

0 commit comments

Comments
 (0)