using System; using UnityEngine; [Serializable] public class MegaCacheImageFrame { public int vc; public int nc; public int tc; public int uvc; public Vector3 bmin; public Vector3 uvmin; public Vector3 bsize; public Vector3 uvsize; public byte[] verts; public byte[] norms; public byte[] tangents; public byte[] uvs; public byte[] tris; public int subcount; public int[] suboffs; public int[] sublen; public MegaCacheImageFace[] subs; public void LoadSection(MegaCacheOBJ cache) { float num = 1f / 127f; for (int i = 0; i < vc; i++) { int num2 = i * 6; cache.vertcache[i].x = bmin.x + (float)(int)BitConverter.ToUInt16(verts, num2) * bsize.x; cache.vertcache[i].y = bmin.y + (float)(int)BitConverter.ToUInt16(verts, num2 + 2) * bsize.y; cache.vertcache[i].z = bmin.z + (float)(int)BitConverter.ToUInt16(verts, num2 + 4) * bsize.z; } for (int j = 0; j < nc; j++) { int num3 = j * 3; cache.normcache[j].x = ((float)(int)norms[num3] - 127f) * num; cache.normcache[j].y = ((float)(int)norms[num3 + 1] - 127f) * num; cache.normcache[j].z = ((float)(int)norms[num3 + 2] - 127f) * num; } for (int k = 0; k < tc; k++) { int num4 = k * 4; cache.tangentcache[k].x = ((float)(int)tangents[num4] - 127f) * num; cache.tangentcache[k].y = ((float)(int)tangents[num4 + 1] - 127f) * num; cache.tangentcache[k].z = ((float)(int)tangents[num4 + 2] - 127f) * num; cache.tangentcache[k].w = ((float)(int)tangents[num4 + 3] - 127f) * num; } for (int l = 0; l < uvc; l++) { int num5 = l * 2; cache.uvcache[l].x = uvmin.x + (float)(int)uvs[num5] * uvsize.x; cache.uvcache[l].y = uvmin.y + (float)(int)uvs[num5 + 1] * uvsize.y; } for (int m = 0; m < subcount; m++) { int num6 = suboffs[m]; for (int n = 0; n < sublen[m]; n++) { cache.subs[m].tris[n] = BitConverter.ToUInt16(tris, num6 + n * 2); } for (int num7 = sublen[m]; num7 < cache.subs[m].max; num7++) { cache.subs[m].tris[num7] = cache.subs[m].tris[sublen[m]]; } } } public void SetMesh(Mesh mesh, MegaCacheOBJ cache) { mesh.subMeshCount = subcount; mesh.vertices = cache.vertcache; if (nc > 0) { mesh.normals = cache.normcache; } if (uvc > 0) { mesh.uv = cache.uvcache; } if (tc > 0) { mesh.tangents = cache.tangentcache; } for (int i = 0; i < subcount; i++) { mesh.SetTriangles(cache.subs[i].tris, i); } mesh.RecalculateBounds(); } public void GetMesh(Mesh mesh, MegaCacheOBJ cache) { float num = 1f / 127f; cache.framevertcount = vc; for (int i = 0; i < vc; i++) { int num2 = i * 6; cache.vertcache[i].x = bmin.x + (float)(int)BitConverter.ToUInt16(verts, num2) * bsize.x; cache.vertcache[i].y = bmin.y + (float)(int)BitConverter.ToUInt16(verts, num2 + 2) * bsize.y; cache.vertcache[i].z = bmin.z + (float)(int)BitConverter.ToUInt16(verts, num2 + 4) * bsize.z; } for (int j = 0; j < nc; j++) { int num3 = j * 3; cache.normcache[j].x = ((float)(int)norms[num3] - 127f) * num; cache.normcache[j].y = ((float)(int)norms[num3 + 1] - 127f) * num; cache.normcache[j].z = ((float)(int)norms[num3 + 2] - 127f) * num; } for (int k = 0; k < tc; k++) { int num4 = k * 4; cache.tangentcache[k].x = ((float)(int)tangents[num4] - 127f) * num; cache.tangentcache[k].y = ((float)(int)tangents[num4 + 1] - 127f) * num; cache.tangentcache[k].z = ((float)(int)tangents[num4 + 2] - 127f) * num; cache.tangentcache[k].w = ((float)(int)tangents[num4 + 3] - 127f) * num; } for (int l = 0; l < uvc; l++) { int num5 = l * 2; cache.uvcache[l].x = uvmin.x + (float)(int)uvs[num5] * uvsize.x; cache.uvcache[l].y = uvmin.y + (float)(int)uvs[num5 + 1] * uvsize.y; } mesh.subMeshCount = subcount; mesh.vertices = cache.vertcache; if (nc > 0) { mesh.normals = cache.normcache; } if (uvc > 0) { mesh.uv = cache.uvcache; } if (tc > 0) { mesh.tangents = cache.tangentcache; } for (int m = 0; m < subcount; m++) { int num6 = suboffs[m]; for (int n = 0; n < sublen[m]; n++) { cache.subs[m].tris[n] = BitConverter.ToUInt16(tris, num6 + n * 2); } for (int num7 = sublen[m]; num7 < cache.subs[m].max; num7++) { cache.subs[m].tris[num7] = cache.subs[m].tris[sublen[m]]; } } for (int num8 = 0; num8 < subcount; num8++) { mesh.SetTriangles(cache.subs[num8].tris, num8); } mesh.RecalculateBounds(); } }