public void AddTevStage(TevStageParameters parameters) { for (int i = 0; i < 16; i++) { if (TevStages[i] == null) { TevStages[i] = new TevStage(parameters); break; } if (i == 15) { throw new Exception($"TevStage array for material \"{ Name }\" is full!"); } } NumTevStagesCount++; }
public TevStage(TevStageParameters parameters) { ColorInA = parameters.ColorInA; ColorInB = parameters.ColorInB; ColorInC = parameters.ColorInC; ColorInD = parameters.ColorInD; ColorOp = parameters.ColorOp; ColorBias = parameters.ColorBias; ColorScale = parameters.ColorScale; ColorClamp = parameters.ColorClamp; ColorRegId = parameters.ColorRegId; AlphaInA = parameters.AlphaInA; AlphaInB = parameters.AlphaInB; AlphaInC = parameters.AlphaInC; AlphaInD = parameters.AlphaInD; AlphaOp = parameters.AlphaOp; AlphaBias = parameters.AlphaBias; AlphaScale = parameters.AlphaScale; AlphaClamp = parameters.AlphaClamp; AlphaRegId = parameters.AlphaRegId; }
public void SetUpTev(bool hasTexture, bool hasVtxColor, int texIndex) { // Set up channel control 0 to use vertex colors, if they're present if (hasVtxColor) { AddChannelControl(J3DColorChannelId.Color0, false, ColorSrc.Vertex, LightId.None, DiffuseFn.None, J3DAttenuationFn.None_0, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Alpha0, false, ColorSrc.Vertex, LightId.None, DiffuseFn.None, J3DAttenuationFn.None_0, ColorSrc.Register); } // These settings are common to all the configurations we can use TevStageParameters stageParams = new TevStageParameters { ColorInD = CombineColorInput.Zero, ColorOp = TevOp.Add, ColorBias = TevBias.Zero, ColorScale = TevScale.Scale_1, ColorClamp = true, ColorRegId = TevRegisterId.TevPrev, AlphaInD = CombineAlphaInput.Zero, AlphaOp = TevOp.Add, AlphaBias = TevBias.Zero, AlphaScale = TevScale.Scale_1, AlphaClamp = true, AlphaRegId = TevRegisterId.TevPrev }; if (hasTexture) { // Generate texture stuff AddTexGen(TexGenType.Matrix2x4, TexGenSrc.Tex0, Enums.TexMatrix.Identity); AddTexMatrix(TexGenType.Matrix3x4, 0, OpenTK.Vector3.Zero, OpenTK.Vector2.One, 0, OpenTK.Vector2.Zero, OpenTK.Matrix4.Identity); AddTevOrder(TexCoordId.TexCoord0, TexMapId.TexMap0, GXColorChannelId.ColorNull); AddTexIndex(texIndex); // Texture + Vertex Color if (hasVtxColor) { stageParams.ColorInA = CombineColorInput.Zero; stageParams.ColorInB = CombineColorInput.RasColor; stageParams.ColorInC = CombineColorInput.TexColor; stageParams.AlphaInA = CombineAlphaInput.Zero; stageParams.AlphaInB = CombineAlphaInput.RasAlpha; stageParams.AlphaInC = CombineAlphaInput.TexAlpha; } // Texture alone else { stageParams.ColorInA = CombineColorInput.TexColor; stageParams.ColorInB = CombineColorInput.Zero; stageParams.ColorInC = CombineColorInput.Zero; stageParams.AlphaInA = CombineAlphaInput.TexAlpha; stageParams.AlphaInB = CombineAlphaInput.Zero; stageParams.AlphaInC = CombineAlphaInput.Zero; } } // No texture! else { // No vertex colors either, so make sure there's a material color (white) to use instead if (!hasVtxColor) { MaterialColors[0] = new Color(1, 1, 1, 1); AddChannelControl(J3DColorChannelId.Color0, false, ColorSrc.Register, LightId.None, DiffuseFn.None, J3DAttenuationFn.None_0, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Alpha0, false, ColorSrc.Register, LightId.None, DiffuseFn.None, J3DAttenuationFn.None_0, ColorSrc.Register); } // Set up TEV to use the material color we just set stageParams.ColorInA = CombineColorInput.RasColor; stageParams.ColorInB = CombineColorInput.Zero; stageParams.ColorInC = CombineColorInput.Zero; stageParams.AlphaInA = CombineAlphaInput.RasAlpha; stageParams.AlphaInB = CombineAlphaInput.Zero; stageParams.AlphaInC = CombineAlphaInput.Zero; } AddTevStage(stageParams); }
public void SetUpTevForMaps(bool hasTexture, bool hasVtxColor, int texIndex, string texName, float opacity) { // We need both vertex colors and textures to do map lighting. if (!hasVtxColor || !hasTexture) { SetUpTev(hasTexture, hasVtxColor, texIndex, texName); return; } bool IsTranslucent = opacity < 1.0f; Flag = 1; if (IsTranslucent) { Flag = 4; } ChannelControls[0] = null; AddChannelControl(J3DColorChannelId.Color0, false, ColorSrc.Vertex, LightId.None, DiffuseFn.Clamp, J3DAttenuationFn.Spec, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Alpha0, false, ColorSrc.Vertex, LightId.None, DiffuseFn.Clamp, J3DAttenuationFn.Spec, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Color1, true, ColorSrc.Register, LightId.None, DiffuseFn.Signed, J3DAttenuationFn.None_0, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Alpha1, false, ColorSrc.Register, LightId.None, DiffuseFn.Clamp, J3DAttenuationFn.None_2, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Color1, true, ColorSrc.Register, LightId.None, DiffuseFn.Signed, J3DAttenuationFn.None_0, ColorSrc.Register); AddChannelControl(J3DColorChannelId.Alpha1, false, ColorSrc.Register, LightId.None, DiffuseFn.Clamp, J3DAttenuationFn.None_2, ColorSrc.Register); ColorChannelControlsCount = 1; TevStageParameters first_stage = new TevStageParameters { ColorInA = CombineColorInput.C0, ColorInB = CombineColorInput.Konst, ColorInC = CombineColorInput.RasColor, ColorInD = CombineColorInput.Zero, ColorOp = TevOp.Add, ColorBias = TevBias.Zero, ColorScale = TevScale.Scale_1, ColorClamp = true, ColorRegId = TevRegisterId.TevPrev, AlphaInA = CombineAlphaInput.Zero, AlphaInB = CombineAlphaInput.TexAlpha, AlphaInC = CombineAlphaInput.RasAlpha, AlphaInD = CombineAlphaInput.Zero, AlphaOp = TevOp.Add, AlphaBias = TevBias.Zero, AlphaScale = TevScale.Scale_1, AlphaClamp = true, AlphaRegId = TevRegisterId.TevPrev, }; TevStageParameters second_stage = new TevStageParameters { ColorInA = CombineColorInput.Zero, ColorInB = CombineColorInput.TexColor, ColorInC = CombineColorInput.ColorPrev, ColorInD = CombineColorInput.Zero, ColorOp = TevOp.Add, ColorBias = TevBias.Zero, ColorScale = TevScale.Scale_1, ColorClamp = true, ColorRegId = TevRegisterId.TevPrev, AlphaInA = CombineAlphaInput.Zero, AlphaInB = CombineAlphaInput.Konst, AlphaInC = CombineAlphaInput.AlphaPrev, AlphaInD = CombineAlphaInput.Zero, AlphaOp = TevOp.Add, AlphaBias = TevBias.Zero, AlphaScale = TevScale.Scale_1, AlphaClamp = true, AlphaRegId = TevRegisterId.TevPrev, }; TevStageParameters third_stage = new TevStageParameters { ColorInA = CombineColorInput.Zero, ColorInB = CombineColorInput.Zero, ColorInC = CombineColorInput.Zero, ColorInD = CombineColorInput.ColorPrev, ColorOp = TevOp.Add, ColorBias = TevBias.Zero, ColorScale = TevScale.Scale_1, ColorClamp = true, ColorRegId = TevRegisterId.TevPrev, AlphaInA = CombineAlphaInput.Zero, AlphaInB = CombineAlphaInput.Konst, AlphaInC = CombineAlphaInput.AlphaPrev, AlphaInD = CombineAlphaInput.Zero, AlphaOp = TevOp.Add, AlphaBias = TevBias.Zero, AlphaScale = TevScale.Scale_1, AlphaClamp = true, AlphaRegId = TevRegisterId.TevPrev, }; AddTevStage(first_stage); AddTevStage(second_stage); AddTevStage(third_stage); TevOrders[0] = null; AddTevOrder(TexCoordId.TexCoord0, TexMapId.TexMap0, GXColorChannelId.Color0A0); AddTevOrder(TexCoordId.TexCoord0, TexMapId.TexMap0, GXColorChannelId.ColorNull); AddTevOrder(TexCoordId.TexCoord0, TexMapId.TexMap0, GXColorChannelId.ColorNull); AddTexGen(TexGenType.Matrix2x4, TexGenSrc.Tex0, Enums.TexMatrix.Identity); AddTexMatrix(TexGenType.Matrix2x4, 0, new Vector3(0.5f, 0.5f, 0.5f), OpenTK.Vector2.One, 0, OpenTK.Vector2.Zero, OpenTK.Matrix4.Identity); AddTexIndex(texIndex); TextureNames[0] = texName; SwapModes[0] = new TevSwapMode(0, 0); SwapModes[1] = new TevSwapMode(0, 0); SwapModes[2] = new TevSwapMode(0, 0); SwapTables[0] = new TevSwapModeTable(0, 1, 2, 3); SwapTables[1] = new TevSwapModeTable(0, 1, 2, 3); SwapTables[2] = new TevSwapModeTable(0, 1, 2, 3); ColorSels[0] = KonstColorSel.KCSel_K0; ColorSels[1] = KonstColorSel.KCSel_K0; ColorSels[2] = KonstColorSel.KCSel_K0; AlphaSels[0] = KonstAlphaSel.KASel_K0_A; AlphaSels[1] = KonstAlphaSel.KASel_K3_A; AlphaSels[2] = KonstAlphaSel.KASel_K2_A; TevColors[0] = new Color(0, 0, 0, 1); TevColors[1] = new Color(1, 1, 1, 1); TevColors[2] = new Color(1, 1, 1, 1); TevColors[3] = new Color(0, 0, 0, 0); KonstColors[0] = new Color(1, 1, 1, 1); KonstColors[1] = new Color(1, 1, 1, 1); KonstColors[2] = new Color(1, 1, 1, opacity); KonstColors[3] = new Color(1, 1, 1, 1); MaterialColors[0] = new Color(0.8f, 0.8f, 0.8f, 1.0f); MaterialColors[1] = new Color(0.8f, 0.8f, 0.8f, 1.0f); AmbientColors[0] = new Color(0.196078435f, 0.196078435f, 0.196078435f, 0.196078435f); AmbientColors[1] = new Color(0, 0, 0, 0); ZMode = new ZMode(true, CompareType.LEqual, !IsTranslucent); if (IsTranslucent) { BMode = new BlendMode(Enums.BlendMode.Blend, BlendModeControl.SrcAlpha, BlendModeControl.InverseSrcAlpha, LogicOp.Copy); AlphCompare = new AlphaCompare(CompareType.Always, 0, AlphaOp.Or, CompareType.Always, 0); } else { BMode = new BlendMode(Enums.BlendMode.Blend, BlendModeControl.SrcAlpha, BlendModeControl.InverseSrcAlpha, LogicOp.NoOp); AlphCompare = new AlphaCompare(CompareType.GEqual, 128, AlphaOp.And, CompareType.LEqual, 255); } CullMode = CullMode.Back; ZCompLoc = false; Dither = true; FogInfo = new Fog() { Type = 2, Enable = false, Center = 320, StartZ = 10000.0f, EndZ = 20000.0f, NearZ = 5.0f, FarZ = 50000.0f, Color = new Color(1, 1, 1, 1), RangeAdjustmentTable = new float[] { 1.0f, 1.00390625f, 1.01171875f, 1.0234375f, 1.03515625f, 1.05078125f, 1.0703125f, 1.08984375f, 1.11328125f, 1.140625f } }; }