Example #1
0
        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++;
        }
Example #2
0
        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;
        }
Example #3
0
        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);
        }
Example #4
0
        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
                }
            };
        }