Beispiel #1
0
        public Value Method(MethodReference methodReference, Value[] parameters)
        {
            // built-in shader method
            var    methodInfo       = methodReference.GetMethodInfo();
            var    shaderAttributes = methodInfo.GetCustomAttributes <ShaderAttribute>();
            string pattern          = null;

            if (shaderAttributes.Any())
            {
                pattern = shaderAttributes.First().pattern;
            }
            var           md         = methodReference.Resolve();
            TypeReference returnType = md.ReturnType;

            if (md.IsConstructor)
            {
                var parameterPatterns = new List <string>();
                for (int i = 0; i < md.Parameters.Count; i++)
                {
                    parameterPatterns.Add(string.Format("{{{0}}}", i));
                }
                pattern    = Format("{0}({1})", md.DeclaringType, Join(", ", parameterPatterns));
                returnType = md.DeclaringType;
            }
            if (pattern != null)
            {
                return(new Value(returnType, Format(pattern, parameters)));
            }
            var callerDeclaringType = methodDefinition.DeclaringType;
            var calleeDeclaringType = methodReference.DeclaringType.Resolve();

            if (calleeDeclaringType.IsBaseOf(callerDeclaringType) || calleeDeclaringType == callerDeclaringType)
            {
                string methodName = Format("{0}_{1}", callerDeclaringType.Name, methodReference.Resolve().Name);
                methods[methodName] = methodReference.Resolve();
                return(new Value(typeof(void).GetTypeDefinition(), Format("{0}();", methodName)));
            }
            Debug.LogErrorFormat("Method \"{0}.{1}\" is not a built-in shader method.", methodInfo.DeclaringType.FullName, methodInfo.Name);
            return(null);
        }