private void _ScriptCodeを解析する(エフェクト effect, テクニック technique = null, パス pass = null) { 実行するファンクションのリスト = new List <関数>(); if (string.IsNullOrWhiteSpace(ScriptCode)) { return; } string[] splittedFunctions = ScriptCode.Split(';'); // ';' で分割し1命令ごとにする foreach (string function in splittedFunctions) { if (string.IsNullOrWhiteSpace(function)) { continue; } int 連番 = 0; // 省略時は 0 string[] segments = function.Split('='); // '=' で分割し、関数名と引数を分ける if (segments.Length > 2) { throw new InvalidMMEEffectShader例外("スクリプト中の'='の数が多すぎます。"); } char 関数名の末尾の文字 = segments[0][segments[0].Length - 1]; if (char.IsNumber(関数名の末尾の文字)) { segments[0] = segments[0].Remove(segments[0].Length - 1); 連番 = int.Parse(関数名の末尾の文字.ToString()); } if (現在対応しているファンクションの一覧.ContainsKey(segments[0])) { 実行するファンクションのリスト.Add( 現在対応しているファンクションの一覧[segments[0]].ファンクションインスタンスを作成する(連番, segments[1], this, effect, technique, pass) ); } } }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new LoopGetIndex関数(); func._targetVariable = effect.D3DEffect.GetVariableByName(value); func._runtime = runtime; return(func); }
public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { return(new ScriptExternal関数()); // TODO: 未実装 }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new ClearSetColor関数(); func._sourceVariable = effect.D3DEffect.GetVariableByName(value); if (func._sourceVariable == null) { throw new InvalidMMEEffectShader例外($"ClearSetColor={value};が指定されましたが、変数\"{value}\"は見つかりませんでした。"); } if (!func._sourceVariable.TypeInfo.Description.TypeName.ToLower().Equals("float4")) { throw new InvalidMMEEffectShader例外($"ClearSetColor={value};が指定されましたが、変数\"{value}\"はfloat4型ではありません。"); } return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new RenderColorTarget関数(); if (index < 0 || index > 7) { throw new InvalidMMEEffectShader例外("RenderColorTarget[n](0<=n<=7)のnの制約が満たされていません。"); } func._index = index; if (!string.IsNullOrWhiteSpace(value) && !effect.レンダーターゲットビューのマップ.ContainsKey(value)) { throw new InvalidMMEEffectShader例外("指定されたRENDERCOLORTARGETの変数は存在しません。"); } // 右辺が空白だったら、既定のターゲットを設定する。 if (string.IsNullOrWhiteSpace(value)) { func._既定のターゲットを使う = true; } func._renderTargetView = string.IsNullOrWhiteSpace(value) ? index == 0 ? RenderContext.Instance.描画ターゲットコンテキスト.D3Dレンダーターゲットビュー : null : effect.レンダーターゲットビューのマップ[value]; return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new RenderDepthStencilTarget関数(); if (index != 0) { throw new InvalidMMEEffectShader例外("RenderDepthStencilTargetにはインデックス値を指定できません。"); } if (!string.IsNullOrWhiteSpace(value) && !effect.深度ステンシルビューのマップ.ContainsKey(value)) { throw new InvalidMMEEffectShader例外("スクリプトに指定された名前の深度ステンシルバッファは存在しません。"); } // valueが空なら→デフォルトの深度ステンシルバッファ // valueがあるなら→その名前のテクスチャ変数から取得 if (string.IsNullOrWhiteSpace(value)) { func._既定のターゲットを使う = true; func._DepthStencilView = null; } else { func._既定のターゲットを使う = false; func._DepthStencilView = effect.深度ステンシルビューのマップ[value]; // 名前で検索 } return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new Clear関数(); switch (value) { case "Color": func._対象 = 対象.Color; break; case "Depth": func._対象 = 対象.Depth; break; default: throw new InvalidMMEEffectShader例外($"Clear={value}が指定されましたが、\"{value}\"は指定可能ではありません。\"Clear\"もしくは\"Depth\"が指定可能です。"); } func._index = index; return(func); }
public ScriptRuntime(string script, エフェクト effect, テクニック technique = null, パス pass = null) { ScriptCode = script; _ScriptCodeを解析する(effect, technique, pass); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new LoopEnd関数(); return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new Draw関数(); func._描画に使用するバス = pass ?? throw new InvalidMMEEffectShader例外("Drawはテクニックのスクリプトに関して適用できません。"); switch (value) { case "Geometry": func._描画するもの = 描画するもの.Geometry; break; case "Buffer": func._描画するもの = 描画するもの.Buffer; break; default: throw new InvalidMMEEffectShader例外($"Draw={value}が指定されましたが、Drawに指定できるのは\"Geometry\"または\"Buffer\"です。"); } if (func._描画するもの == 描画するもの.Geometry && effect.ScriptClass == ScriptClass.Scene) { throw new InvalidMMEEffectShader例外("Draw=Geometryが指定されましたが、STANDARDSGLOBALのScriptClassに\"scene\"を指定している場合、これはできません。"); } if (func._描画するもの == 描画するもの.Buffer && effect.ScriptClass == ScriptClass.Object) { throw new InvalidMMEEffectShader例外("Draw=Bufferが指定されましたが、STANDARDSGLOBALのScriptClassに\"object\"を指定している場合、これはできません。"); } return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public abstract 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass);
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new Pass関数(); if (technique == null) { throw new InvalidMMEEffectShader例外("スクリプト内でPassを利用できるのはテクニックに適用されたスクリプトのみです。パスのスクリプトでは実行できません。"); } // このメソッドの引数のパスは使わない。 if (!technique.パスリスト.ContainsKey(value)) { throw new InvalidMMEEffectShader例外($"スクリプトで指定されたテクニック中では指定されたパス\"{value}\"は見つかりませんでした。(スペルミス?)"); } func._実行対象のパス = technique.パスリスト[value]; return(func); }
/// <summary> /// 自身のインスタンスを作成して返す。 /// </summary> /// <param name="index">連番。ファンクション名の末尾に付与される1桁の数値(0~9)。省略時は 0 。</param> /// <param name="value">値。ファンクション名と '=' を挟んだ右辺に記された文字列。</param> /// <param name="runtime"></param> /// <param name="effect">ファンクションが属しているエフェクト。</param> /// <param name="technique">ファンクションが属しているテクニック。パスに属している場合には null を指定。</param> /// <param name="pass">ファンクションが属しているパス。テクニックに属している場合には null を指定。</param> /// <returns></returns> public override 関数 ファンクションインスタンスを作成する(int index, string value, ScriptRuntime runtime, エフェクト effect, テクニック technique, パス pass) { var func = new LoopByCount関数(); func._runtime = runtime; if (string.IsNullOrWhiteSpace(value)) { throw new InvalidMMEEffectShader例外("LoopByCount=;(空文字列)は指定できません。int,float,boolいずれかの変数名を伴う必要があります。"); } EffectVariable d3dVariable = effect.D3DEffect.GetVariableByName(value); string typeName = d3dVariable.TypeInfo.Description.TypeName.ToLower(); int loopCount = 0; switch (typeName) { case "bool": case "int": loopCount = d3dVariable.AsScalar().GetInt(); break; case "float": loopCount = (int)d3dVariable.AsScalar().GetFloat(); break; default: throw new InvalidMMEEffectShader例外("LoopByCountに指定できる変数の型はfloat,int,boolのいずれかです。"); } func._ループ回数 = loopCount; return(func); }