public ADTFile(WDTFile wdt, string fileName, uint indexX, uint indexY, bool initial = false) { bool unkFlag = (wdt.Flags & 0x84) != 0; if (unkFlag) { throw new Exception(); } IndexX = indexX; IndexY = indexY; FileName = fileName; mLoadEvent = new System.Threading.ManualResetEvent(false); if (initial == false) { Game.GameManager.ThreadManager.LaunchThread( () => { try { AsyncLoadProc(); } catch (Exception) { } } ); } else { AsyncLoadProc(); } ADTManager.AddADT(this); }
///////////////////////////////////////////////////////////////////////////// public void Unload() { if (mMesh != null || mAlphaTexture != null) { Game.GameManager.GraphicsThread.CallOnThread( () => { if (mAlphaTexture != null) { ADTAlphaHandler.AddFreeTexture(mAlphaTexture); } if (mShadowTexture != null) { ADTAlphaHandler.AddFreeShadowTexture(mShadowTexture); } if (mMesh != null) { mMesh.Dispose(); mMesh = null; } }, true ); } foreach (var inst in mDoodadInstances) { foreach (var id in inst.Value) { Game.GameManager.M2ModelManager.RemoveInstance(inst.Key, id); } } foreach (var id in mConfirmedUniqueID) { var name = mParent.DoodadNames[mParent.ModelIdentifiers[(int)mParent.ModelDefinitions[(int)id].idMMID]]; ADTManager.RemoveUniqueMdxId(name, mParent.ModelDefinitions[(int)id].uniqueId); } mParent = null; mFile = null; mLayers.Clear(); mLayers = null; AlphaData = null; AlphaFloats = null; }
public ADTFile(string fileName, uint indexX, uint indexY, bool initial = false) { IndexX = indexX; IndexY = indexY; FileName = fileName; mLoadEvent = new System.Threading.ManualResetEvent(false); if (initial == false) { Game.GameManager.ThreadManager.LaunchThread(AsyncLoadProc); } else { AsyncLoadProc(); } ADTManager.AddADT(this); }
public override void Unload() { ADTManager.RemoveADT(this); Game.GameManager.ThreadManager.LaunchThread(() => { mLoadEvent.WaitOne(); foreach (var cnk in mChunks) { cnk.Unload(); } mChunks.Clear(); mChunks = null; mTextureNames = null; foreach (var tex in mTextures) { Video.TextureManager.RemoveTexture(tex); } mTextures.Clear(); mTextures = null; mOffsets = null; mpqFile = null; } ); }
public void Render(SlimDX.Matrix preTransform) { if (Game.GameManager.GraphicsThread.GraphicsManager.Camera.ViewFrustum.Contains(mBox, Matrix.Identity) == ContainmentType.Disjoint) { return; } if (mHeader.nLayers == 0) { return; } if (mMesh == null) { LoadMesh(); } if (mAlphaTexture == null) { LoadAlphaTexture(); } if (mShadowTexture == null) { LoadShadowTexture(); } if (mAlphaDirty) { LoadAlphaTexture(); mAlphaDirty = false; } foreach (var re in mRefs) { try { var name = mParent.DoodadNames[mParent.ModelIdentifiers[(int)mParent.ModelDefinitions[(int)re].idMMID]]; var uniqueID = mParent.ModelDefinitions[(int)re].uniqueId; if (ADTManager.AddUniqueMDXId(name, uniqueID) == false) { continue; } mConfirmedUniqueID.Add(re); var id = Game.GameManager.M2ModelManager.AddInstance(name, mParent.ModelDefinitions[(int)re]); if (!mDoodadInstances.ContainsKey(name)) { mDoodadInstances.Add(name, new List <uint>()); } mDoodadInstances[name].Add(id); } catch (Exception) { } } foreach (var re in mWmoRefs) { try { var modf = mParent.WMODefinitions[(int)re]; var name = mParent.WMONames[mParent.WMOIdentifiers[(int)modf.idMWID]]; var id = Models.WMO.WMOManager.AddInstance(name, mParent.WMODefinitions[(int)re].Position, modf.uniqueId, mParent.WMODefinitions[(int)re].Rotation); } catch (Exception) { } } mRefs.Clear(); mWmoRefs.Clear(); var shdr = Video.ShaderCollection.TerrainShader; shdr.SetTechnique(mHeader.nLayers - 1); shdr.SetTexture("alphaTexture", mAlphaTexture); shdr.SetTexture("shadowTexture", mShadowTexture); Matrix matChunk = preTransform * Matrix.Identity; shdr.SetValue("matrixViewProj", (matChunk * Game.GameManager.GraphicsThread.GraphicsManager.Camera.ViewProj)); shdr.SetValue("matrixWorld", matChunk); for (int i = 0; i < 4; ++i) { shdr.SetValue("TextureFlags" + i, mTextureFlags[i]); } for (int i = 0; i < mLayers.Count; ++i) { shdr.SetTexture("blendTexture" + i, mParent.GetTexture((int)mLayers[i].textureId)); } shdr.DoRender((SlimDX.Direct3D9.Device d) => { mMesh.DrawSubset(0); } ); ADTManager.VisibleChunks.Add(this); }