diff options
| author | Treeki <treeki@gmail.com> | 2011-03-10 03:00:09 +0100 | 
|---|---|---|
| committer | Treeki <treeki@gmail.com> | 2011-03-10 03:00:09 +0100 | 
| commit | 5926616de2bd346f1a1c69c93ff2aaa3c453a2b3 (patch) | |
| tree | f282b05ae5616a05fb4db167fad20ec242775c27 /NW4RTools/ObjImporter.cs | |
| parent | 7d391e33a0b3d9793c95fce832abb2c6d9002186 (diff) | |
| download | nw4rtools-5926616de2bd346f1a1c69c93ff2aaa3c453a2b3.tar.gz nw4rtools-5926616de2bd346f1a1c69c93ff2aaa3c453a2b3.zip  | |
kinda hackish, but mostly working NSMBW lightmap support
Diffstat (limited to '')
| -rwxr-xr-x | NW4RTools/ObjImporter.cs | 309 | 
1 files changed, 218 insertions, 91 deletions
diff --git a/NW4RTools/ObjImporter.cs b/NW4RTools/ObjImporter.cs index 81fcf81..1606028 100755 --- a/NW4RTools/ObjImporter.cs +++ b/NW4RTools/ObjImporter.cs @@ -239,86 +239,165 @@ namespace NW4RTools {  					// Create a new material and initialise everything
  					// Default settings taken from Test_Lift material
  					currentMaterial = new Material();
 -
 -					currentMaterial.TexCoordGenCount = 1;
 -					currentMaterial.ChanCount = 1;
 -					currentMaterial.TevStageCount = 2;
 -					currentMaterial.IndStageCount = 0;
 -
 -					// This might need changing
 -					currentMaterial.CullMode = 2;
 -
 -					currentMaterial.SRTSettings[0] = new SRTSettingInfo();
 -
 -					currentMaterial.ChanCtrls[0] = new ChanCtrl();
 -					currentMaterial.ChanCtrls[0].Flags = 0x3F;
 -					currentMaterial.ChanCtrls[0].MatColor.Rgba = 0xFFFFFFFF;
 -					currentMaterial.ChanCtrls[0].AmbColor.Rgba = 0xFFFFFFFF;
 -					currentMaterial.ChanCtrls[0].FlagC = 0x702;
 -					currentMaterial.ChanCtrls[0].FlagA = 0x700;
 -
 -					currentMaterial.ChanCtrls[1] = new ChanCtrl();
 -					currentMaterial.ChanCtrls[1].Flags = 0xF;
 -					currentMaterial.ChanCtrls[1].MatColor.Rgba = 0x000000FF;
 -					currentMaterial.ChanCtrls[1].AmbColor.Rgba = 0x00000000;
 -					currentMaterial.ChanCtrls[1].FlagC = 0;
 +				 +					currentMaterial.ChanCtrls[0] = new ChanCtrl(); +					currentMaterial.ChanCtrls[0].Flags = 0x3F; +					currentMaterial.ChanCtrls[0].MatColor.Rgba = 0xFFFFFFFF; +					currentMaterial.ChanCtrls[0].AmbColor.Rgba = 0xFFFFFFFF; +					currentMaterial.ChanCtrls[0].FlagC = Lightmaps ? (uint)0x701 : (uint)0x702; +					currentMaterial.ChanCtrls[0].FlagA = 0x700; +					 +					currentMaterial.ChanCtrls[1] = new ChanCtrl(); +					currentMaterial.ChanCtrls[1].Flags = 0xF; +					currentMaterial.ChanCtrls[1].MatColor.Rgba = 0x000000FF; +					currentMaterial.ChanCtrls[1].AmbColor.Rgba = 0x00000000; +					currentMaterial.ChanCtrls[1].FlagC = 0;  					currentMaterial.ChanCtrls[1].FlagA = 0; -					currentMaterial.LightSetID = 1;
 +					if (!Lightmaps) {
 +						currentMaterial.TexCoordGenCount = 1;
 +						currentMaterial.ChanCount = 1;
 +						currentMaterial.TevStageCount = 2;
 +						currentMaterial.IndStageCount = 0;
 +
 +						// This might need changing
 +						currentMaterial.CullMode = 2;
 +					 +						currentMaterial.LightSetID = 1; +	 +						currentMaterial.SRTSettings[0] = new SRTSettingInfo();
 -					// Default display lists, taken from test_lift
 -					var pixDL = new DisplayListWriter(); -					pixDL.LoadBPReg(0xF31EFF80); -					pixDL.LoadBPReg(0x40000017); -					pixDL.LoadBPReg(0xFE00FFE3); -					pixDL.LoadBPReg(0x410034A0); -					pixDL.LoadBPReg(0x42000000); -					pixDL.End(); - -					currentMaterial.PixDL = pixDL.GetBuffer(); - -					var tevColorDL = new DisplayListWriter(); -					tevColorDL.LoadBPReg(0xE20000FF); -					tevColorDL.LoadBPReg(0xE30FF0FF); -					tevColorDL.LoadBPReg(0xE30FF0FF); -					tevColorDL.LoadBPReg(0xE30FF0FF); -					tevColorDL.LoadBPReg(0xE4000000); -					tevColorDL.LoadBPReg(0xE5000000); -					tevColorDL.LoadBPReg(0xE5000000); -					tevColorDL.LoadBPReg(0xE5000000); -					tevColorDL.LoadBPReg(0xE6000000); -					tevColorDL.LoadBPReg(0xE7000000); -					tevColorDL.LoadBPReg(0xE7000000); -					tevColorDL.LoadBPReg(0xE7000000); -					tevColorDL.AddPadding(4); -					tevColorDL.LoadBPReg(0xE0800000); -					tevColorDL.LoadBPReg(0xE1800000); -					tevColorDL.LoadBPReg(0xE2800000); -					tevColorDL.LoadBPReg(0xE3800000); -					tevColorDL.LoadBPReg(0xE4800000); -					tevColorDL.LoadBPReg(0xE5800000); -					tevColorDL.LoadBPReg(0xE6800000); -					tevColorDL.LoadBPReg(0xE7800000); -					tevColorDL.AddPadding(24); -					tevColorDL.End(); - -					currentMaterial.TevColorDL = tevColorDL.GetBuffer(); - -					var indMtxAndScaleDL = new DisplayListWriter(); -					indMtxAndScaleDL.LoadBPReg(0x25000000); -					indMtxAndScaleDL.LoadBPReg(0x26000000); -					indMtxAndScaleDL.AddPadding(54); -					indMtxAndScaleDL.End(); - -					currentMaterial.IndMtxAndScaleDL = indMtxAndScaleDL.GetBuffer(); - -					var texCoordGenDL = new DisplayListWriter(); -					texCoordGenDL.LoadXFReg(0x1040, new byte[] { 0x00, 0x00, 0x52, 0x80 }); -					texCoordGenDL.LoadXFReg(0x1050, new byte[] { 0x00, 0x00, 0x00, 0x00 }); -					texCoordGenDL.AddPadding(110); -					texCoordGenDL.End(); - -					currentMaterial.TexCoordGenDL = texCoordGenDL.GetBuffer(); +						// Default display lists, taken from test_lift
 +						var pixDL = new DisplayListWriter(); +						pixDL.LoadBPReg(0xF31EFF80); +						pixDL.LoadBPReg(0x40000017); +						pixDL.LoadBPReg(0xFE00FFE3); +						pixDL.LoadBPReg(0x410034A0); +						pixDL.LoadBPReg(0x42000000); +						pixDL.End(); + +						currentMaterial.PixDL = pixDL.GetBuffer(); + +						var tevColorDL = new DisplayListWriter(); +						tevColorDL.LoadBPReg(0xE20000FF); +						tevColorDL.LoadBPReg(0xE30FF0FF); +						tevColorDL.LoadBPReg(0xE30FF0FF); +						tevColorDL.LoadBPReg(0xE30FF0FF); +						tevColorDL.LoadBPReg(0xE4000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE6000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.AddPadding(4); +						tevColorDL.LoadBPReg(0xE0800000); +						tevColorDL.LoadBPReg(0xE1800000); +						tevColorDL.LoadBPReg(0xE2800000); +						tevColorDL.LoadBPReg(0xE3800000); +						tevColorDL.LoadBPReg(0xE4800000); +						tevColorDL.LoadBPReg(0xE5800000); +						tevColorDL.LoadBPReg(0xE6800000); +						tevColorDL.LoadBPReg(0xE7800000); +						tevColorDL.AddPadding(24); +						tevColorDL.End(); + +						currentMaterial.TevColorDL = tevColorDL.GetBuffer(); + +						var indMtxAndScaleDL = new DisplayListWriter(); +						indMtxAndScaleDL.LoadBPReg(0x25000000); +						indMtxAndScaleDL.LoadBPReg(0x26000000); +						indMtxAndScaleDL.AddPadding(54); +						indMtxAndScaleDL.End(); + +						currentMaterial.IndMtxAndScaleDL = indMtxAndScaleDL.GetBuffer(); + +						var texCoordGenDL = new DisplayListWriter(); +						texCoordGenDL.LoadXFReg(0x1040, new byte[] { 0x00, 0x00, 0x52, 0x80 }); +						texCoordGenDL.LoadXFReg(0x1050, new byte[] { 0x00, 0x00, 0x00, 0x00 }); +						texCoordGenDL.AddPadding(110); +						texCoordGenDL.End(); + +						currentMaterial.TexCoordGenDL = texCoordGenDL.GetBuffer(); + +					} else { +						// These are taken from mtSand on CS_W1 +						currentMaterial.TexCoordGenCount = 3; +						currentMaterial.ChanCount = 1; +						currentMaterial.TevStageCount = 3; +						currentMaterial.IndStageCount = 0; + +						currentMaterial.CullMode = 2; + +						currentMaterial.ZCompLoc = 1; +						currentMaterial.LightSetID = 0xFF; +						currentMaterial.FogID = 1; + +						currentMaterial.SRTSettings[0] = new SRTSettingInfo(); +						currentMaterial.SRTSettings[1] = new SRTSettingInfo(); +						currentMaterial.SRTSettings[2] = new SRTSettingInfo(); + +						currentMaterial.SRTSettings[1].MapType = 1; +						currentMaterial.SRTSettings[2].MapType = 1; + +						var pixDL = new DisplayListWriter(); +						pixDL.LoadBPReg(0xF33F0000); +						pixDL.LoadBPReg(0x40000017); +						pixDL.LoadBPReg(0xFE00FFE3); +						pixDL.LoadBPReg(0x410034A0); +						pixDL.LoadBPReg(0x42000000); +						pixDL.End(); +						 +						currentMaterial.PixDL = pixDL.GetBuffer(); +						 +						var tevColorDL = new DisplayListWriter(); +						tevColorDL.LoadBPReg(0xE2000000); +						tevColorDL.LoadBPReg(0xE3000000); +						tevColorDL.LoadBPReg(0xE3000000); +						tevColorDL.LoadBPReg(0xE3000000); +						tevColorDL.LoadBPReg(0xE4000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE5000000); +						tevColorDL.LoadBPReg(0xE6000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.LoadBPReg(0xE7000000); +						tevColorDL.AddPadding(4); +						tevColorDL.LoadBPReg(0xE0800000); +						tevColorDL.LoadBPReg(0xE1800000); +						tevColorDL.LoadBPReg(0xE2800000); +						tevColorDL.LoadBPReg(0xE3800000); +						tevColorDL.LoadBPReg(0xE4800000); +						tevColorDL.LoadBPReg(0xE5800000); +						tevColorDL.LoadBPReg(0xE68FF000); +						tevColorDL.LoadBPReg(0xE7800000); +						tevColorDL.AddPadding(24); +						tevColorDL.End(); +						 +						currentMaterial.TevColorDL = tevColorDL.GetBuffer(); +						 +						var indMtxAndScaleDL = new DisplayListWriter(); +						indMtxAndScaleDL.LoadBPReg(0x25000000); +						indMtxAndScaleDL.LoadBPReg(0x26000000); +						indMtxAndScaleDL.AddPadding(54); +						indMtxAndScaleDL.End(); + +						currentMaterial.IndMtxAndScaleDL = indMtxAndScaleDL.GetBuffer(); + +						var texCoordGenDL = new DisplayListWriter(); +						texCoordGenDL.LoadXFReg(0x1040, new byte[] { 0x00, 0x00, 0x52, 0x80 }); +						texCoordGenDL.LoadXFReg(0x1050, new byte[] { 0x00, 0x00, 0x00, 0x00 }); +						texCoordGenDL.LoadXFReg(0x1041, new byte[] { 0x00, 0x00, 0x50, 0x86 }); +						texCoordGenDL.LoadXFReg(0x1051, new byte[] { 0x00, 0x00, 0x01, 0x03 }); +						texCoordGenDL.LoadXFReg(0x1042, new byte[] { 0x00, 0x00, 0x50, 0x86 }); +						texCoordGenDL.LoadXFReg(0x1052, new byte[] { 0x00, 0x00, 0x01, 0x06 }); +						texCoordGenDL.PadToSize(0xA0); +						texCoordGenDL.End(); + +						currentMaterial.TexCoordGenDL = texCoordGenDL.GetBuffer(); +					}  					CurrentModel.Materials.Add(parsed[1], currentMaterial); @@ -348,6 +427,26 @@ namespace NW4RTools {  					texInfo.MagFilt = 1;  					currentMaterial.TextureInfos.Add(texInfo); + +					// Now add the lm_01m and lm_02m +					var lm01m = new TextureInfo(); +					lm01m.TextureName = "lm_01m"; +					lm01m.TexMapID = 1; +					lm01m.TlutID = 1; +					 +					lm01m.MinFilt = 1; +					lm01m.MagFilt = 1; + +					var lm02m = new TextureInfo(); +					lm02m.TextureName = "lm_02m"; +					lm02m.TexMapID = 2; +					lm02m.TlutID = 2; + +					lm02m.MinFilt = 1; +					lm02m.MagFilt = 1; + +					currentMaterial.TextureInfos.Add(lm01m); +					currentMaterial.TextureInfos.Add(lm02m);  					break;
 @@ -373,12 +472,8 @@ namespace NW4RTools {  		private Shader CreateShader() {  			var shader = new Shader(); - -			shader.TevStageCount = 2; -			shader.Unk1 = 0x00FFFFFF; -			shader.Unk2 = 0xFFFFFFFF; -  			var dl = new DisplayListWriter(); +  			dl.LoadBPReg(0xFE00000F);  			dl.LoadBPReg(0xF6000004);  			dl.LoadBPReg(0xFE00000F); @@ -397,15 +492,47 @@ namespace NW4RTools {  			dl.LoadBPReg(0xFD00000E);  			dl.LoadBPReg(0x27FFFFFF);  			dl.AddPadding(11); -			dl.LoadBPReg(0xFEFFFFF0); -			dl.LoadBPReg(0xF6E338C0); -			dl.LoadBPReg(0x2803F040); -			dl.LoadBPReg(0xC008F8AF); -			dl.LoadBPReg(0xC208F20F); -			dl.LoadBPReg(0xC108F2F0); -			dl.LoadBPReg(0xC3081FF0); -			dl.LoadBPReg(0x10000000); -			dl.LoadBPReg(0x11000000); + +			if (!Lightmaps) { +				shader.TevStageCount = 2; +				shader.Unk1 = 0x00FFFFFF; +				shader.Unk2 = 0xFFFFFFFF; + +				dl.LoadBPReg(0xFEFFFFF0); +				dl.LoadBPReg(0xF6E338C0); +				dl.LoadBPReg(0x2803F040); +				dl.LoadBPReg(0xC008F8AF); +				dl.LoadBPReg(0xC208F20F); +				dl.LoadBPReg(0xC108F2F0); +				dl.LoadBPReg(0xC3081FF0); +				dl.LoadBPReg(0x10000000); +				dl.LoadBPReg(0x11000000); + +			} else { +				shader.TevStageCount = 3; +				shader.Unk1 = 0x000102FF; +				shader.Unk2 = 0xFFFFFFFF; + +				dl.LoadBPReg(0xFEFFFFF0); +				dl.LoadBPReg(0xF6E338C0); +				dl.LoadBPReg(0x283C0049); +				dl.LoadBPReg(0xC008F8AF); +				dl.LoadBPReg(0xC208F80F); +				dl.LoadBPReg(0xC108FFD0); +				dl.LoadBPReg(0xC308E270); +				dl.LoadBPReg(0x10000000); +				dl.LoadBPReg(0x11000000); +				dl.AddPadding(3); +				dl.LoadBPReg(0xFEFFFFF0); +				dl.LoadBPReg(0xF7003EF0); +				dl.LoadBPReg(0x293BF052); +				dl.LoadBPReg(0xC4080A8E); +				dl.AddPadding(5); +				dl.LoadBPReg(0xC508E370); +				dl.AddPadding(5); +				dl.LoadBPReg(0x12000000); +			} +  			dl.PadToSize(0x1E0);  			dl.End();  | 
