#region ================== Namespaces using System.Collections.Generic; using CodeImp.DoomBuilder.GZBuilder.MD3; using CodeImp.DoomBuilder.Rendering; using SlimDX; using SlimDX.Direct3D9; #endregion namespace CodeImp.DoomBuilder.GZBuilder.Data { internal sealed class ModelData { #region ================== Constants public static readonly string[] SUPPORTED_TEXTURE_EXTENSIONS = { ".jpg", ".tga", ".png", ".dds", ".pcx" }; #endregion #region ================== Variables private ModelLoadState loadstate; private Vector3 scale; private Matrix transform; private Matrix transformstretched; #endregion #region ================== Properties internal List ModelNames; internal List SkinNames; internal List> SurfaceSkinNames; internal List FrameNames; internal List FrameIndices; internal GZModel Model; internal Vector3 Scale { get { return scale; } } internal Matrix Transform { get { return (General.Settings.GZStretchView ? transformstretched : transform); } } internal bool OverridePalette; // Used for voxel models only internal float AngleOffset; // Used for voxel models only internal bool InheritActorPitch; internal bool UseActorPitch; internal bool UseActorRoll; internal bool IsVoxel; // Hashing private static int hashcounter; private readonly int hashcode; // Disposing private bool isdisposed; public ModelLoadState LoadState { get { return loadstate; } internal set { loadstate = value; } } #endregion #region ================== Constructor / Disposer internal ModelData() { ModelNames = new List(); SkinNames = new List(); SurfaceSkinNames = new List>(); FrameNames = new List(); FrameIndices = new List(); transform = Matrix.Identity; transformstretched = Matrix.Identity; hashcode = hashcounter++; } internal void Dispose() { // Not already disposed? if(!isdisposed) { // Clean up if(Model != null) { foreach(Mesh mesh in Model.Meshes) mesh.Dispose(); foreach(Texture t in Model.Textures) t.Dispose(); loadstate = ModelLoadState.None; } // Done isdisposed = true; } } internal void SetTransform(Matrix rotation, Matrix offset, Vector3 scale) { this.scale = scale; transform = rotation * Matrix.Scaling(scale) * offset; transformstretched = Matrix.Scaling(1.0f, 1.0f, Renderer3D.GZDOOM_INVERTED_VERTICAL_VIEW_STRETCH) * transform; } //mxd. This greatly speeds up Dictionary lookups public override int GetHashCode() { return hashcode; } #endregion } }