Ejemplo n.º 1
0
        /// <summary>
        ///     指定したテクニックの指定したアノテーションを文字列で取得します
        /// </summary>
        /// <param name="technique">テクニック</param>
        /// <param name="attrName">アノテーション名</param>
        /// <returns>値</returns>
        public string getAnnotationString(EffectTechnique technique, string attrName)
        {
            EffectVariable annotationVariable = EffectParseHelper.アノテーションを取得する(technique, attrName);

            if (annotationVariable == null)
            {
                return("");
            }

            return(annotationVariable.AsString().GetString());
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     指定したテクニックの指定したアノテーションをBool値で取得します
        /// </summary>
        /// <param name="technique">テクニック</param>
        /// <param name="attrName">アノテーション名</param>
        /// <returns>値</returns>
        public 状態Boolean getAnnotationBoolean(EffectTechnique technique, string attrName)
        {
            EffectVariable annotationVariable = EffectParseHelper.アノテーションを取得する(technique, attrName);

            if (annotationVariable == null)
            {
                return(状態Boolean.無視);
            }

            int annotation = annotationVariable.AsScalar().GetInt();

            if (annotation == 1)
            {
                return(状態Boolean.効);
            }

            return(状態Boolean.無効);
        }
Ejemplo n.º 3
0
        public パス(エフェクト effect, EffectPass d3dPass)
        {
            D3DPass = d3dPass;

            EffectVariable commandAnnotation = EffectParseHelper.アノテーションを取得する(d3dPass, "Script", "string");

            Command = (commandAnnotation == null) ? "" : commandAnnotation.AsString().GetString();

            if (!d3dPass.VertexShaderDescription.Variable.IsValid)
            {
                //TODO この場合標準シェーダーの頂点シェーダを利用する
            }

            if (!d3dPass.PixelShaderDescription.Variable.IsValid)
            {
                //TODO この場合標準シェーダーのピクセルシェーダを利用する
            }

            ScriptRuntime = new ScriptRuntime(Command, effect, null, this);
        }
Ejemplo n.º 4
0
        /// <summary>
        ///     コンストラクタ
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="D3DEffectTechnique"></param>
        /// <param name="subsetCount"></param>
        public テクニック(エフェクト effect, EffectTechnique d3dEffectTechnique, int subsetCount)
        {
            D3DEffectTechnique = d3dEffectTechnique;

            描画するサブセットIDの集合 = new HashSet <int>();

            パスリスト = new Dictionary <string, パス>();

            if (!D3DEffectTechnique.IsValid)
            {
                throw new InvalidMMEEffectShader例外(string.Format("テクニック「{0}」の検証に失敗しました。", D3DEffectTechnique.Description.Name));
            }


            // MMDPass アノテーション

            string mmdpass = getAnnotationString(D3DEffectTechnique, "MMDPass");

            if (String.IsNullOrWhiteSpace(mmdpass))
            {
                テクニックを適用する描画対象 = MMDPass種別.オブジェクト本体;
            }
            else
            {
                mmdpass = mmdpass.ToLower();
                switch (mmdpass)
                {
                case "object":
                    テクニックを適用する描画対象 = MMDPass種別.オブジェクト本体;
                    break;

                case "object_ss":
                    テクニックを適用する描画対象 = MMDPass種別.オブジェクト本体_セルフ影あり;
                    break;

                case "zplot":
                    テクニックを適用する描画対象 = MMDPass種別.セルフ影用Z値プロット;
                    break;

                case "shadow":
                    テクニックを適用する描画対象 = MMDPass種別.影;
                    break;

                case "edge":
                    テクニックを適用する描画対象 = MMDPass種別.エッジ;
                    break;

                case "skinning":
                    テクニックを適用する描画対象 = MMDPass種別.スキニング;
                    break;

                case "scene":
                    テクニックを適用する描画対象 = MMDPass種別.シーン;
                    break;

                default:
                    throw new InvalidOperationException("予期しない識別子");
                }
            }


            // その他アノテーション

            テクスチャを使用する = getAnnotationBoolean(D3DEffectTechnique, "UseTexture");

            スフィアマップを使用する = getAnnotationBoolean(D3DEffectTechnique, "UseSphereMap");

            トゥーンレンダリングを使用する = getAnnotationBoolean(D3DEffectTechnique, "UseToon");

            セルフ影を使用する = getAnnotationBoolean(D3DEffectTechnique, "UseSelfShadow");

            乗算スフィアを使用する = getAnnotationBoolean(D3DEffectTechnique, "MulSphere");


            // Subset アノテーション

            GetSubsets(D3DEffectTechnique, subsetCount);


            // Script アノテーション

            EffectVariable rawScript = EffectParseHelper.アノテーションを取得する(D3DEffectTechnique, "Script");

            for (int i = 0; i < D3DEffectTechnique.Description.PassCount; i++)
            {
                EffectPass pass = D3DEffectTechnique.GetPassByIndex(i);
                パスリスト.Add(pass.Description.Name, new パス(effect, pass));
            }


            // Scriptランタイムの生成

            if (rawScript != null)
            {
                ScriptRuntime = new ScriptRuntime(rawScript.AsString().GetString(), effect, this);     // Script アノテーションがあれば登録する
            }
            else
            {
                ScriptRuntime = new ScriptRuntime("", effect, this);
            }
        }