ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/irf_oni.onlv.vb
Revision: 10
Committed: Sat Aug 26 17:49:08 2006 UTC (19 years, 1 month ago) by alloc
File size: 14595 byte(s)
Log Message:

File Contents

# Content
1 Public Type LWOPolygon
2 NumVe As Integer
3 P1 As Integer
4 P2 As Integer
5 P3 As Integer
6 Surfa As Integer
7 End Type
8
9 Public Type PolDef
10 P1 As Integer
11 P2 As Integer
12 P3 As Integer
13 End Type
14
15 'Texture Coordinate Entry
16 Public Type TXCAentry
17 X As Single
18 Y As Single
19 End Type
20
21 'Texture Coordinate Lists
22 Public Type TXCA 'Length
23 ID As Long '4
24 Version As Long '8
25 Filler(1 To 5) As Long '28
26 NumEntries As Long '32
27 End Type
28
29 'Level Data Reference List
30 Public Type ONLV 'Length
31 ID As Long '4
32 Version As Long '8
33 LevelName As String * 64 '72
34 AKEVid As Long '76
35 OBOAid As Long '80
36 ONMAid As Long '84
37 ONFAid As Long '88
38 ONTAid As Long '92
39 ONSKid As Long '96
40 Unkn As Long '100
41 AISAid As Long '104
42 AITRid As Long '108
43 ONSAid As Long '112
44 OBDCid As Long '116
45 ONOAid As Long '120
46 Fill(1 To 161) As Long '764
47 CRSAid As Long '768
48 End Type
49
50 Public Type AGQG
51 ID As Long
52 unk(1 To 24) As Byte
53 NumEntries As Long
54 End Type
55
56 Public Type AGQGEntry
57 VertIndex(1 To 4) As Long
58 VertUVIndex(1 To 4) As Long
59 LData_1(1 To 4) As Byte
60 LData_2(1 To 4) As Byte
61 LData_3(1 To 4) As Byte
62 LData_4(1 To 4) As Byte
63 unk(1 To 2) As Long
64 End Type
65
66 Public Type AGQREntry
67 TexIndex As Integer
68 unk As Integer
69 End Type
70
71 Public Type TXMA
72 ID As Long
73 shit(1 To 24) As Byte
74 NumEntries As Long
75 End Type
76
77 Public Type TXMAEntry
78 TXMP_ID As Long
79 End Type
80
81
82
83
84
85 Public Sub CExportONLV(Optional FileName As String)
86 Form1.StatusBar1.SimpleText = "Status: Extracting LEVEL....."
87 Dim ID4 As Long
88 Dim I As Long
89 Dim L As Long
90 Dim LwoP() As LWOPolygon
91 Dim OniPol2() As PolDef
92 Dim NP As Long
93 Dim numb As Long
94
95 Dim TXMA1 As TXMA
96 Dim AGQR1 As TXMA
97 Dim TXCA1 As TXCA
98 Dim TXCA_E() As TXCAentry
99 Dim TXMA_E() As TXMAEntry
100 Dim AGQR_E() As AGQREntry
101 Dim TexNames() As String
102
103 If FileName = "" Then
104 Form1.CD.DialogTitle = "Unpack resource..."
105 Form1.CD.FileName = OniEntry(Curr).szTagName
106 Form1.CD.Filter = "LightWave (*.lwo)|*.lwo"
107 Form1.CD.Flags = &H2 + &H4
108 Form1.CD.ShowSave
109 FileName = Form1.CD.FileName
110 If FileName = "" Then Exit Sub
111 End If
112
113 DoEvents
114
115 Open DatFile For Binary As #1
116 Get 1, OniEntry(Curr).rDataPosition, ONLV
117 For I = 0 To UBound(OniEntry) - 1
118 Get 1, OniEntry(I).rDataPosition, ID4
119 If ID4 = ONLV.AKEVid Then
120 Get 1, OniEntry(I).rDataPosition, AKEV
121 Exit For
122 End If
123 Next I
124
125 'Find ID of PNTA
126 For I = 0 To UBound(OniEntry) - 1
127 Get 1, OniEntry(I).rDataPosition, ID4
128 If ID4 = AKEV.PNTAid Then
129 Get 1, OniEntry(I).rDataPosition, PNTA
130 ReDim PNTAentry(PNTA.NumEntries - 1)
131 Get 1, , PNTAentry
132 Exit For
133 End If
134 Next I
135
136 For I = 0 To UBound(OniEntry) - 1
137 Get 1, OniEntry(I).rDataPosition, ID4
138 If ID4 = AKEV.AGQGid Then
139 Get 1, OniEntry(I).rDataPosition, AGQG
140 ReDim AGQGEntry(AGQG.NumEntries - 1)
141 Get 1, , AGQGEntry
142 Exit For
143 End If
144 Next I
145
146 'TXCA
147 For I = 0 To UBound(OniEntry) - 1
148 Get 1, OniEntry(I).rDataPosition, ID4
149 If ID4 = AKEV.TXCAid Then
150 Get 1, OniEntry(I).rDataPosition, TXCA1
151 ReDim TXCA_E(TXCA1.NumEntries - 1)
152 Get 1, , TXCA_E
153 ReDim Preserve TXCA_E(PNTA.NumEntries - 1)
154 Exit For
155 End If
156 Next I
157
158 'TXMA
159 For I = 0 To UBound(OniEntry) - 1
160 Get 1, OniEntry(I).rDataPosition, ID4
161 If ID4 = AKEV.TXMAid Then
162 Get 1, OniEntry(I).rDataPosition, TXMA1
163 ReDim TXMA_E(TXMA1.NumEntries - 1)
164 Get 1, , TXMA_E
165 Exit For
166 End If
167 Next I
168
169 'AGQR
170 For I = 0 To UBound(OniEntry) - 1
171 Get 1, OniEntry(I).rDataPosition, ID4
172 If ID4 = AKEV.AGQRid Then
173 Get 1, OniEntry(I).rDataPosition, AGQR1
174 ReDim AGQR_E(AGQR1.NumEntries - 1)
175 Get 1, , AGQR_E
176 Exit For
177 End If
178 Next I
179
180 ReDim TexNames(TXMA1.NumEntries - 1)
181
182 For I = 0 To TXMA1.NumEntries - 1
183 For L = 0 To UBound(OniEntry) - 1
184 Get 1, OniEntry(L).rDataPosition, ID4
185 If ID4 = TXMA_E(I).TXMP_ID Then
186 TexNames(I) = OniEntry(L).szTagName + Ext
187 Exit For
188 End If
189 Next L
190 Next I
191
192 Close
193 'Ok
194 ' so we have: 3D points, Texture coordinates and list of polygons,
195 ' end reading, now convert data
196 I = 0
197 Open App.Path + "\lwo.tmp" For Binary As #11
198 Form1.StatusBar1.SimpleText = "Status: Extracting LEVEL [Reading Polygons...]"
199 Seek 11, 1
200
201 'reading polygons.......
202
203 NP = AGQG.NumEntries * 2
204 For I = 0 To AGQG.NumEntries - 1
205 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
206 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
207 NP = NP - 2
208 Case Else
209 Select Case Mid$(GetPureFile(TexNames(AGQR_E(I).TexIndex)), 1, 5)
210 Case "_DOOR"
211 NP = NP - 2
212 Case Else
213 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(1))
214 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(2))
215 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(3))
216 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(3))
217 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(4))
218 Put 11, , TestSwapInt(AGQGEntry(I).VertIndex(1))
219 End Select
220 End Select
221 Next I
222
223
224
225 ReDim OniPol2(NP - 1)
226 ReDim LwoP(NP - 1)
227 Get 11, 1, OniPol2
228
229 For I = 0 To NP - 1
230 LwoP(I).NumVe = ISItoMSI(3)
231 LwoP(I).P1 = OniPol2(I).P1
232 LwoP(I).P2 = OniPol2(I).P2
233 LwoP(I).P3 = OniPol2(I).P3
234 LwoP(I).Surfa = ISItoMSI(1)
235 Next I
236
237 I = Empty
238
239 Close
240
241 On Error Resume Next
242 Kill App.Path + "\*.tmp"
243 On Error GoTo 0
244
245 Form1.StatusBar1.SimpleText = "Status: Extracting LEVEL [Writing...]"
246 Form1.ProgressBar1.Max = PNTA.NumEntries
247 Form1.ProgressBar1.Value = 0
248 If LevelType = 5 Or LevelType = 10 Then
249 FileName = GetPureFile(FileName) + ".raw"
250 End If
251
252 For I = 0 To PNTA.NumEntries - 1
253 If PNTAentry(I).X > 2000000.1 Then PNTAentry(I).X = 0
254 If PNTAentry(I).Y > 2000000.1 Then PNTAentry(I).Y = 0
255 If PNTAentry(I).Z > 2000000.1 Then PNTAentry(I).Z = 0
256 If PNTAentry(I).X < -2000000.1 Then PNTAentry(I).X = 0
257 If PNTAentry(I).Y < -2000000.1 Then PNTAentry(I).Y = 0
258 If PNTAentry(I).Z < -2000000.1 Then PNTAentry(I).Z = 0
259 Next I
260
261 Select Case LevelType
262 Case 1
263
264 Open FileName For Binary As #1
265 Put 1, , "FORM"
266 Put 1, , ISLtoMSL(12 + (PNTA.NumEntries * 12) + 8 + 6 + 8 + (NP * 10))
267 Put 1, , "LWOBPNTS"
268 Put 1, , ISLtoMSL(PNTA.NumEntries * 12)
269 For I = 0 To PNTA.NumEntries - 1
270 Put 1, , SwapFloat(PNTAentry(I).X)
271 Put 1, , SwapFloat(PNTAentry(I).Y)
272 Put 1, , SwapFloat(PNTAentry(I).Z)
273 Form1.ProgressBar1.Value = I
274 Next I
275 Put 1, , "SRFS"
276 Put 1, , ISLtoMSL(6)
277 Put 1, , "Level"
278 Put 1, , CByte(0)
279 Put 1, , "POLS"
280 Put 1, , ISLtoMSL(NP * 10)
281 Put 1, , LwoP
282 Close
283 Case 6
284
285 ' Convert Oni level to RAW 3D Binary
286 Open GetPureFile(FileName) + ".rwb" For Binary As #1
287 For I = 0 To AGQG.NumEntries - 1
288 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).X
289 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Y
290 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Z
291 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).X
292 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).Y
293 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).Z
294 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).X
295 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Y
296 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Z
297 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).X
298 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Y
299 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Z
300 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).X
301 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).Y
302 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).Z
303 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).X
304 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Y
305 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Z
306 Next I
307
308 Close
309 Case 7
310
311 ' B3D
312 Open GetPureFile(FileName) + ".b3d" For Binary As #1
313 Put 1, , "Big3DbyOleg"
314 Put 1, , CLng(1067030938)
315 Put 1, , "POINTS "
316 Put 1, , CLng(PNTA.NumEntries)
317 For I = 0 To PNTA.NumEntries - 1
318 Put 1, , PNTAentry(I).X
319 Put 1, , PNTAentry(I).Y
320 Put 1, , PNTAentry(I).Z
321 Next I
322
323 Put 1, , "POLYGONS"
324 Put 1, , CLng(NP * 2)
325 For I = 0 To AGQG.NumEntries - 1
326 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
327 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
328 'nothing
329 Case Else
330 Select Case Mid$(GetPureFile(TexNames(AGQR_E(I).TexIndex)), 1, 5)
331 Case "_DOOR"
332 'nothing
333 Case Else
334 Put 1, , CLng(3)
335 Put 1, , AGQGEntry(I).VertIndex(1)
336 Put 1, , AGQGEntry(I).VertIndex(2)
337 Put 1, , AGQGEntry(I).VertIndex(3)
338 Put 1, , CLng(0)
339 Put 1, , CLng(3)
340 Put 1, , AGQGEntry(I).VertIndex(3)
341 Put 1, , AGQGEntry(I).VertIndex(4)
342 Put 1, , AGQGEntry(I).VertIndex(1)
343 Put 1, , CLng(0)
344 End Select
345 End Select
346 Next I
347 Put 1, , CLng(0)
348 Close
349
350 Case 8
351
352 'Delete shit from the Oni level
353 numb = AGQG.NumEntries
354 ReDim Preserve PNTAentry(PNTA.NumEntries + 3)
355 PNTAentry(PNTA.NumEntries + 0).X = -9
356 PNTAentry(PNTA.NumEntries + 0).Y = 0
357 PNTAentry(PNTA.NumEntries + 0).Z = -3
358 PNTAentry(PNTA.NumEntries + 1).X = -9
359 PNTAentry(PNTA.NumEntries + 1).Y = 0
360 PNTAentry(PNTA.NumEntries + 1).Z = 8
361 PNTAentry(PNTA.NumEntries + 2).X = 11
362 PNTAentry(PNTA.NumEntries + 2).Y = 0
363 PNTAentry(PNTA.NumEntries + 2).Z = -3
364 PNTAentry(PNTA.NumEntries + 3).X = 11
365 PNTAentry(PNTA.NumEntries + 3).Y = 0
366 PNTAentry(PNTA.NumEntries + 3).Z = 8
367
368 If Form1.mnuDelGarbage.Checked = True Then
369 For I = 0 To AGQG.NumEntries - 1
370 Select Case Mid$(GetPureFile(TexNames(AGQR_E(I).TexIndex)), 1, 5)
371 Case "_DOOR"
372 AGQGEntry(I).VertIndex(1) = PNTA.NumEntries + 0
373 AGQGEntry(I).VertIndex(2) = PNTA.NumEntries + 1
374 AGQGEntry(I).VertIndex(3) = PNTA.NumEntries + 2
375 AGQGEntry(I).VertIndex(4) = PNTA.NumEntries + 3
376 'numb = numb - 1
377 End Select
378 Next I
379 End If
380
381 For I = 0 To AGQG.NumEntries - 1
382 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
383 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
384 AGQGEntry(I).VertIndex(1) = PNTA.NumEntries + 0
385 AGQGEntry(I).VertIndex(2) = PNTA.NumEntries + 1
386 AGQGEntry(I).VertIndex(3) = PNTA.NumEntries + 2
387 AGQGEntry(I).VertIndex(4) = PNTA.NumEntries + 3
388 numb = numb - 1
389 End Select
390 Next I
391
392 'B3D + materials
393 Open GetPureFile(FileName) + ".b3d" For Binary As #1
394 Put 1, , "Big3DbyOleg"
395 Put 1, , CLng(1067030938)
396 Put 1, , "POINTS "
397 Put 1, , CLng(numb * 4)
398
399 For I = 0 To AGQG.NumEntries - 1
400 ' Begin polygon
401 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
402 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
403 'nothing
404 Case Else
405 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).X
406 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Y
407 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(1)).Z
408
409 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).X
410 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).Y
411 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(2)).Z
412
413 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).X
414 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Y
415 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(3)).Z
416
417 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).X
418 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).Y
419 Put 1, , PNTAentry(AGQGEntry(I).VertIndex(4)).Z
420 End Select
421 ' end polygon
422 Next I
423
424 Put 1, , "POLYGONS"
425 Put 1, , CLng(numb * 2)
426 L = 0
427 ID4 = 0
428 For I = 0 To AGQG.NumEntries - 1
429 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
430 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
431 'nothing
432 Case Else
433 Put 1, , CLng(3)
434 Put 1, , CLng(L)
435 Put 1, , CLng(L + 1)
436 Put 1, , CLng(L + 2)
437 Put 1, , CLng(ID4)
438 Put 1, , CLng(3)
439 Put 1, , CLng(L + 2)
440 Put 1, , CLng(L + 3)
441 Put 1, , CLng(L)
442 Put 1, , CLng(ID4)
443 ID4 = ID4 + 1
444 L = L + 4
445 End Select
446 Next I
447
448 Put 1, , CLng(1)
449 Put 1, , "TEX_UV "
450 Put 1, , CLng(numb * 4)
451 L = 0
452
453 For I = 0 To AGQG.NumEntries - 1
454 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
455 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
456 'nothing
457 Case Else
458 Put 1, , CLng(L)
459 L = L + 1
460 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(1)).X
461 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(1)).Y
462 Put 1, , CLng(L)
463 L = L + 1
464 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(2)).X
465 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(2)).Y
466 Put 1, , CLng(L)
467 L = L + 1
468 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(3)).X
469 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(3)).Y
470 Put 1, , CLng(L)
471 L = L + 1
472 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(4)).X
473 Put 1, , TXCA_E(AGQGEntry(I).VertUVIndex(4)).Y
474 End Select
475 'Put 1, , CSng((-TXCA_E(I).Y) + 1)
476 Next I
477
478 L = 0
479 Put 1, , "MATERIAL"
480 Put 1, , CLng(numb)
481 For I = 0 To AGQG.NumEntries - 1
482 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
483 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
484 'nothing
485 Case Else
486 Put 1, , CLng(1)
487 Put 1, , CLng(L)
488 Put 1, , CLng(Len(TexNames(AGQR_E(I).TexIndex)))
489 Put 1, , TexNames(AGQR_E(I).TexIndex)
490 L = L + 1
491 End Select
492 Next I
493 Close
494
495 Open GetPureFile(FileName) + ".tlist" For Binary As #4
496 For I = 0 To AGQR1.NumEntries - 1
497 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
498 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
499 'nothing
500 Case Else
501 Put 4, , AGQR_E(I).TexIndex
502 End Select
503 Next I
504 Close
505
506 Open GetPureFile(FileName) + ".txt" For Output As #4
507 Print #4, CStr(TXMA1.NumEntries)
508 For I = 0 To TXMA1.NumEntries - 1
509 Print #4, CStr(GetPureFile(TexNames(I)))
510 Next I
511 Close
512
513 If Form1.mnuB3DLight.Checked = True Then
514 Open GetPureFile(FileName) + ".ltcs" For Binary As #4
515 For I = 0 To AGQR1.NumEntries - 1
516 Select Case GetPureFile(TexNames(AGQR_E(I).TexIndex))
517 Case "BLUEGRID02", "_DOOR_FRAME", "", "COLLISION"
518 'nothing
519 Case Else
520 Put 4, , AGQGEntry(I).LData_1
521 Put 4, , AGQGEntry(I).LData_2
522 Put 4, , AGQGEntry(I).LData_3
523 Put 4, , AGQGEntry(I).LData_4
524 End Select
525 Next I
526 Close
527 End If
528 End Select
529
530 Form1.ProgressBar1.Value = 0
531 Form1.ProgressBar1.Max = UBound(OniEntry)
532
533 Form1.StatusBar1.SimpleText = "OK"
534 'Dispose
535 I = Empty
536 NP = Empty
537 Erase LwoP
538 Erase PNTAentry
539 Erase OniPol2
540 Erase AGQGEntry
541 Erase AGQR_E
542 Erase TXMA_E
543 Erase TXCA_E
544 Erase TexNames
545 End Sub

Properties

Name Value
svn:executable *