Esempio n. 1
0
        /// <summary>
        ///   Resolve output paramteter of this function
        /// </summary>
        /// <param name="semantic"> The desired parameter semantic </param>
        /// <param name="index"> The index of the desired parameter </param>
        /// <param name="content"> The Content of the parameter </param>
        /// <param name="type"> The type of the desired parameter </param>
        /// <returns> paramter instance in case of that resolve operation succeed </returns>
        /// <remarks>
        ///   Pass -1 as index paraemter to craete a new pareamter with the desired semantic and type
        /// </remarks>
        public Parameter ResolveOutputParameter(Parameter.SemanticType semantic, int index,
                                                Parameter.ContentType content,
                                                Graphics.GpuProgramParameters.GpuConstantType type)
        {
            Parameter param = null;

            //Check if desired parameter already defined
            param = Function.GetParameterByContent(this.outputParameters, content, type);
            if (param != null)
            {
                return(param);
            }

            //case we have to create new parameter.
            if (index == -1)
            {
                index = 0;

                //find the next availabe index of the target semantic
                for (int it = 0; it < this.outputParameters.Count; it++)
                {
                    if (this.outputParameters[it].Semantic == semantic)
                    {
                        index++;
                    }
                }
            }
            else
            {
                //check if desired parameter already defined
                param = GetParameterBySemantic(this.outputParameters, semantic, index);
                if (param != null && param.Content == content)
                {
                    if (param.Type == type)
                    {
                        return(param);
                    }
                    else
                    {
                        throw new AxiomException("Cannot resolve parameter - semantic: " + semantic.ToString() +
                                                 " - index: " + index.ToString() + " due to type mimatch. Function <" +
                                                 Name + ">");
                    }
                }
            }

            //No parameter found -> create new one
            switch (semantic)
            {
            case Parameter.SemanticType.Unknown:
                break;

            case Parameter.SemanticType.Position:
                param = ParameterFactory.CreateOutPosition(index);
                break;

            case Parameter.SemanticType.BlendWeights:
            case Parameter.SemanticType.BlendIndicies:
                throw new AxiomException("Can not resolve parameter - semantic: " + semantic.ToString() +
                                         " - index: " + index.ToString() +
                                         " since support init is not implemented yet. Function <" + Name + ">");

            case Parameter.SemanticType.Normal:
                param = ParameterFactory.CreateOutNormal(index);
                break;

            case Parameter.SemanticType.Color:
                param = ParameterFactory.CreateOutColor(index);
                break;

            case Parameter.SemanticType.TextureCoordinates:
                param = ParameterFactory.CreateOutTexcoord(type, index, content);
                break;

            case Parameter.SemanticType.Binormal:
                param = ParameterFactory.CreateOutBiNormal(index);
                break;

            case Parameter.SemanticType.Tangent:
                param = ParameterFactory.CreateOutTangent(index);
                break;

            default:
                break;
            }

            if (param != null)
            {
                AddOutputParameter(param);
            }

            return(param);
        }