mirror of
https://notabug.org/scuti/lib3ddevil1
synced 2024-11-22 13:53:02 +05:30
Added python interface for texture functions
This commit is contained in:
parent
71f6517a94
commit
d71a89b840
@ -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)
|
||||||
|
|
||||||
#---------------------------------------+
|
#---------------------------------------+
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user