示例#1
0
        public override void Initialize(ICompiler compiler, IBundle bundle)
        {
            base.Initialize(compiler, bundle);
            Scheduler.AddGenerator(new GLGenerator(this, bundle));
            GlslIntrinsicAttribute = ILFactory.GetType("Uno.Compiler.ExportTargetInterop.GlslIntrinsicAttribute");

            // GLSL types
            Types.Add(DataType.Void, "void");
            Types.Add(Essentials.Bool, "bool");
            Types.Add(Essentials.Byte, "float");   // No byte in GLES
            Types.Add(Essentials.Double, "float"); // No double in GLES
            Types.Add(Essentials.Int, "int");
            Types.Add(Essentials.Int2, "ivec2");
            Types.Add(Essentials.Int3, "ivec3");
            Types.Add(Essentials.Int4, "ivec4");
            Types.Add(Essentials.UInt, "uint");
            Types.Add(Essentials.Float, "float");
            Types.Add(Essentials.Float2, "vec2");
            Types.Add(Essentials.Float3, "vec3");
            Types.Add(Essentials.Float4, "vec4");
            Types.Add(Essentials.Float2x2, "mat2");
            Types.Add(Essentials.Float3x3, "mat3");
            Types.Add(Essentials.Float4x4, "mat4");
            Types.Add(Essentials.Sampler2D, "sampler2D");
            Types.Add(Essentials.SamplerCube, "samplerCube");
            Types.Add(Essentials.VideoSampler,
                      Environment.IsDefined("ANDROID")
                    ? "samplerExternalOES"
                    : "sampler2D");

            // GLSL functions
            AddFunction("float4x4.get_Item(int)");
            AddFunction("float4x4.set_Item(int,float4)");
            AddFunction("float3x3.get_Item(int)");
            AddFunction("float3x3.set_Item(int,float3)");
            AddFunction("float2x2.get_Item(int)");
            AddFunction("float2x2.set_Item(int,float2)");

            AddFunction("Uno.Matrix.Mul(float2x2,float2x2)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Matrix.Mul(float3x3,float3x3)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Matrix.Mul(float4x4,float4x4)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Vector.TransformNormal(float3,float4x4)",
                        (w, obj, args, p) =>
            {
                w.Write("(");
                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.Write("vec4(");
                w.WriteExpression(args[0]);
                w.Write("," + w.Space + "0.)).xyz");
            });

            AddFunction("Uno.Vector.Transform(float4,float4x4)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Vector.Transform(float3,float4x4)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.Write("vec4(");
                w.WriteExpression(args[0]);
                w.Write("," + w.Space + "1.)");

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Vector.Transform(float2,float4x4)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.Write("vec4(");
                w.WriteExpression(args[0]);
                w.Write("," + w.Space + "0.");
                w.Write("," + w.Space + "1.)");

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Vector.TransformAffine(float3,float4x4)",
                        (w, obj, args, p) =>
            {
                w.Write("(");
                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.Write("vec4(");
                w.WriteExpression(args[0]);
                w.Write("," + w.Space + "1.)).xyz");
            });

            AddFunction("Uno.Vector.Transform(float3,float3x3)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Vector.Transform(float2,float2x2)",
                        (w, obj, args, p) =>
            {
                if (p >= ExpressionUsage.Operand)
                {
                    w.Write("(");
                }

                w.WriteExpression(args[1], ExpressionUsage.Operand);
                w.Write(w.Space + "*" + w.Space);
                w.WriteExpression(args[0], ExpressionUsage.Operand);

                if (p >= ExpressionUsage.Operand)
                {
                    w.Write(")");
                }
            });

            AddFunction("Uno.Graphics.Sampler2D.Sample(float2)",
                        (w, obj, args, p) =>
            {
                w.Write("texture2D(");
                w.WriteExpression(obj);
                w.Write(w.Comma);
                w.WriteExpression(args[0]);
                w.Write(")");
            });

            AddFunction("Uno.Graphics.SamplerCube.Sample(float3)",
                        (w, obj, args, p) =>
            {
                w.Write("textureCube(");
                w.WriteExpression(obj);
                w.Write(w.Comma);
                w.WriteExpression(args[0]);
                w.Write(")");
            });

            AddFunction("Uno.Graphics.VideoSampler.Sample(float2)",
                        (w, obj, args, p) =>
            {
                w.Write("texture2D(");
                w.WriteExpression(obj);
                w.Write(w.Comma);
                w.WriteExpression(args[0]);
                w.Write(")");
            });
        }