public GFTextureCoord(H3DTextureCoord Coord, H3DTextureMapper Mapper, string TextureName, byte UnitIndex) { Name = TextureName; this.UnitIndex = UnitIndex; MappingType = (GFTextureMappingType)Coord.MappingType; Scale = Coord.Scale; Rotation = Coord.Rotation; Translation = Coord.Translation; WrapU = (GFTextureWrap)Mapper.WrapU; WrapV = (GFTextureWrap)Mapper.WrapV; MagFilter = (GFMagFilter)Mapper.MagFilter; MinFilter = (GFMinFilter)Mapper.MinFilter; MinLOD = Mapper.MinLOD; }
public GFTextureCoord(BinaryReader Reader) { Name = new GFHashName(Reader).Name; UnitIndex = Reader.ReadByte(); MappingType = (GFTextureMappingType)Reader.ReadByte(); Scale = Reader.ReadVector2(); Rotation = Reader.ReadSingle(); Translation = Reader.ReadVector2(); WrapU = (GFTextureWrap)Reader.ReadUInt32(); WrapV = (GFTextureWrap)Reader.ReadUInt32(); MagFilter = (GFMagFilter)Reader.ReadUInt32(); //Not sure MinFilter = (GFMinFilter)Reader.ReadUInt32(); //Not sure MinLOD = Reader.ReadUInt32(); //Not sure }
public H3DModel ToH3DModel() { H3DModel Output = new H3DModel() { Name = Name }; //Skeleton foreach (GFBone Bone in Skeleton) { Output.Skeleton.Add(new H3DBone() { ParentIndex = (short)Skeleton.FindIndex(x => x.Name == Bone.Parent), Name = Bone.Name, Scale = Bone.Scale, Rotation = Bone.Rotation, Translation = Bone.Translation }); } foreach (H3DBone Bone in Output.Skeleton) { Bone.CalculateTransform(Output.Skeleton); Bone.Flags |= H3DBoneFlags.IsSegmentScaleCompensate; } if (Output.Skeleton.Count > 0) { Output.Flags = H3DModelFlags.HasSkeleton; } //Materials foreach (GFMaterial Material in Materials) { H3DMaterial Mat = new H3DMaterial(); H3DMaterialParams Params = Mat.MaterialParams; Mat.Name = Material.MaterialName; Params.FragmentFlags = H3DFragmentFlags.IsLUTReflectionEnabled; Array.Copy(Material.TextureSources, Params.TextureSources, 4); for (int Unit = 0; Unit < Material.TextureCoords.Length; Unit++) { string TextureName = Material.TextureCoords[Unit].Name; Mat.EnabledTextures[Unit] = TextureName != null; switch (Unit) { case 0: Mat.Texture0Name = TextureName; break; case 1: Mat.Texture1Name = TextureName; break; case 2: Mat.Texture2Name = TextureName; break; } //Texture Coords GFTextureMappingType MappingType = Material.TextureCoords[Unit].MappingType; Params.TextureCoords[Unit].MappingType = (H3DTextureMappingType)MappingType; Params.TextureCoords[Unit].Scale = Material.TextureCoords[Unit].Scale; Params.TextureCoords[Unit].Rotation = Material.TextureCoords[Unit].Rotation; Params.TextureCoords[Unit].Translation = Material.TextureCoords[Unit].Translation; //Texture Mapper Mat.TextureMappers[Unit].WrapU = (PICATextureWrap)Material.TextureCoords[Unit].WrapU; Mat.TextureMappers[Unit].WrapV = (PICATextureWrap)Material.TextureCoords[Unit].WrapV; Mat.TextureMappers[Unit].MagFilter = (H3DTextureMagFilter)Material.TextureCoords[Unit].MagFilter; Mat.TextureMappers[Unit].MinFilter = (H3DTextureMinFilter)Material.TextureCoords[Unit].MinFilter; Mat.TextureMappers[Unit].MinLOD = (byte)Material.TextureCoords[Unit].MinLOD; Mat.TextureMappers[Unit].BorderColor = Material.BorderColor[Unit]; } Params.EmissionColor = Material.EmissionColor; Params.AmbientColor = Material.AmbientColor; Params.DiffuseColor = Material.DiffuseColor; Params.Specular0Color = Material.Specular0Color; Params.Specular1Color = Material.Specular1Color; Params.Constant0Color = Material.Constant0Color; Params.Constant1Color = Material.Constant1Color; Params.Constant2Color = Material.Constant2Color; Params.Constant3Color = Material.Constant3Color; Params.Constant4Color = Material.Constant4Color; Params.Constant5Color = Material.Constant5Color; Params.BlendColor = Material.BlendColor; //HACK: It's usually 0 on Sun/Moon, this causes issues on some //models being rendered transparent (Shader differences). Params.DiffuseColor.A = 0xff; Params.ColorScale = 1f; Params.LUTInputAbsolute = Material.LUTInputAbsolute; Params.LUTInputSelection = Material.LUTInputSelection; Params.LUTInputScale = Material.LUTInputScale; Params.ColorOperation = Material.ColorOperation; Params.BlendFunction = Material.BlendFunction; Params.LogicalOperation = Material.LogicalOperation; Params.AlphaTest = Material.AlphaTest; Params.StencilTest = Material.StencilTest; Params.StencilOperation = Material.StencilOperation; Params.DepthColorMask = Material.DepthColorMask; Params.FaceCulling = Material.FaceCulling; Params.ColorBufferRead = Material.ColorBufferRead; Params.ColorBufferWrite = Material.ColorBufferWrite; Params.StencilBufferRead = Material.StencilBufferRead; Params.StencilBufferWrite = Material.StencilBufferWrite; Params.DepthBufferRead = Material.DepthBufferRead; Params.DepthBufferWrite = Material.DepthBufferWrite; if (Material.LUT0HashId != 0) { Params.LUTReflecRTableName = DefaultLUTName; Params.LUTReflecRSamplerName = GetLUTName(Material.LUT0HashId); } if (Material.LUT1HashId != 0) { Params.LUTReflecGTableName = DefaultLUTName; Params.LUTReflecGSamplerName = GetLUTName(Material.LUT1HashId); } if (Material.LUT2HashId != 0) { Params.LUTReflecBTableName = DefaultLUTName; Params.LUTReflecBSamplerName = GetLUTName(Material.LUT2HashId); } if (Material.BumpTexture != -1) { Params.BumpTexture = (byte)Material.BumpTexture; Params.BumpMode = H3DBumpMode.AsBump; } Params.Constant0Assignment = Material.Constant0Assignment; Params.Constant1Assignment = Material.Constant1Assignment; Params.Constant2Assignment = Material.Constant2Assignment; Params.Constant3Assignment = Material.Constant3Assignment; Params.Constant4Assignment = Material.Constant4Assignment; Params.Constant5Assignment = Material.Constant5Assignment; string VtxShaderName = Material.VtxShaderName; //Make shader names match X/Y/OR/AS shader names. if (VtxShaderName == "Poke" || VtxShaderName == "PokeNormal") { VtxShaderName = "PokePack"; } Params.ShaderReference = $"0@{VtxShaderName}"; Params.ModelReference = $"{Mat.Name}@{Name}"; /* * Add those for compatibility with the older BCH models. * It's worth noting that ShaderParam0 is usually used as "UVScale" on model that uses * geometry shader to make billboarded point sprites. On the new shader it have a * multiplication of the Color by 3, while the older one doesn't have such multiplication, * so for compatibility with the older shader, the easiest thing to do is just multiply the * scale by 3 to give the same results on the old shader. */ Params.MetaData = new H3DMetaData(); Params.MetaData.Add(new H3DMetaDataValue("EdgeType", Material.EdgeType)); Params.MetaData.Add(new H3DMetaDataValue("IDEdgeEnable", Material.IDEdgeEnable)); Params.MetaData.Add(new H3DMetaDataValue("EdgeID", Material.EdgeID)); Params.MetaData.Add(new H3DMetaDataValue("ProjectionType", Material.ProjectionType)); Params.MetaData.Add(new H3DMetaDataValue("RimPow", Material.RimPower)); Params.MetaData.Add(new H3DMetaDataValue("RimScale", Material.RimScale)); Params.MetaData.Add(new H3DMetaDataValue("PhongPow", Material.PhongPower)); Params.MetaData.Add(new H3DMetaDataValue("PhongScale", Material.PhongScale)); Params.MetaData.Add(new H3DMetaDataValue("IDEdgeOffsetEnable", Material.IDEdgeOffsetEnable)); Params.MetaData.Add(new H3DMetaDataValue("EdgeMapAlphaMask", Material.EdgeMapAlphaMask)); Params.MetaData.Add(new H3DMetaDataValue("BakeTexture0", Material.BakeTexture0)); Params.MetaData.Add(new H3DMetaDataValue("BakeTexture1", Material.BakeTexture1)); Params.MetaData.Add(new H3DMetaDataValue("BakeTexture2", Material.BakeTexture2)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant0", Material.BakeConstant0)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant1", Material.BakeConstant1)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant2", Material.BakeConstant2)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant3", Material.BakeConstant3)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant4", Material.BakeConstant4)); Params.MetaData.Add(new H3DMetaDataValue("BakeConstant5", Material.BakeConstant5)); Params.MetaData.Add(new H3DMetaDataValue("VertexShaderType", Material.VertexShaderType)); Params.MetaData.Add(new H3DMetaDataValue("ShaderParam0", Material.ShaderParam0 * 3)); Params.MetaData.Add(new H3DMetaDataValue("ShaderParam1", Material.ShaderParam1)); Params.MetaData.Add(new H3DMetaDataValue("ShaderParam2", Material.ShaderParam2)); Params.MetaData.Add(new H3DMetaDataValue("ShaderParam3", Material.ShaderParam3)); Output.Materials.Add(Mat); } //Meshes Output.MeshNodesTree = new H3DPatriciaTree(); foreach (GFMesh Mesh in Meshes) { //Note: GFModel have one Vertex Buffer for each SubMesh, //while on H3D all SubMeshes shares the same Vertex Buffer. //For this reason we need to store SubMeshes as Meshes on H3D. foreach (GFSubMesh SubMesh in Mesh.SubMeshes) { int NodeIndex = Output.MeshNodesTree.Find(Mesh.Name); if (NodeIndex == -1) { Output.MeshNodesTree.Add(Mesh.Name); Output.MeshNodesVisibility.Add(true); NodeIndex = Output.MeshNodesCount++; } List <H3DSubMesh> SubMeshes = new List <H3DSubMesh>(); ushort[] BoneIndices = new ushort[SubMesh.BoneIndicesCount]; for (int Index = 0; Index < BoneIndices.Length; Index++) { BoneIndices[Index] = SubMesh.BoneIndices[Index]; } H3DSubMeshSkinning SMSk = Output.Skeleton.Count > 0 ? H3DSubMeshSkinning.Smooth : H3DSubMeshSkinning.None; SubMeshes.Add(new H3DSubMesh() { Skinning = SMSk, BoneIndicesCount = SubMesh.BoneIndicesCount, BoneIndices = BoneIndices, Indices = SubMesh.Indices }); H3DMesh M = new H3DMesh( SubMesh.RawBuffer, SubMesh.VertexStride, SubMesh.Attributes, SubMesh.FixedAttributes, SubMeshes); M.Skinning = H3DMeshSkinning.Smooth; int MatIndex = Materials.FindIndex(x => x.MaterialName == SubMesh.Name); GFMaterial Mat = Materials[MatIndex]; M.MaterialIndex = (ushort)MatIndex; M.NodeIndex = (ushort)NodeIndex; M.Layer = Mat.RenderLayer; M.Priority = Mat.RenderPriority; M.UpdateBoolUniforms(Output.Materials[MatIndex]); Output.AddMesh(M); } } return(Output); }