public SubModel(DatDigger.Sections.Model.ModelChunk model, Cache.VarEquip varEquip) : base() { this.model = model; this.varEquip = varEquip; this.meshes = new List<Mesh>(); }
private void LoadHair(int hairId) { if (hairId == 0) { return; } // Build varEquipId int varEquipId = this.actor.HairVarEquipId; Cache.VarEquip equip = Cache.VarEquipCache.GetById(varEquipId); string texturePath = string.Format("client/chara/pc/c{0:D3}/kao/h{1:D3}/hir_tex2/0000", baseModelFolder, hairId); texturePath = System.IO.Path.Combine(Properties.Settings.Default.GameDirectory, texturePath); if (System.IO.File.Exists(texturePath)) { var texFile = DatDigger.Sections.SectionLoader.OpenFile(texturePath); this.globalSettings.TextureManager.AddRange(texFile.FindAllChildren <DatDigger.Sections.Texture.TextureSection>()); } string modelPath = string.Format("client/chara/pc/c{0:D3}/kao/h{1:D3}/hir_mdl/0001", baseModelFolder, hairId); modelPath = System.IO.Path.Combine(Properties.Settings.Default.GameDirectory, modelPath); var mdlFile = DatDigger.Sections.SectionLoader.OpenFile(modelPath); var mdlc = mdlFile.FindChild <DatDigger.Sections.Model.ModelContainerChunk>(); var model = new Model(mdlc, equip); this.models[(int)ModelPart.NumModelParts + 1] = model; this.renderList.Add(model); }
public void DetermineEnableStatus(Cache.VarEquip varEquip) { if (varEquip == null) { return; } string nameEnd = this.Name.Substring(this.Name.Length - 2); switch (nameEnd) { case "_a": this.enabled = !varEquip.PgrpA; break; case "_b": this.enabled = !varEquip.PgrpB; break; case "_c": this.enabled = !varEquip.PgrpC; break; case "_d": this.enabled = !varEquip.PgrpD; break; case "_e": this.enabled = !varEquip.PgrpE; break; case "_f": this.enabled = !varEquip.PgrpF; break; case "_g": this.enabled = !varEquip.PgrpG; break; case "_h": this.enabled = !varEquip.PgrpH; break; case "_i": this.enabled = !varEquip.PgrpI; break; case "_j": this.enabled = !varEquip.PgrpJ; break; case "_k": this.enabled = !varEquip.PgrpK; break; case "_l": this.enabled = !varEquip.PgrpL; break; case "_m": this.enabled = !varEquip.PgrpM; break; case "_n": this.enabled = !varEquip.PgrpN; break; case "_o": this.enabled = !varEquip.PgrpO; break; case "_p": this.enabled = !varEquip.PgrpP; break; default: this.enabled = true; break; } if (this.RenderSettings.Pgrps.Contains(this.Name)) { this.enabled = false; } }
public void SetEffect(string effectName, Cache.VarEquip material, int materialMeshOffset) { materialMeshOffset = GetMaterialOffset(effectName); // If Effect is changing - load everything if ((CurrentEffect == null) || (effectName != CurrentEffect.Name)) { var newEffect = this.Effects.Find(x => x.Name == effectName); if (newEffect == null) { throw new InvalidOperationException("Cannot find shader named " + effectName); } CurrentEffect = newEffect; if (material != null) { CurrentMaterialId = material.ID; } device.VertexShader = CurrentEffect.VertexShader; CurrentEffect.LoadVertexShaderParameters(); if (UsePixelShader) { device.PixelShader = CurrentEffect.PixelShader; CurrentEffect.LoadPixelShaderParameters(material, materialMeshOffset); } return; } // If only the material is changing, load shader parameters if (material != null && material.ID != CurrentMaterialId) { CurrentMaterialId = material.ID; CurrentEffect.LoadVertexShaderParameters(); if (UsePixelShader) { CurrentEffect.LoadPixelShaderParameters(material, materialMeshOffset); } return; } }
public Model(ModelContainerChunk modelContainer, Cache.VarEquip varEquip) { this.modelContainer = modelContainer; this.Enabled = true; this.varEquip = varEquip; }
public SubModel(DatDigger.Sections.Model.ModelChunk model, Cache.VarEquip varEquip) : base() { this.model = model; this.varEquip = varEquip; this.meshes = new List <Mesh>(); }
public Mesh(DatDigger.Sections.Model.MeshChunk mesh, Cache.VarEquip varEquip) : base() { this.mesh = mesh; this.varEquip = varEquip; }
private void LoadModel(int modelId, ModelPart part) { if (modelId == 0) { return; } int subModelId = modelId >> 10; int texture = (modelId >> 5) & 0x1F; //int variation = modelId & 0x1F; int varEquipId = 0; string charaFolder; string charaPrefix; string partFolder = "top"; switch (part) { case ModelPart.Top: partFolder = "top"; varEquipId = this.actor.TopVarEquipId; break; case ModelPart.Dwn: partFolder = "dwn"; varEquipId = this.actor.BottomVarEquipId; break; case ModelPart.Glv: partFolder = "glv"; varEquipId = this.actor.GloveVarEquipId; break; case ModelPart.Sho: partFolder = "sho"; varEquipId = this.actor.ShoeVarEquipId; break; case ModelPart.Met: partFolder = "met"; varEquipId = this.actor.HelmVarEquipId; break; case ModelPart.Pch: partFolder = "pch"; varEquipId = 0; break; default: throw new System.InvalidOperationException("Unexpected Model Part " + part); } switch (modelType) { case DatDigger.Xml.Format.ModelType.Monster: charaFolder = "mon"; charaPrefix = "m"; break; case DatDigger.Xml.Format.ModelType.BgObject: charaFolder = "bgobj"; charaPrefix = "b"; break; case DatDigger.Xml.Format.ModelType.Weapon: charaFolder = "wep"; charaPrefix = "w"; break; case DatDigger.Xml.Format.ModelType.PC: charaFolder = "pc"; charaPrefix = "c"; break; default: throw new System.InvalidOperationException("Unknown ModelType: " + modelType); } Cache.VarEquip equip = null; int texFolder; if (varEquipId > 0) { equip = Cache.VarEquipCache.GetById(varEquipId); if (equip != null) { texFolder = Cache.TexturePathCache.GetTextureFolderId(equip.TexPathID, this.baseModelFolder); } else { texFolder = this.baseModelFolder; } } else { texFolder = this.baseModelFolder; } string texturePath = string.Format("client/chara/{0}/{1}{2:D3}/equ/e{3:D3}/{4}_tex2/{5:D4}", charaFolder, charaPrefix, texFolder, subModelId, partFolder, texture); texturePath = System.IO.Path.Combine(Properties.Settings.Default.GameDirectory, texturePath); if (System.IO.File.Exists(texturePath)) { var texFile = DatDigger.Sections.SectionLoader.OpenFile(texturePath); this.globalSettings.TextureManager.AddRange(texFile.FindAllChildren <DatDigger.Sections.Texture.TextureSection>()); } string modelPath = string.Format("client/chara/{0}/{1}{2:D3}/equ/e{3:D3}/{4}_mdl/0001", charaFolder, charaPrefix, baseModelFolder, subModelId, partFolder); modelPath = System.IO.Path.Combine(Properties.Settings.Default.GameDirectory, modelPath); var mdlFile = DatDigger.Sections.SectionLoader.OpenFile(modelPath); var mdlc = mdlFile.FindChild <DatDigger.Sections.Model.ModelContainerChunk>(); // There is a possibility that some model files only contain effects and not actual models in which case don't create a model if (mdlc != null) { var model = new Model(mdlc, equip); this.models[(int)part] = model; this.renderList.Add(model); } }
public Mesh(DatDigger.Sections.Model.MeshChunk mesh, Cache.VarEquip varEquip) : base() { this.mesh = mesh; this.varEquip = varEquip; }
public void LoadPixelShaderParameters(Cache.VarEquip material, int materialMeshOffset) { TextureManager texMan = GlobalRenderSettings.Instance.TextureManager; int numConstants = this.PixelShaderInfo.ConstantDescriptions.Count; for (var i = 0; i < numConstants; i++) { var desc = this.PixelShaderInfo.ConstantDescriptions[i]; var handle = this.PixelShaderInfo.ConstantHandles[i]; if (desc.RegisterSet == RegisterSet.Sampler) { for (var s = 0; s < paramData.NumSamplers; s++) { var sampler = paramData.Samplers[s]; if (sampler.Name == desc.Name) { BaseTexture tex = null; for (var t = 0; t < sampler.StringTable.Count; t++) { if (sampler.Name == "lightDiffuseMap") { tex = texMan.LightDiffuseMap; } else { tex = texMan.GetByName(sampler.StringTable[t]); } if (tex != null) { device.SetTexture(desc.RegisterIndex, tex); device.SetSamplerState(desc.RegisterIndex, SamplerState.MinFilter, TextureFilter.Anisotropic); device.SetSamplerState(desc.RegisterIndex, SamplerState.MagFilter, TextureFilter.Anisotropic); device.SetSamplerState(desc.RegisterIndex, SamplerState.MipFilter, TextureFilter.Anisotropic); break; } } if (tex == null) { throw new InvalidOperationException("Unable to load texture " + sampler.StringTable[0]); } } } continue; } SetConstantValueDelegate del; if (pxlSetters.TryGetValue(desc.Name, out del)) { del(this.PixelShader.Function.ConstantTable, device, handle); } } // Set the defaults specified in the pixel shader bytecode this.PixelShader.Function.ConstantTable.SetDefaults(device); // Set the defaults specified in the PRAM data foreach (ParameterData pdata in paramData.Parameters) { if (!pdata.IsPixelShaderParameter) { continue; } Vector4 val = pdata.Defaults; if (material != null) { switch (pdata.Name) { case "modulateColor": var actor = GlobalRenderSettings.Instance.Actor; if (actor != null) { if (paramData.Samplers.Find(x => x.Name.Equals("lightToneMap")) != null) { Color3 color = ColorHelper.GetSkinTone(actor.BaseModelFolder, actor.C22); val.X = color.Red; val.Y = color.Green; val.Z = color.Blue; } else if (paramData.Parameters.Find(x => x.Name.Equals("velvetParam")) != null) { Color3 color = ColorHelper.GetHairColor(actor.BaseModelFolder, actor.C21); val.X = color.Red; val.Y = color.Green; val.Z = color.Blue; } } break; case "diffuseColor": val.X = material.GetMaterialValue(0, materialMeshOffset, val.X); val.Y = material.GetMaterialValue(1, materialMeshOffset, val.Y); val.Z = material.GetMaterialValue(2, materialMeshOffset, val.Z); break; case "multiDiffuseColor": val.X = material.GetMaterialValue(3, materialMeshOffset, val.X); val.Y = material.GetMaterialValue(4, materialMeshOffset, val.Y); val.Z = material.GetMaterialValue(5, materialMeshOffset, val.Z); val.W = material.GetMaterialValue(6, materialMeshOffset, val.W); break; /*case "specularColor": * val.X = material.GetMaterialValue(7, materialMeshOffset, val.X); * val.Y = material.GetMaterialValue(8, materialMeshOffset, val.Y); * val.Z = material.GetMaterialValue(9, materialMeshOffset, val.Z); * break; * case "multiSpecularColor": * val.X = material.GetMaterialValue(10, materialMeshOffset, val.X); * val.Y = material.GetMaterialValue(11, materialMeshOffset, val.Y); * val.Z = material.GetMaterialValue(12, materialMeshOffset, val.Z); * break; * case "reflectivity": * val.X = material.GetMaterialValue(7, materialMeshOffset, val.X); * val.Y = material.GetMaterialValue(8, materialMeshOffset, val.Y); * val.Z = material.GetMaterialValue(9, materialMeshOffset, val.Z); * break; * case "multiReflectivity": * val.X = material.GetMaterialValue(10, materialMeshOffset, val.X); * val.Y = material.GetMaterialValue(11, materialMeshOffset, val.Y); * val.Z = material.GetMaterialValue(12, materialMeshOffset, val.Z); * break;*/ case "shininess": val.X = material.GetMaterialValue(13, materialMeshOffset, val.X); break; case "multiShininess": val.X = material.GetMaterialValue(14, materialMeshOffset, val.X); break; } } this.PixelShader.Function.ConstantTable.SetValue(device, pdata.EffectHandle, val); } }