123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #region License information
- // ----------------------------------------------------------------------------
- //
- // libeq2 - A library for analyzing the Everquest II File Format
- // Blaz (blaz@blazlabs.com)
- //
- // This program is free software; you can redistribute it and/or
- // modify it under the terms of the GNU General Public License
- // as published by the Free Software Foundation; either version 2
- // of the License, or (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with this program; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- //
- // ( The full text of the license can be found in the License.txt file )
- //
- // ----------------------------------------------------------------------------
- #endregion
- #region Using directives
- using System;
- using System.Diagnostics;
- using System.IO;
- using Everquest2.Util;
- #endregion
- namespace Everquest2.Visualization
- {
- public class VeRenderMesh : VeBase
- {
- public enum PrimitiveType : uint
- {
- Triangles = 2
- }
- public struct SubMesh
- {
- public PrimitiveType PrimType;
- public int StartingVertex;
- public int VertexCount;
- public int StartingIndex;
- public int PrimitiveCount;
- }
- public struct TexCoord
- {
- public float U;
- public float V;
- }
- public struct Vertex
- {
- public float X;
- public float Y;
- public float Z;
- }
- public VeRenderMesh()
- {
- }
- /// <summary>
- /// Special constructor used when deserializing the instance of the class.
- /// </summary>
- /// <param name="reader">Reader used to read the instance data.</param>
- protected VeRenderMesh(Util.Eq2Reader reader, Util.StreamingContext context) : base(reader, context)
- {
- byte classVersion = context.ClassVersions[typeof(VeRenderMesh)];
- Debug.Assert(classVersion >= 11 && classVersion <= 15, "VeRenderMesh version " + classVersion + " not supported");
- flags = reader.ReadUInt32();
- uint vertexCount = reader.ReadUInt32();
- vertices = new Vertex[vertexCount];
- for (uint i = 0; i < vertexCount; ++i)
- {
- vertices[i].X = reader.ReadSingle();
- vertices[i].Y = reader.ReadSingle();
- vertices[i].Z = reader.ReadSingle();
- }
- uint normalCount = reader.ReadUInt32();
- normals = new Vertex[normalCount];
- for (uint i = 0; i < normalCount; ++i)
- {
- normals[i].X = reader.ReadSingle();
- normals[i].Y = reader.ReadSingle();
- normals[i].Z = reader.ReadSingle();
- }
- uint texCoordSetCount = (uint)(classVersion >= 15 ? 5 : 8);
- texCoords = new TexCoord[texCoordSetCount][];
- for (uint i = 0; i < texCoordSetCount; ++i)
- {
- uint texCoordCount = reader.ReadUInt32();
- texCoords[i] = new TexCoord[texCoordCount];
- for (uint j = 0; j < texCoordCount; ++j)
- {
- texCoords[i][j].U = reader.ReadSingle();
- texCoords[i][j].V = reader.ReadSingle();
- }
- }
- uint indexCount = reader.ReadUInt32();
- indices = new short[indexCount];
- for (uint i = 0; i < indexCount; ++i) indices[i] = reader.ReadInt16();
- uint subMeshCount = reader.ReadUInt32();
- subMeshes = new SubMesh[subMeshCount];
- for (uint i = 0; i < subMeshCount; ++i)
- {
- subMeshes[i].PrimType = (PrimitiveType)reader.ReadUInt32();
- subMeshes[i].StartingVertex = reader.ReadInt32();
- subMeshes[i].VertexCount = reader.ReadInt32();
- subMeshes[i].StartingIndex = reader.ReadInt32();
- subMeshes[i].PrimitiveCount = reader.ReadInt32();
- }
- uint faceNormalCount = reader.ReadUInt32();
- faceNormals = new float[faceNormalCount * 3];
- for (uint i = 0; i < faceNormalCount * 3; ++i) faceNormals[i] = reader.ReadSingle();
- uint edgeCount = reader.ReadUInt32();
- edges = new float[edgeCount * 3];
- for (uint i = 0; i < edgeCount * 3; ++i) edges[i] = reader.ReadSingle();
- uint tangentBasisCount = reader.ReadUInt32();
- tangentBases = new float[tangentBasisCount,9];
- for (uint i = 0; i < tangentBasisCount; ++i)
- {
- for (uint j = 0; j < tangentBasisCount; ++j)
- {
- tangentBases[i,j] = reader.ReadSingle();
- }
- }
- uint boneNameCount = reader.ReadUInt32();
- boneNames = new string[boneNameCount];
- for (uint i = 0; i < boneNameCount; ++i) boneNames[i] = reader.ReadString(2);
- uint boneIndexCount = reader.ReadUInt32();
- boneIndices = reader.ReadBytes((int)boneIndexCount);
- uint boneWeightCount = reader.ReadUInt32();
- boneWeights = new float[boneWeightCount];
- for (uint i = 0; i < boneWeightCount; ++i) boneWeights[i] = reader.ReadSingle();
- uint autoDropVertexIndexCount = reader.ReadUInt32();
- autoDropVertexIndices = new short[autoDropVertexIndexCount];
- for (uint i = 0; i < autoDropVertexIndexCount; ++i) autoDropVertexIndices[i] = reader.ReadInt16();
- defaultShaderPaletteName = reader.ReadString(2);
- uint subMeshNameCount = reader.ReadUInt32();
- subMeshNames = new string[subMeshNameCount];
- for (uint i = 0; i < subMeshNameCount; ++i) subMeshNames[i] = reader.ReadString(2);
- centroid[0] = reader.ReadSingle();
- centroid[1] = reader.ReadSingle();
- centroid[2] = reader.ReadSingle();
- radius = reader.ReadSingle();
- aabbMin[0] = reader.ReadSingle();
- aabbMin[1] = reader.ReadSingle();
- aabbMin[2] = reader.ReadSingle();
- aabbMax[0] = reader.ReadSingle();
- aabbMax[1] = reader.ReadSingle();
- aabbMax[2] = reader.ReadSingle();
- if (classVersion >= 12)
- {
- uint degenerateVertexCount = reader.ReadUInt32();
- degenerateVertexIndices = new short[degenerateVertexCount];
- for (uint i = 0; i < degenerateVertexCount; ++i) degenerateVertexIndices[i] = reader.ReadInt16();
- uint degenerateEdgeCount = reader.ReadUInt32();
- degenerateEdgeIndices = new short[degenerateEdgeCount];
- for (uint i = 0; i < degenerateEdgeCount; ++i) degenerateEdgeIndices[i] = reader.ReadInt16();
- }
- if (classVersion >= 13)
- {
- uint noPolygonShadowTriangleIndexCount = reader.ReadUInt32();
- noPolygonShadowTriangleIndices = new short[noPolygonShadowTriangleIndexCount];
- for (uint i = 0; i < noPolygonShadowTriangleIndexCount; ++i) noPolygonShadowTriangleIndices[i] = reader.ReadInt16();
- }
- }
- public uint flags;
- public Vertex[] vertices;
- public Vertex[] normals;
- public TexCoord[][] texCoords;
- public short[] indices;
- public SubMesh[] subMeshes;
- public float[] faceNormals;
- public float[] edges;
- public float[,] tangentBases;
- public string[] boneNames;
- public byte[] boneIndices;
- public float[] boneWeights;
- public short[] autoDropVertexIndices;
- public string defaultShaderPaletteName;
- public string[] subMeshNames;
- public float[] centroid = new float[3];
- public float radius;
- public float[] aabbMin = new float[3];
- public float[] aabbMax = new float[3];
- public short[] degenerateVertexIndices;
- public short[] degenerateEdgeIndices;
- public short[] noPolygonShadowTriangleIndices;
- }
- }
|