mirror of
https://notabug.org/scuti/lib3ddevil1
synced 2024-11-29 10:12:02 +05:30
Added interface for geometry functions
This commit is contained in:
parent
d71a89b840
commit
c1bb8c457f
@ -89,38 +89,156 @@ class Devil1TEX_FN(ctypes.Structure):
|
||||
# Devil 1: GEO
|
||||
#--------------------------------------+
|
||||
|
||||
class Header(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("numMesh", ctypes.c_ubyte),
|
||||
("unknownNumberB", ctypes.c_ubyte),
|
||||
("unknownNumberC", ctypes.c_ubyte),
|
||||
("unknownNumberD", ctypes.c_ubyte),
|
||||
("padding", ctypes.c_int),
|
||||
("unknownOffset", ctypes.c_ulonglong)
|
||||
]
|
||||
|
||||
class MeshHeader(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("numBatch", ctypes.c_short),
|
||||
("numVertex", ctypes.c_short),
|
||||
("u", ctypes.c_uint),
|
||||
("offsetBatches", ctypes.c_ulonglong),
|
||||
("flags", ctypes.c_ulonglong)
|
||||
]
|
||||
|
||||
class Coordinate(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("x", ctypes.c_float),
|
||||
("y", ctypes.c_float),
|
||||
("z", ctypes.c_float)
|
||||
]
|
||||
|
||||
class UVs(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("u", ctypes.c_short),
|
||||
("v", ctypes.c_short)
|
||||
]
|
||||
|
||||
class BoneIndexes(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("indexes", ctypes.c_ubyte * 4),
|
||||
]
|
||||
|
||||
class BoneWeights(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("weights", ctypes.c_short)
|
||||
]
|
||||
|
||||
|
||||
class BatchData(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("numVertex", ctypes.c_short),
|
||||
("uB", ctypes.c_short),
|
||||
("padding", ctypes.c_uint),
|
||||
("offsetPositions", ctypes.c_ulonglong),
|
||||
("offsetNormals", ctypes.c_ulonglong),
|
||||
("offsetUVs", ctypes.c_ulonglong),
|
||||
("offsetBoneIndexes", ctypes.c_ulonglong),
|
||||
("offsetBoneWeights", ctypes.c_ulonglong),
|
||||
("offsets", ctypes.c_ulonglong)
|
||||
]
|
||||
|
||||
class VertexData(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("positions", ctypes.POINTER(Coordinate)),
|
||||
("normals", ctypes.POINTER(Coordinate)),
|
||||
("u", ctypes.POINTER(UVs)),
|
||||
("bi", ctypes.POINTER(BoneIndexes)),
|
||||
("bw", ctypes.POINTER(BoneWeights))
|
||||
]
|
||||
|
||||
class Batch(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("bd", ctypes.POINTER(BatchData)),
|
||||
("vd", VertexData)
|
||||
]
|
||||
|
||||
class Mesh(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("b", ctypes.POINTER(Batch))
|
||||
]
|
||||
|
||||
class Devil1GEO_FN(ctypes.Structure):
|
||||
_fields_ = [
|
||||
("printheader", ctypes.CFUNCTYPE(
|
||||
None,
|
||||
ctypes.POINTER(Header))),
|
||||
("printmeshheader", ctypes.CFUNCTYPE(
|
||||
None,
|
||||
ctypes.POINTER(MeshHeader))),
|
||||
("printbatch", ctypes.CFUNCTYPE(
|
||||
None,
|
||||
ctypes.POINTER(Batch))),
|
||||
("printcoordinate", ctypes.CFUNCTYPE(
|
||||
None,
|
||||
ctypes.POINTER(Coordinate))),
|
||||
("getmeshheader", ctypes.CFUNCTYPE(
|
||||
ctypes.c_bool,
|
||||
ctypes.POINTER(MeshHeader),
|
||||
ctypes.c_uint,
|
||||
ctypes.c_char_p)),
|
||||
("getbatch", ctypes.CFUNCTYPE(
|
||||
ctypes.c_bool,
|
||||
ctypes.POINTER(Batch),
|
||||
ctypes.c_uint,
|
||||
ctypes.c_char_p)),
|
||||
("getmesh", ctypes.CFUNCTYPE(
|
||||
ctypes.c_bool,
|
||||
ctypes.POINTER(Mesh),
|
||||
ctypes.c_uint,
|
||||
ctypes.c_char_p,
|
||||
ctypes.c_uint))
|
||||
]
|
||||
|
||||
#--------------------------------------+
|
||||
# Regular Python
|
||||
#--------------------------------------+
|
||||
if __name__ == "__main__":
|
||||
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 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 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 geotest(devil1geo, geoheader):
|
||||
with open("pl00.pld_0", "rb") as f:
|
||||
data = f.read()
|
||||
geoheader = ctypes.cast(data, ctypes.POINTER(Header))
|
||||
devil1geo.printheader(geoheader)
|
||||
|
||||
def main():
|
||||
sharedlib='./lib3ddevil1.so'
|
||||
libc = ctypes.cdll.LoadLibrary(sharedlib)
|
||||
if (not libc):
|
||||
print("Couldn't load %s" % sharedlib)
|
||||
return 1
|
||||
print("OK")
|
||||
pldfn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD")
|
||||
pldh = PldHeader()
|
||||
pldtest(pldfn, pldh)
|
||||
def main():
|
||||
sharedlib='./lib3ddevil1.so'
|
||||
libc = ctypes.cdll.LoadLibrary(sharedlib)
|
||||
if (not libc):
|
||||
print("Couldn't load %s" % sharedlib)
|
||||
return 1
|
||||
print("OK")
|
||||
|
||||
texfn = Devil1TEX_FN.in_dll(libc, "DEVIL1TEX")
|
||||
texh = TexturePack()
|
||||
textest(texfn, texh)
|
||||
pldfn = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD")
|
||||
pldh = PldHeader()
|
||||
pldtest(pldfn, pldh)
|
||||
|
||||
texfn = Devil1TEX_FN.in_dll(libc, "DEVIL1TEX")
|
||||
texh = TexturePack()
|
||||
textest(texfn, texh)
|
||||
|
||||
geofn = Devil1GEO_FN.in_dll(libc, "DEVIL1GEO")
|
||||
geoh = Header()
|
||||
geotest(geofn, geoh)
|
||||
|
||||
#---------------------------------------+
|
||||
|
||||
main()
|
||||
main()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user