174 lines
4.3 KiB
C#
174 lines
4.3 KiB
C#
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();
|
|
}
|
|
}
|