Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
PrefabImporterBake.c
Go to the documentation of this file.
1#ifdef WORKBENCH
2
3static BaseContainer GetContainerFromList(string containerName, BaseContainerList containerList)
4{
5 for (int i = 0; i < containerList.Count(); i++)
6 {
7 if (containerList[i].GetClassName() == containerName)
8 return containerList.Get(i);
9 }
10 return null;
11}
12
13static const ref array<string> st = {"SCR_DestructibleBuildingEntity", "GenericEntity", "Building", "GameEntity", "StaticModelEntity"};
14
15FBXItem PopulateFBXItem(BaseContainer prefab, FBXItem slotOwner)
16{
17 if (!st.Contains(prefab.GetClassName()))
18 return null;
19
20 BaseContainerList components = prefab.GetObjectArray(EBTContainerFields.components);
21 BaseContainer meshObject = GetContainerFromList(EBTContainerFields.meshObject, components);
22
23 if (meshObject)
24 {
25 FBXItem result = new FBXItem();
26
27 ResourceName object;
28 meshObject.Get(EBTContainerFields.object, object);
29
30 string absPath = "";
31 Workbench.GetAbsolutePath(object.GetPath(), absPath, true);
32 absPath.Replace(".xob", ".fbx");
33 result.absPath = absPath;
34
35 BaseContainerList materials = meshObject.GetObjectArray("Materials");
36
37 if (materials)
38 {
39 for (int i = 0; i < materials.Count(); i++)
40 {
41 BaseContainer materialData = materials.Get(i);
42 ResourceName sourceMaterial, assignedMaterial;
43
44 materialData.Get("SourceMaterial", sourceMaterial);
45 materialData.Get("AssignedMaterial", assignedMaterial);
46 result.sourceToAssignedMaterial.Insert(sourceMaterial, assignedMaterial);
47 }
48 }
49
50 BaseContainer hierarchyComponent = GetContainerFromList(EBTContainerFields.hierarchy, components);
51 if (hierarchyComponent)
52 {
53 string pivotID;
54
55 hierarchyComponent.Get(EBTContainerFields.pivot, pivotID);
56
57 if (pivotID.Contains("glass"))
58 return null;
59
60 string checkForEntry = pivotID;
61 checkForEntry.ToLower();
62
63 if (pivotID && !checkForEntry.Contains("entry"))
64 {
65 if (slotOwner.slotToFbxChild.Contains(pivotID))
66 slotOwner.slotToFbxChild.Get(pivotID).Insert(result);
67 else
68 {
69 array<ref FBXItem> value = {result};
70 slotOwner.slotToFbxChild.Insert(pivotID, value);
71 }
72 }
73 }
74
75 for (int i = 0; i < prefab.GetNumChildren(); i++)
76 {
77 PopulateFBXItem(prefab.GetChild(i), result);
78 }
79
80 return result;
81 }
82
83 return null;
84}
85
86class FBXItem
87{
88 string absPath;
89 ref map<string, string> sourceToAssignedMaterial = new map<string, string>();
90 ref map<string, ref array<ref FBXItem>> slotToFbxChild = new map<string, ref array<ref FBXItem>>();
91}
92
93class PrefabImportRequest : JsonApiStruct
94{
95 string etAbsPath;
96
97 void PrefabImportRequest()
98 {
99 RegV("etAbsPath");
100 }
101}
102
103class PrefabImportErrorResponse : JsonApiStruct
104{
105 string msg = "ERROR";
106
107 void PrefabImportErrorResponse()
108 {
109 RegV("msg");
110 }
111}
112
113class PrefabImportResponse : JsonApiStruct
114{
115 ref FBXItem exportItem;
116
117 void PrefabImportResponse(FBXItem item)
118 {
119 exportItem = item;
120 }
121
122 void SerializeFBXItem(FBXItem item)
123 {
124 StartObject("fbx");
125 StoreString("path", item.absPath);
126
127 if (item.sourceToAssignedMaterial.Count() != 0)
128 {
129 StartObject("material_overrides");
130 foreach (string sourceMaterial, string assignedMaterial : item.sourceToAssignedMaterial)
131 {
132 StoreString(sourceMaterial, assignedMaterial);
133 }
134 EndObject();
135 }
136
137 if (item.slotToFbxChild.Count() != 0)
138 {
139 StartObject("sockets");
140 foreach (string slot, ref array<ref FBXItem> items : item.slotToFbxChild)
141 {
142 StartObject(slot);
143 foreach (ref FBXItem i : items)
144 {
145 SerializeFBXItem(i);
146 }
147 EndObject();
148 }
149 EndObject();
150 }
151
152 EndObject();
153 }
154
155 override void OnPack()
156 {
157 SerializeFBXItem(exportItem);
158 }
159}
160
161class PrefabImporterBake : NetApiHandler
162{
163 override JsonApiStruct GetRequest()
164 {
165 return new PrefabImportRequest();
166 }
167
168 override JsonApiStruct GetResponse(JsonApiStruct request)
169 {
170 PrefabImportRequest testRequest = PrefabImportRequest.Cast(request);
171 ResourceManager resourceManager = Workbench.GetModule(ResourceManager);
172 MetaFile meta = resourceManager.GetMetaFile(testRequest.etAbsPath);
173
174 Resource resource = Resource.Load(meta.GetResourceID());
175 BaseContainer prefab = resource.GetResource().ToBaseContainer();
176 FBXItem fbx = PopulateFBXItem(prefab, null);
177
178 if (!fbx)
179 {
180 PrefabImportErrorResponse response = new PrefabImportErrorResponse();
181 return response;
182 }
183
184 PrefabImportResponse response = new PrefabImportResponse(fbx);
185 return response;
186 }
187
188 static bool GetBaseFBX(ResourceName resourceName, out string absPath)
189 {
190 Resource resource = Resource.Load(resourceName);
191 BaseContainer prefab = resource.GetResource().ToBaseContainer();
192
193 BaseContainerList components = prefab.GetObjectArray(EBTContainerFields.components);
194 BaseContainer meshObject = GetContainerFromList(EBTContainerFields.meshObject, components);
195
196 if(!meshObject)
197 return false;
198
199 ResourceName object;
200 meshObject.Get(EBTContainerFields.object, object);
201
202 string path;
203 Workbench.GetAbsolutePath(object.GetPath(), path, true);
204 path.Replace(".xob", ".fbx");
205 absPath = path;
206
207 return true;
208 }
209}
210
211#endif
string path
override JsonApiStruct GetResponse(JsonApiStruct request)
ref array< string > fbx
SCR_AICombatMoveRequestBase GetRequest()
ResourceName resourceName
Definition SCR_AIGroup.c:66
override void OnPack()
base classes for filtering in server browser