Code: Select all
from inc_noesis import *
def registerNoesisTypes():
handle = noesis.register("Leisure Suit Larry", ".WGG")
noesis.setHandlerTypeCheck(handle, noepyCheckType)
noesis.setHandlerLoadModel(handle, noepyLoadModel)
noesis.logPopup()
return 1
def noepyCheckType(data):
if len(data) < 8:
return 0
j = NoeBitStream(data)
if j.readUInt() != 0x49535648:
return 0
return 1
def noepyLoadModel(data, mdlList):
f = NoeBitStream(data)
#start positions
VertexStart = []
f.seek(0x24, NOESEEK_ABS)
TableStart = f.readUInt()
NumberOfChunks = f.readUInt()
StartChunkPos = f.readUInt() + 0x58
f.seek(0x4, NOESEEK_REL)
FacesStart = f.readUInt() + 0x8
StartPosition = 0x58
for i in range(0, NumberOfChunks):
f.seek(StartChunkPos + 0x4, NOESEEK_ABS)
vertCount = f.readUInt()
f.seek(0x30, NOESEEK_REL)
vertSize = f.readUInt()
VertexStart.append(Chunk(vertSize, f.tell()))
StartChunkPos = f.tell() + vertCount * vertSize
print(len(VertexStart))
#objects
f.seek(StartPosition + TableStart + 0x8, NOESEEK_ABS)
ObjectsCount = f.readUInt()
f.seek(StartPosition, NOESEEK_ABS)
Objects = []
for i in range(0, ObjectsCount):
Objects.append(f.readBytes(8).decode("ASCII").rstrip("\0"))
f.seek(0x8, NOESEEK_REL)
#table
f.seek(StartPosition + TableStart, NOESEEK_ABS)
NumberOfEntries = f.readUInt()
f.seek(0x14, NOESEEK_REL)
StartEntries = f.tell()
Entries = []
for i in range(0, NumberOfEntries):
chunk = f.readUShort()
f.seek(0xA, NOESEEK_REL)
nVert = f.readUShort()
f.seek(0x2, NOESEEK_REL)
nFac = f.readUShort()
f.seek(0x2, NOESEEK_REL)
fac = f.readUShort()
f.seek(0x4, NOESEEK_REL)
vert = f.readUShort()
f.seek(0x2, NOESEEK_REL)
index = f.readUShort()
f.seek(0x8, NOESEEK_REL)
Entries.append(Entry(chunk, vert, fac, nVert, nFac, index))
print(len(Entries))
#objects
Meshes = []
FinalObjects = 0
vertex = []
faces = []
normals = []
uv = []
for i in range(0, len(Entries)):
LastVert = len(vertex)
#Vertices
pos = VertexStart[Entries[i].nChunk].startPosition + Entries[i].nVertex * VertexStart[Entries[i].nChunk].entrySize
f.seek(pos, NOESEEK_ABS)
if VertexStart[Entries[i].nChunk].entrySize == 40:
for e in range (0, Entries[i].vertexCount):
vertex.append (NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
f.seek(0x8, NOESEEK_REL)
normals.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
uv.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
f.seek(-0x4, NOESEEK_REL)
elif VertexStart[Entries[i].nChunk].entrySize == 36:
for e in range (0, Entries[i].vertexCount):
vertex.append (NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
f.seek(0x4, NOESEEK_REL)
normals.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
uv.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
f.seek(-0x4, NOESEEK_REL)
elif VertexStart[Entries[i].nChunk].entrySize == 32:
for e in range (0, Entries[i].vertexCount):
vertex.append (NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
normals.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
uv.append(NoeVec3((f.readFloat(), f.readFloat(), f.readFloat())))
f.seek(-0x4, NOESEEK_REL)
#Faces
pos = FacesStart + StartPosition + Entries[i].nFaces * 2
f.seek(pos, NOESEEK_ABS)
for e in range (0, Entries[i].facesCount):
faces.append(f.readUShort() + LastVert)
#setup1
if (FinalObjects < Entries[i].objIndex):
Meshes.append(NoeMesh (faces, vertex, str(i), str(i)))
Meshes[FinalObjects].normals.append(normals)
Meshes[FinalObjects].uvs.append(uv)
print("------Object" + str(i) + "------")
print("vertex count = " + str(len(vertex)))
print ("face index count = " + str(len(faces)))
print("normals count = " + str(len(normals)))
print("uv's count = " + str(len(uv)))
faces = []
vertex = []
normals = []
uv = []
FinalObjects = FinalObjects + 1
#setup2
#print(len(normals))
#print(len(vertex))
#Meshes.append(NoeMesh (faces, vertex, "Hola" + str(i), ""))
#Meshes[i].normals.append(normals)
#normals = []
#vertex = []
#faces = []
#uv = []
mdlList.append(NoeModel(Meshes, [], []))
return 1
class Entry:
nChunk = 0
vertexCount = 0
facesCount = 0
nVertex = 0
nFaces = 0
objIndex = 0
def __init__(self, chunk, vert, fac, nVert, nFac, index):
self.nChunk = chunk
self.vertexCount = vert
self.facesCount = fac
self.nVertex = nVert
self.nFaces = nFac
self.objIndex = index
class Chunk:
startPosition = 0
entrySize = 0
def __init__(self, size, start):
self.entrySize = size
self.startPosition = start
This is a post i made because i did not know how was the information stored in the file, there is a link to the file for if you want to have it: