'''Noesis import plugin. Copyright HimeWorks''' from inc_noesis import * import noesis import rapi import operator from functools import reduce def registerNoesisTypes(): '''Register the plugin. Just change the Game name and extension.''' handle = noesis.register("Magicka: Wizard Wars", ".unit") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) return 1 def noepyCheckType(data): '''Verify that the format is supported by this plugin. Default yes''' bs = NoeBitStream(data) id = bs.readUInt() return id == 2253847681 def noepyLoadModel(data, mdlList): '''Build the model, set materials, bones, and animations. You do not need all of them as long as they are empty lists (they are by default)''' ctx = rapi.rpgCreateContext() parser = SanaeParser(data) parser.parse_file() mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList)) mdl.setBones(parser.boneList) mdl.setAnims(parser.animList) mdlList.append(mdl) return 1 class Mesh(object): def __init__(self): self.name = "" self.idxStart = 0 self.vertStart = 0 self.numIdx = 0 self.numVerts = 0 self.vertSize = 0 self.idxBuff = bytes() self.vertBuff = bytes() class SanaeParser(object): def __init__(self, data): '''Initialize some data. Refer to Sanae.py to see what is already initialized''' self.version = 0 self.meshType = 0 self.inFile = NoeBitStream(data) self.animList = [] self.texList = [] self.matList = [] self.boneList = [] self.meshList = [] def build_meshes(self): pass def read_name(self): string = self.inFile.readBytes(self.inFile.readInt()) return noeStrFromBytes(string) def parse_faces(self): pass def parse_materials(self): count = self.inFile.readInt() # which vertices for i in range(count): self.inFile.read("4L") self.inFile.read("7f") count = self.inFile.readInt() for i in range(count): name = self.read_name() print(name) def parse_mesh(self, numMesh): for i in range(numMesh): size = self.inFile.readInt() vertBuff = self.inFile.readBytes(size) self.inFile.readInt() self.inFile.readInt() numVerts = self.inFile.readInt() vertSize = self.inFile.readInt() count = self.inFile.readInt() self.inFile.readBytes(count * 17) self.inFile.read('3L') numIdx = self.inFile.readInt() size = self.inFile.readInt() idxBuff = self.inFile.readBytes(size) self.parse_materials() if vertSize == 56: rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 0) # rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 12) # rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 48) elif vertSize == 72: rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 16) # rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 24) # rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 48) elif vertSize == 88: rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 0) rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 24) rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, vertSize, 48) else: print("Unknown vert size: ", vertSize) rapi.rpgSetMaterial("Grimnir") rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_USHORT, numIdx, noesis.RPGEO_TRIANGLE, 1) def parse_file(self): self.inFile.readInt() numMesh = self.inFile.readInt() self.parse_mesh(numMesh) self.inFile.readInt() count = self.inFile.readInt() self.inFile.readBytes(count * 64)