//--------------------------------------------------------------------------------------------------------- private unsafe string ExtractNameFromFrame(int frameNumber) { fixed(byte *pRawData = &RawFile[0]) { MD2FrameData *pFrame = (MD2FrameData *)&pRawData[frameNumber * Header.framesize + Header.ofs_frames]; byte[] name = new byte[16]; Marshal.Copy((IntPtr)pFrame->name, name, 0, name.Length); return(System.Text.Encoding.Default.GetString(name)); } }
//--------------------------------------------------------------------------------------------------------- private unsafe Vector3[] ExtractNormalsFromFrame(int frameNumber) { fixed(byte *pRawData = &RawFile[0]) { MD2FrameData *pFrame = (MD2FrameData *)&pRawData[frameNumber * Header.framesize + Header.ofs_frames]; Vector3[] normals = new Vector3[Header.num_xyz]; for (int i = 0; i < Header.num_xyz; i++) { MD2Vertex md2Vertex = ((MD2Vertex *)&pFrame->verts)[i]; normals[i] = MD2LightNormalIndex[md2Vertex.lightNormalIndex]; } return(normals); } }
//--------------------------------------------------------------------------------------------------------- private unsafe Vector3[] ExtractVerticesFromFrame(int frameNumber) { fixed(byte *pRawData = &RawFile[0]) { MD2FrameData *pFrame = (MD2FrameData *)&pRawData[frameNumber * Header.framesize + Header.ofs_frames]; Vector3 scale = new Vector3(pFrame->scale[0], pFrame->scale[1], pFrame->scale[2]); Vector3 translate = new Vector3(pFrame->translate[0], pFrame->translate[1], pFrame->translate[2]); Vector3[] vertices = new Vector3[Header.num_xyz]; for (int i = 0; i < Header.num_xyz; i++) { MD2Vertex md2Vertex = ((MD2Vertex *)&pFrame->verts)[i]; Vector3 vertex; vertex.x = -(md2Vertex.y * scale.y + translate.y); vertex.z = md2Vertex.x * scale.x + translate.x; vertex.y = md2Vertex.z * scale.z + translate.z; vertices[i] = vertex; } return(vertices); } }