diff options
author | Treeki <treeki@gmail.com> | 2011-02-05 04:34:12 +0100 |
---|---|---|
committer | Treeki <treeki@gmail.com> | 2011-02-05 04:34:12 +0100 |
commit | fe451ef6fb5ea07b45fdaf4218001558bb171ef0 (patch) | |
tree | 453501a8a560e82e542e7a183babcd06e71baa97 /NW4RTools/BrresReader.cs | |
parent | db8fc350b2bffda63d27797bfe7ae4afb4af327e (diff) | |
download | nw4rtools-fe451ef6fb5ea07b45fdaf4218001558bb171ef0.tar.gz nw4rtools-fe451ef6fb5ea07b45fdaf4218001558bb171ef0.zip |
progress on material reading. still need to add DL handling and figure out what
the shader data offset is for (probably points to an entry in the Shaders dict)
Diffstat (limited to '')
-rw-r--r-- | NW4RTools/BrresReader.cs | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/NW4RTools/BrresReader.cs b/NW4RTools/BrresReader.cs index a157fe9..4c63926 100644 --- a/NW4RTools/BrresReader.cs +++ b/NW4RTools/BrresReader.cs @@ -145,6 +145,8 @@ namespace NW4RTools { FinishNodeLoading(); // Load vertex data + // COMMENTED OUT TO MAKE DEUBG OUTPUT CLEARER FOR NOW + /* using (var c2 = Debug.Push("Vertex Position Data")) mdl.VtxPosData = ReadAndConvertDict<VertexPosData>(ins.At(startPos + vtxPosOffset), ConvertVtxPosData); using (var c2 = Debug.Push("Vertex Normal Data")) @@ -153,6 +155,11 @@ namespace NW4RTools { mdl.VtxClrData = ReadAndConvertDict<VertexClrData>(ins.At(startPos + vtxClrOffset), ConvertVtxClrData); using (var c2 = Debug.Push("Vertex TexCoord Data")) mdl.VtxTexCoordData = ReadAndConvertDict<VertexTexCoordData>(ins.At(startPos + texCoordOffset), ConvertVtxTexCoordData); + */ + + // Load materials + using (var c2 = Debug.Push("Materials")) + mdl.Materials = ReadAndConvertDict<Material>(ins.At(startPos + materialOffset), ConvertModelMaterial); return mdl; } @@ -371,6 +378,159 @@ namespace NW4RTools { + private Models.Material ConvertModelMaterial(string name, InputStream ins) { + Debug.Send("Reading {0}...", name); + + var m = new Models.Material(); + + int startPos = ins.Position; + OffsetMap.Add(ins.Position, "Material: " + name); + + UInt32 size = ins.ReadUInt32(); + Int32 mdlOffset = ins.ReadInt32(); + Int32 nameOffset = ins.ReadInt32(); + m.Index = ins.ReadUInt32(); + m.Flags = ins.ReadUInt32(); + + // ResGenMode + m.TexCoordGenCount = ins.ReadByte(); + m.ChanCount = ins.ReadByte(); + m.TevStageCount = ins.ReadByte(); + m.IndStageCount = ins.ReadByte(); + m.CullMode = ins.ReadUInt32(); + + // ResMatMisc + m.ZCompLoc = ins.ReadByte(); + m.LightSetID = ins.ReadByte(); + m.FogID = ins.ReadByte(); + + m.IndirectTexMtxCalcMethod1 = ins.ReadBytes(4); + m.IndirectTexMtxCalcMethod2 = ins.ReadBytes(4); + ins.Skip(1); + + // Other stuff + Int32 shaderOffset = ins.ReadInt32(); + UInt32 boundTexCount = ins.ReadUInt32(); + Int32 boundTexOffset = ins.ReadInt32(); + Int32 furOffset = ins.ReadInt32(); + Int32 unkOffset = ins.ReadInt32(); + Int32 dlOffset = ins.ReadInt32(); + + // ResTexObj + int ResTexObjPos = ins.Position; + OffsetMap.Add(ins.Position, "Material ResTexObj: " + name); + + UInt32 textureFlag = ins.ReadUInt32(); + m.TexObj = new byte[8][]; + + for (int i = 0; i < 8; i++) { + if ((textureFlag & (1 << i)) != 0) { + m.TexObj[i] = ins.ReadBytes(0x20); + } + } + + ins.Seek(ResTexObjPos + 0x104); + + // ResTlutObj + int ResTlutObjPos = ins.Position; + OffsetMap.Add(ins.Position, "Material ResTlutObj: " + name); + + UInt32 tlutFlag = ins.ReadUInt32(); + if ((tlutFlag & 0xFC) == 0) { + m.TlutObj = ins.ReadBytes(0x20); + } else if ((tlutFlag & 0xE0) == 0) { + m.TlutObj = ins.ReadBytes(0x40); + } else { + m.TlutObj = ins.ReadBytes(0x60); + } + + ins.Seek(ResTlutObjPos + 0x64); + + // ResTexSrt + int ResTexSrtPos = ins.Position; + OffsetMap.Add(ins.Position, "Material ResTexSrt: " + name); + + UInt32 srtFlag = ins.ReadUInt32(); + m.TexMatrixType = ins.ReadUInt32(); + + m.SRTSettings = new SRTSettingInfo[8]; + InputStream texSrtStream = ins.At(ins.Position); + InputStream texSetStream = ins.At(ins.Position + (0x14 * 8)); + + for (int i = 0; i < 8; i++) { + if ((srtFlag & (0xF << (i * 4))) != 0) { + var srtInfo = m.SRTSettings[i] = new SRTSettingInfo(); + + srtInfo.ScaleX = texSrtStream.ReadFloat(); + srtInfo.ScaleY = texSrtStream.ReadFloat(); + srtInfo.Rotate = texSrtStream.ReadFloat(); + srtInfo.TranslateX = texSrtStream.ReadFloat(); + srtInfo.TranslateY = texSrtStream.ReadFloat(); + + srtInfo.CameraID = texSetStream.ReadByte(); + srtInfo.LightID = texSetStream.ReadByte(); + srtInfo.MapType = texSetStream.ReadByte(); + srtInfo.Flags = texSetStream.ReadByte(); + srtInfo.TexMatrix = texSetStream.ReadMatrix(); + } + } + + ins.Seek(ResTexSrtPos + 8 + (0x14 * 8) + (0x34 * 8)); + + // ResMatChan + OffsetMap.Add(ins.Position, "Material ResMatChan: " + name); + + m.ChanCtrls = new ChanCtrl[2]; + + for (int i = 0; i < 2; i++) { + var chanInfo = m.ChanCtrls[i] = new ChanCtrl(); + + chanInfo.Flags = ins.ReadUInt32(); + chanInfo.MatColor = ins.ReadColor(); + chanInfo.AmbColor = ins.ReadColor(); + chanInfo.FlagC = ins.ReadUInt32(); + chanInfo.FlagA = ins.ReadUInt32(); + } + + // Bound Textures + ins.Seek(startPos + boundTexOffset); + m.BoundTextures = new List<BoundTextureInfo>((int)boundTexCount); + + for (int i = 0; i < boundTexCount; i++) { + Debug.Send("Reading {0} bound texture at {1:X}", i, ins.Position); + + int bPos = ins.Position; + var bTex = new BoundTextureInfo(); + m.BoundTextures.Add(bTex); + + Int32 texOffs = ins.ReadInt32(); + bTex.TextureName = texOffs == 0 ? null : ins.At(bPos + texOffs - 4).ReadName(); + Int32 palOffs = ins.ReadInt32(); + bTex.PaletteName = palOffs == 0 ? null : ins.At(bPos + palOffs - 4).ReadName(); + + Debug.Send("<{0}> <{1}>", bTex.TextureName, bTex.PaletteName); + + // placeholder pointers, don't need these + ins.Skip(8); + + bTex.TexMapID = ins.ReadUInt32(); + bTex.TlutID = ins.ReadUInt32(); + bTex.WrapS = ins.ReadUInt32(); + bTex.WrapT = ins.ReadUInt32(); + bTex.MinFilt = ins.ReadUInt32(); + bTex.MagFilt = ins.ReadUInt32(); + bTex.LODBias = ins.ReadFloat(); + bTex.MaxAniso = ins.ReadUInt32(); + bTex.BiasClamp = (ins.ReadByte() != 0); + bTex.DoEdgeLOD = (ins.ReadByte() != 0); + ins.Skip(2); + } + + return m; + } + + + private RawStreamResDict ReadDict(InputStream ins) { RawStreamResDict output = new RawStreamResDict(); |