/** Load the KFB data for the selected animation, will return null if the animation does not exist in the KFB */ private byte[] getKFBData(int animToUse) { if (kfb == null) { return(null); } if (kfbfile == null) { if (this.adb.filenameExists(this.kfb)) { kfbfile = NIFLoader.getNIF(this.kfb); } else { return(null); } //Debug.Log("getting KFB: " + this.kfb); } /** Choose the right animation to load from the KFB file. Ideally we should use the KFM to know what index to use */ for (int i = 0; i < kfbfile.numObjects; i += 4) { NiIntegerExtraData indexData = (NiIntegerExtraData)kfbfile.getObject(i); NiIntegerExtraData sizeData = (NiIntegerExtraData)kfbfile.getObject(i + 1); NiBinaryExtraData binData = (NiBinaryExtraData)kfbfile.getObject(i + 2); NiBinaryExtraData binData2 = (NiBinaryExtraData)kfbfile.getObject(i + 3); int animIdx = indexData.intExtraData; if (animIdx == animToUse) { return(binData.getData()); } } //Debug.LogError("[" + this.kfb + "] can't find data for anim[" + animToUse + "]"); return(null); }
// Use this for initialization void Start() { AssetDatabase db = AssetDatabaseInst.DB; KFMFile kfm = new KFMFile(new FileStream(@"C:\Users\Spikeles\Documents\NetBeansProjects\TelaraDBExplorer\TelaraDBEditorCore\human_female_medium.kfm", FileMode.Open, FileAccess.Read, FileShare.Read)); NIFFile kfbfile = new NIFFile(new FileStream(@"C:\Users\Spikeles\Documents\NetBeansProjects\TelaraDBExplorer\TelaraDBEditorCore\human_female_2h_shared.kfb", FileMode.Open, FileAccess.Read, FileShare.Read)); // 230, string -> index 2 List <KFAnimation> anims = kfm.kfanimations; int maxAnimID = 0; foreach (KFAnimation anim in anims) { maxAnimID = Mathf.Max(anim.id, maxAnimID); //Debug.Log(anim.id + ":" + anim.sequenceFilename + ":" + anim.sequencename); } Debug.Log("maxAnimID:" + maxAnimID); for (int i = 0; i < kfbfile.numObjects; i += 4) { NiIntegerExtraData indexData = (NiIntegerExtraData)kfbfile.getObject(i); NiIntegerExtraData sizeData = (NiIntegerExtraData)kfbfile.getObject(i + 1); NiBinaryExtraData binData = (NiBinaryExtraData)kfbfile.getObject(i + 2); NiBinaryExtraData binData2 = (NiBinaryExtraData)kfbfile.getObject(i + 3); KFAnimation anim = anims.DefaultIfEmpty(null).FirstOrDefault(a => a.id == indexData.intExtraData); if (anim != null) { Debug.Log("kfb[" + indexData.intExtraData + "] match => [" + anim.id + "]" + anim.sequenceFilename); } else { Debug.Log("kfb[" + indexData.intExtraData + "] nomatch"); } } Debug.Log("kfb objs:" + kfbfile.numObjects / 4); Debug.Log("anims:" + anims.Count); //File.WriteAllBytes("human_female.kfb" + i + "_0", binData.getData()); //File.WriteAllBytes("human_female.kfb" + i + "_1", binData2.getData()); }
static private String[] getTextureIds(NIFFile nf, NiMesh mesh) { String[] textureType; NiTexturingProperty texturingProperty = mesh.getTexturingProperty(nf); if (texturingProperty != null) { //Debug.Log("found texturing property for mesh " + mesh.name); textureType = new String[texturingProperty.shaderMapList.Count]; foreach (int extraID in mesh.extraDataIDs) { NIFObject ni = nf.getObject(extraID); if (ni is NiIntegerExtraData) { NiIntegerExtraData nied = (NiIntegerExtraData)ni; if (nied.extraDataString != null) { if (nied.extraDataString.Contains("Texture")) { if (nied.intExtraData >= 0 && nied.intExtraData < textureType.Length) { textureType[nied.intExtraData] = nied.extraDataString; } else { // Debug.LogWarning("nied.intExtraData out of range:" + nied.intExtraData + " => " + textureType.Length); } } } } } } else { textureType = new String[255]; } return(textureType); }