2,112
edits
Paradox-01 (talk | contribs) (read and write text file, change position of object and scene fundamentals) |
m (using Image: consistently to make it easier to find all image refs on a page) |
||
| (14 intermediate revisions by 3 users not shown) | |||
| Line 14: | Line 14: | ||
'''Links''' | '''Links''' | ||
* [http://softimage.wiki.softimage.com/index.php?title=Scripting_Tips_and_Tricks_%28XSISDK%29 xsi wiki page about scripting] | * [http://web.archive.org/web/20160803061035/http://softimage.wiki.softimage.com/index.php?title=Scripting_Tips_and_Tricks_%28XSISDK%29 xsi wiki page about scripting] | ||
* '''[http://softimage.wiki.softimage.com/sdkdocs/scriptsdb/scriptsdb/scrdb_vbscript.htm many vbscript examples]''' | * '''[http://web.archive.org/web/20170616035120/http://softimage.wiki.softimage.com/sdkdocs/scriptsdb/scriptsdb/scrdb_vbscript.htm many vbscript examples]''' | ||
* '''[ | * '''[https://ss64.com/vb/ vbs commands]''' | ||
* [ | * [https://web.archive.org/web/20070510173452/https://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/filesfolders/files/ objFSO/objWSHShell: Scripts to manage Files] (replace "Wscript.Echo" with "logmessage") | ||
* [http://activexperts.com/activmonitor/windowsmanagement/adminscripts/other/textfiles/ objFSO/objWSHShell: Scripts to manage Text Files] | * [https://web.archive.org/web/20150504221146/http://activexperts.com/activmonitor/windowsmanagement/adminscripts/other/textfiles/ objFSO/objWSHShell: Scripts to manage Text Files] | ||
* [http://www.kxcad.net/ | * [http://web.archive.org/web/20080905102848/http://www.kxcad.net/softimage_xsi/Softimage_XSI_Documentation/script_basics_IncludingExternalScripts.htm using external scripts] | ||
* [ | * [https://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/index.html?url=si_om/XSIUIToolkit.html,topicNumber=si_om_XSIUIToolkit_html progress bar and open file dialog<!-- (hm, InitialDirectory code for quick save idea ?)-->] | ||
<!--* [http://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/index.html?url=files/cus_ppg_FileBrowserWidget.htm,topicNumber=d30e11980,hash=WS34BA39B437A993419C80CAB58E3BEFA1-0059 text box]--> | <!--* [http://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/index.html?url=files/cus_ppg_FileBrowserWidget.htm,topicNumber=d30e11980,hash=WS34BA39B437A993419C80CAB58E3BEFA1-0059 text box]--> | ||
| Line 83: | Line 83: | ||
logmessage GetGlobal ("MyGloVar") | logmessage GetGlobal ("MyGloVar") | ||
Further information are found over [ | Further information are found over [https://download.autodesk.com/global/docs/softimage2014/en_us/sdkguide/si_cmds/SetGlobal.html HERE.] | ||
| Line 100: | Line 100: | ||
logmessage XSIUtils.Environment("MyVar") | logmessage XSIUtils.Environment("MyVar") | ||
As the information is a string you need to convert it back to what it was meant originally e.g. with cBool and cInt. For more conversion see [http://www.w3schools.com/vbscript/vbscript_ref_functions.asp HERE] | As the information is a string you need to convert it back to what it was meant originally e.g. with cBool and cInt. For more conversion see [http://web.archive.org/web/20150707131602/http://www.w3schools.com/vbscript/vbscript_ref_functions.asp HERE] | ||
| Line 375: | Line 375: | ||
=== | ===Dealing with different decimal marks=== | ||
Decimal sign is either period or comma. | Decimal sign is either period or comma. | ||
| Line 570: | Line 570: | ||
'''Via winmgmts''' | '''Via winmgmts''' | ||
' slightly modified code from [ | ' slightly modified code from [https://devblogs.microsoft.com/scripting/how-can-i-start-a-process-and-then-wait-for-the-process-to-end-before-terminating-the-script/ that site] | ||
' ''logmessage "onisplit finished."'' will be executed after the conversion finished, there should be also an delay of 3 seconds to support very slow computers | ' ''logmessage "onisplit finished."'' will be executed after the conversion finished, there should be also an delay of 3 seconds to support very slow computers | ||
' if you are going to use this method consider to extent the code to check if input file and output directory exist | ' if you are going to use this method consider to extent the code to check if input file and output directory exist | ||
| Line 812: | Line 812: | ||
==Modify file== | ====AKEV AGQG==== | ||
===Binary=== | read_AGQG_binary | ||
[[Image:Before_and_after_binary_patching_with_vbs.png|thumb|400px|Before and after patching.]] | |||
Change FilePath and in case of binary patching use function "StringToByteArray". | sub read_AGQG_binary | ||
OniInputFile = "C:\Oni\AE\GameDataFolder\L3\AKEVlab.oni" | |||
FilePath = "C:\path_to\AKEVEnvWarehouse.oni" | ' ############################################## | ||
' ### create stream objects | Set OniInputFileStream = CreateObject("ADODB.Stream") | ||
Set InputStream = CreateObject("ADODB.Stream") | OniInputFileStream.Type = 1 | ||
InputStream.Type = 1 | OniInputFileStream.Open | ||
InputStream.Open | OniInputFileStream.LoadFromFile OniInputFile | ||
Set OutputStream = CreateObject("ADODB.Stream") | |||
OutputStream.Type = 1 | data_table_offset = "&H20" | ||
OutputStream.Open | AGQG_table_offset = "&H94" | ||
AGQG_table_size = "&H9C" | |||
' ### load input stream from file | |||
InputStream.LoadFromFile FilePath | |||
ByteNum = 4 | |||
' ### copy first 16 signs of input stream to output stream | OniInputFileStream.Position = clng(data_table_offset) | ||
OutputStream.Write InputStream.Read(16) | BArr0 = OniInputFileStream.Read(ByteNum) | ||
' ### apply patch | ByteNum = 4 | ||
' # ASCII patching | OniInputFileStream.Position = clng(AGQG_table_offset) | ||
patch_data = "ABCD" | BArr1 = OniInputFileStream.Read(ByteNum) | ||
patch_data_length = len(patch_data) | |||
' patch_data_length = 4 | ByteNum = 4 | ||
InputStream.Position = InputStream.Position + patch_data_length | OniInputFileStream.Position = clng(AGQG_table_size) | ||
OutputStream.Write CreateObject("System.Text.ASCIIEncoding").GetBytes_4(patch_data) | BArr2 = OniInputFileStream.Read(ByteNum) | ||
newhex = "" | |||
data_table_offset_hex = SimpleBinaryToString(BArr0) | |||
for i = ubound(data_table_offset_hex) - 1 to 0 step -1 | |||
h = hex(Asc(data_table_offset_hex(i))) | |||
if len(h) = 1 then | |||
h = "0" & h | |||
end if | |||
newhex = newhex & h | |||
next | |||
logmessage newhex | |||
logmessage "data table offset: " & cLng("&H" & newhex) | |||
data_table_offset_int = cLng("&H" & newhex) | |||
newhex = "" | |||
AGQG_offset_hex = SimpleBinaryToString(BArr1) | |||
for i = ubound(AGQG_offset_hex) - 1 to 0 step -1 | |||
h = hex(Asc(AGQG_offset_hex(i))) | |||
if len(h) = 1 then | |||
h = "0" & h | |||
end if | |||
newhex = newhex & h | |||
next | |||
logmessage newhex | |||
logmessage "AGQG table offset: " & cLng("&H" & newhex) | |||
AGQG_offset_int = cLng("&H" & newhex) | |||
newhex = "" | |||
AGQG_size_hex = SimpleBinaryToString(BArr2) | |||
for i = ubound(AGQG_size_hex) - 1 to 0 step -1 | |||
h = hex(Asc(AGQG_size_hex(i))) | |||
if len(h) = 1 then | |||
h = "0" & h | |||
end if | |||
newhex = newhex & h | |||
next | |||
logmessage newhex | |||
logmessage "AGQG table size: " & cLng("&H" & newhex) | |||
AGQG_size_int = cLng("&H" & newhex) | |||
logmessage "------------------------------" | |||
AGQG_start = data_table_offset_int + AGQG_offset_int - 8 | |||
AGQG_end = data_table_offset_int + AGQG_offset_int + AGQG_size_int - 8 | |||
logmessage "AGQG_start: " & AGQG_start | |||
' AGQG array size | |||
ByteNum = 4 | |||
OniInputFileStream.Position = AGQG_start + 28 | |||
BArr3 = OniInputFileStream.Read(ByteNum) | |||
TContent = SimpleBinaryToString(BArr3) | |||
logmessage "------------------------------" | |||
newhex = 0 | |||
for i = ubound(TContent) to 0 step -1 | |||
h = hex(Asc(TContent(i))) | |||
if len(h) = 1 then | |||
h = "0" & h | |||
end if | |||
newhex = newhex & h | |||
next | |||
AGQG_array_size = clng("&H" & newhex) | |||
logmessage "AGQG array size: " & clng("&H" & newhex) | |||
' reduce number by header space | |||
ByteNum = AGQG_size_int - 31 | |||
' skip bytes used by header | |||
OniInputFileStream.Position = AGQG_start + 32 | |||
BArr4 = OniInputFileStream.Read(ByteNum) | |||
TContent2 = SimpleBinaryToString(BArr4) | |||
c = -1 | |||
loop_count = 1 | |||
h = "" | |||
newhex = "" | |||
color = 0 | |||
logmessage "----------" | |||
logmessage "element: 1" | |||
for i = 0 to ubound(TContent2) - 1 | |||
c = c + 1 | |||
if c = 56 then | |||
c = 0 | |||
loop_count = loop_count + 1 | |||
logmessage "----------" | |||
logmessage "element: " & loop_count | |||
end if | |||
h = hex(Asc(TContent2(i))) | |||
if len(h) = 1 then | |||
h = "0" & h | |||
end if | |||
newhex = newhex & h | |||
if i mod 56 = 32 then | |||
color = 1 | |||
end if | |||
if i mod 56 = 48 then | |||
color = 0 | |||
end if | |||
if i mod 56 = 52 then | |||
objid = 1 | |||
end if | |||
if i mod 56 = 0 then | |||
objid = 0 | |||
end if | |||
if len(newhex) = 8 then | |||
if color = 1 then | |||
logmessage newhex & " (color: " & clng(("&H" & left(newhex, 2))) _ | |||
& " " & clng("&H" & mid(newhex, 3, 2)) _ | |||
& " " & clng("&H" & mid(newhex, 5, 2)) _ | |||
& " " & clng("&H" & mid(newhex, 7, 2)) & ")" | |||
elseif objid = 1 then | |||
if newhex = "FFFFFFFF" then | |||
logmessage newhex & " (object id: -1)" | |||
else | |||
logmessage newhex | |||
end if | |||
else | |||
logmessage newhex | |||
end if | |||
newhex = "" | |||
end if | |||
next | |||
end sub | |||
Function SimpleBinaryToString(Binary) | |||
ReDim tmpArr(LenB(Binary) - 1) | |||
For I = 1 To LenB(Binary) | |||
S = Chr(AscB(MidB(Binary, I, 1))) | |||
tmpArr(I - 1) = S | |||
'logmessage "hex = " & hex(AscB(S)) | |||
Next | |||
SimpleBinaryToString = tmpArr | |||
End Function | |||
==Modify file== | |||
===Binary=== | |||
[[Image:Before_and_after_binary_patching_with_vbs.png|thumb|400px|Before and after patching.]] | |||
Change FilePath and in case of binary patching use function "StringToByteArray". | |||
FilePath = "C:\path_to\AKEVEnvWarehouse.oni" | |||
' ### create stream objects | |||
Set InputStream = CreateObject("ADODB.Stream") | |||
InputStream.Type = 1 | |||
InputStream.Open | |||
Set OutputStream = CreateObject("ADODB.Stream") | |||
OutputStream.Type = 1 | |||
OutputStream.Open | |||
' ### load input stream from file | |||
InputStream.LoadFromFile FilePath | |||
' ### copy first 16 signs of input stream to output stream | |||
OutputStream.Write InputStream.Read(16) | |||
' ### apply patch | |||
' # ASCII patching | |||
patch_data = "ABCD" | |||
patch_data_length = len(patch_data) | |||
' patch_data_length = 4 | |||
InputStream.Position = InputStream.Position + patch_data_length | |||
OutputStream.Write CreateObject("System.Text.ASCIIEncoding").GetBytes_4(patch_data) | |||
' # binary patching | ' # binary patching | ||
'OutputStream.Write StringToByteArray("41424344") | 'OutputStream.Write StringToByteArray("41424344") | ||
| Line 885: | Line 1,052: | ||
===Byte array -> string=== | ===Byte array -> string=== | ||
Function ByteArrayToString(Binary) | Function ByteArrayToString(Binary) | ||
'Antonin Foller, | 'Antonin Foller, https://www.motobit.com/ | ||
'Optimized version of a simple BinaryToString algorithm. | 'Optimized version of a simple BinaryToString algorithm. | ||
| Line 1,151: | Line 1,318: | ||
===Materials and textures=== | |||
====Get all targets of an image clip==== | |||
set imgClip = GetValue("Clips._marker_blackness_tga") | set imgClip = GetValue("Clips._marker_blackness_tga") | ||
set imgClipTargets = imgClip.GetShaderParameterTargets | set imgClipTargets = imgClip.GetShaderParameterTargets | ||
| Line 1,162: | Line 1,329: | ||
====Get all material libraries and materials==== | |||
for each ml in Application.ActiveProject.ActiveScene.MaterialLibraries | for each ml in Application.ActiveProject.ActiveScene.MaterialLibraries | ||
logmessage ml | logmessage ml | ||
| Line 1,188: | Line 1,355: | ||
====Check an object's main material for TwoSided-ness==== | |||
' test and toggles an object's main material for TwoSided-ness | ' test and toggles an object's main material for TwoSided-ness | ||
' this is also a prerequired test for transparency | ' this is also a prerequired test for transparency | ||
| Line 1,276: | Line 1,443: | ||
====Bounding box values==== | ====Bounding box values==== | ||
' this could be useful to create a bounding box for [[ | ' this could be useful to create a bounding box for [[XML:OFGA|OFGA files]] | ||
' let's get the bounding box of a simple cylinder | ' let's get the bounding box of a simple cylinder | ||
| Line 1,569: | Line 1,736: | ||
==Softimage ICE== | ==Softimage ICE== | ||
===Show a simple value in the viewport=== | ===Show a simple value in the viewport=== | ||
[[Image:XSI_ModTool_ICE_workaround_displaying_a_flag.png|thumb|400px]] | |||
CreatePrim "Cube", "MeshSurface" | CreatePrim "Cube", "MeshSurface" | ||