Exemplo n.º 1
0
 public SubModel(DatDigger.Sections.Model.ModelChunk model, Cache.VarEquip varEquip)
     : base()
 {
     this.model = model;
     this.varEquip = varEquip;
     this.meshes = new List<Mesh>();
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
            }
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
 public Model(ModelContainerChunk modelContainer, Cache.VarEquip varEquip)
 {
     this.modelContainer = modelContainer;
     this.Enabled        = true;
     this.varEquip       = varEquip;
 }
Exemplo n.º 6
0
 public SubModel(DatDigger.Sections.Model.ModelChunk model, Cache.VarEquip varEquip) : base()
 {
     this.model    = model;
     this.varEquip = varEquip;
     this.meshes   = new List <Mesh>();
 }
Exemplo n.º 7
0
 public Mesh(DatDigger.Sections.Model.MeshChunk mesh, Cache.VarEquip varEquip)
     : base()
 {
     this.mesh = mesh;
     this.varEquip = varEquip;
 }
Exemplo n.º 8
0
        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);
            }
        }
Exemplo n.º 9
0
 public Mesh(DatDigger.Sections.Model.MeshChunk mesh, Cache.VarEquip varEquip) : base()
 {
     this.mesh     = mesh;
     this.varEquip = varEquip;
 }
Exemplo n.º 10
0
        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);
            }
        }