Added python interface for texture functions

This commit is contained in:
_ 2018-04-22 06:02:32 -07:00
parent 71f6517a94
commit d71a89b840

View File

@ -1,6 +1,10 @@
#!/usr/bin/python3 #!/usr/bin/python3
import ctypes import ctypes
#--------------------------------------+
# Devil 1: PLD
#--------------------------------------+
class PldHeader(ctypes.Structure): class PldHeader(ctypes.Structure):
_fields_ = [ _fields_ = [
("numOffset", ctypes.c_int), ("numOffset", ctypes.c_int),
@ -9,26 +13,112 @@ class PldHeader(ctypes.Structure):
class Devil1PLD_FN(ctypes.Structure): class Devil1PLD_FN(ctypes.Structure):
_fields_ = [ _fields_ = [
("getheader" , ctypes.CFUNCTYPE(bool, ctypes.POINTER(PldHeader), ctypes.c_char_p)), ("getheader" , ctypes.CFUNCTYPE(
("sizeofsector", ctypes.CFUNCTYPE(int, ctypes.POINTER(PldHeader), ctypes.c_int)), ctypes.c_bool,
("printheader" , ctypes.CFUNCTYPE(None, ctypes.POINTER(PldHeader))) ctypes.POINTER(PldHeader),
ctypes.c_char_p)),
("sizeofsector", ctypes.CFUNCTYPE(
ctypes.c_int,
ctypes.POINTER(PldHeader),
ctypes.c_int)),
("printheader" , ctypes.CFUNCTYPE(None,
ctypes.POINTER(PldHeader)))
] ]
#--------------------------------------+
# Devil 1: TEX
#--------------------------------------+
class TexturePack(ctypes.Structure):
_fields_ = [
("id", ctypes.c_char * 4), # fixed length 4, reverse order
("batchNumber", ctypes.c_int),
("firstBatchOffset", ctypes.c_int),
("unknownA", ctypes.c_int)
]
class TextureBatchDescriptor(ctypes.Structure):
_fields_ = [
("batchIdx", ctypes.c_int),
("hash", ctypes.c_int),
("texNumber", ctypes.c_int),
("unknownA", ctypes.c_int * 8),
("textureSize", ctypes.c_int),
("unknownB", ctypes.c_int * 30)
]
class Texture(ctypes.Structure):
_fields_ = [
("data", ctypes.c_ubyte)
]
class TextureBatch(ctypes.Structure):
_fields_ = [
("batch", ctypes.POINTER(Texture))
]
class Devil1TEX_FN(ctypes.Structure):
_fields_ = [
("printheader", ctypes.CFUNCTYPE(
None,
ctypes.POINTER(TexturePack))),
("printbatchdesc", ctypes.CFUNCTYPE(
None,
ctypes.POINTER(TextureBatchDescriptor))),
("getbatchdesc", ctypes.CFUNCTYPE(
ctypes.c_bool,
ctypes.POINTER(TextureBatchDescriptor),
ctypes.c_uint,
ctypes.c_char_p,
ctypes.c_uint)),
("getbatch", ctypes.CFUNCTYPE(
ctypes.c_bool,
ctypes.POINTER(TextureBatch),
ctypes.c_uint,
ctypes.c_char_p,
ctypes.c_uint)),
("gettexture", ctypes.CFUNCTYPE(
ctypes.c_bool,
ctypes.POINTER(Texture),
ctypes.c_uint,
ctypes.c_char_p,
ctypes.c_uint))
]
#--------------------------------------+
# Devil 1: GEO
#--------------------------------------+
#--------------------------------------+
# Regular Python
#--------------------------------------+
def pldtest(devil1pld, pldheader):
with open("pl01.pld", "rb") as f:
data = f.read()
devil1pld.getheader(ctypes.byref(pldheader), data)
devil1pld.printheader(ctypes.byref(pldheader))
def textest(devil1tex, texheader):
with open("pl01.pld_1.txp", "rb") as f:
data = f.read()
texheader = ctypes.cast(data, ctypes.POINTER(TexturePack))
devil1tex.printheader(texheader)
def main(): def main():
sharedlib='./lib3ddevil1.so' sharedlib='./lib3ddevil1.so'
libc = ctypes.cdll.LoadLibrary(sharedlib) libc = ctypes.cdll.LoadLibrary(sharedlib)
if (not libc): if (not libc):
print("Couldn't load %s" % sharedlib) print("Couldn't load %s" % sharedlib)
return 1 return 1
print("OK") print("OK")
fn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD") pldfn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD")
pldh = PldHeader() pldh = PldHeader()
with open("pl01.pld", "rb") as f: pldtest(pldfn, pldh)
data = f.read()
p = PldHeader() texfn = Devil1TEX_FN.in_dll(libc, "DEVIL1TEX")
fn.getheader(ctypes.byref(pldh), data) texh = TexturePack()
fn.printheader(ctypes.byref(pldh)) textest(texfn, texh)
#---------------------------------------+ #---------------------------------------+