public void SetParameter(string varName, object varValue) { EffectVariable ev = DXEffect.GetVariableByName(varName); if (ev.IsValid) { if (varValue is bool) { ev.AsScalar().Set((bool)varValue); } else if (varValue is int) { ev.AsScalar().Set((int)varValue); } else if (varValue is uint) { ev.AsScalar().Set((uint)varValue); } else if (varValue is float) { ev.AsScalar().Set((float)varValue); } else if (varValue is double) { ev.AsScalar().Set((float)(double)varValue); } else if (varValue is Vector2) { ev.AsVector().Set((Vector2)varValue); } else if (varValue is Vector3) { ev.AsVector().Set((Vector3)varValue); } else if (varValue is Vector4[]) { ev.AsVector().Set((Vector4[])varValue); } else if (varValue is Vector4) { ev.AsVector().Set((Vector4)varValue); } else if (varValue is Matrix) { ev.AsMatrix().SetMatrix((Matrix)varValue); } //else if (varValue is DXTexture2DClass) ev.AsShaderResource().SetResource((varValue as DXTexture2DClass).TextureResourceView); else if (varValue is ShaderResourceView) { ev.AsShaderResource().SetResource(varValue as ShaderResourceView); } else if (varValue == null) { ev.AsShaderResource().SetResource(null); } else /* ... */ } { } }
public static void UpdateCommonEffectVars(Shader effect, Matrix world) { if (effect == null) { return; } Dictionary <string, EffectVariable> vars = effect.Vars; if (vars == null) { return; } foreach (KeyValuePair <string, EffectVariable> pair in vars) { EffectVariable v = pair.Value; if (pair.Key == ViewMatrix) { v.AsMatrix().SetMatrix(Camera.ViewMatrix); } else if (pair.Key == ProjectionMatrix) { v.AsMatrix().SetMatrix(Camera.ProjectionMatrix); } else if (pair.Key == WorldMatrix) { v.AsMatrix().SetMatrix(world); } else if (pair.Key == WVP) { v.AsMatrix().SetMatrix(world * Camera.ViewMatrix * Camera.ProjectionMatrix); } else if (pair.Key == WorldView) { v.AsMatrix().SetMatrix(world * Camera.ViewMatrix); } else if (pair.Key == ViewProj) { v.AsMatrix().SetMatrix(Camera.ProjectionMatrix * Camera.ViewMatrix); } else if (pair.Key == CameraPosition) { v.AsVector().Set(new Vector4(Camera.Position, 1)); } } }
public override void 数を更新する(EffectVariable 数, 数更新時引数 引数) { var currentModel = RenderContext.Instance.描画ターゲットコンテキスト.ワールド空間.Drawableを取得する(_name); if (currentModel == null) { return; } IDrawable targetDrawable = (_isSelf) ? 引数.モデル : currentModel; if (_target == TargetObject.UnUsed) { switch (_variableType) { case 数型.Float4x4: 数.AsMatrix().SetMatrix(RenderContext.Instance.行列管理.ワールド行列管理.モデルのワールド変換行列を作成して返す(targetDrawable)); break; case 数型.Float3: 数.AsVector().Set(targetDrawable.モデル状態.位置); break; case 数型.Float4: 数.AsVector().Set(new Vector4(targetDrawable.モデル状態.位置, 1f)); break; case 数型.Float: 数.AsScalar().Set(targetDrawable.モデル状態.率.Length()); break; case 数型.Bool: 数.AsScalar().Set(targetDrawable.表示中); break; default: break; } } else if (_target == TargetObject.BoneName) { IEnumerable <PMXボーン> targetBone = (from bone in ((PMXModel)targetDrawable).スキニング.ボーン配列 where bone.ボーン名 == _itemName select bone); foreach (var bone in targetBone) { Matrix mat = bone.モデルポーズ行列 * RenderContext.Instance.行列管理.ワールド行列管理.モデルのワールド変換行列を作成して返す(targetDrawable); switch (_variableType) { case 数型.Float4x4: 数.AsMatrix().SetMatrix(mat); break; case 数型.Float3: 数.AsVector().Set(Vector3.TransformCoordinate(bone.ローカル位置, mat)); break; case 数型.Float4: 数.AsVector().Set(new Vector4(Vector3.TransformCoordinate(bone.ローカル位置, mat), 1f)); break; default: break; } break; } } else if (_target == TargetObject.FaceName) { モーフ管理 morphManager = ((PMXModel)targetDrawable).モーフ管理; 数.AsScalar().Set(morphManager.モーフの進捗率を返す(_name)); } else { switch (_target) { case TargetObject.X: 数.AsScalar().Set(targetDrawable.モデル状態.位置.X); break; case TargetObject.Y: 数.AsScalar().Set(targetDrawable.モデル状態.位置.Y); break; case TargetObject.Z: 数.AsScalar().Set(targetDrawable.モデル状態.位置.Z); break; case TargetObject.XYZ: 数.AsVector().Set(targetDrawable.モデル状態.位置); break; case TargetObject.Rx: case TargetObject.Ry: case TargetObject.Rz: case TargetObject.Rxyz: float xRotation, yRotation, zRotation; //X,Y,Z軸回転量に変換する。 //int type = 0; //分解パターン if (!CGHelper.クォータニオンをXYZ回転に分解する(targetDrawable.モデル状態.回転, out xRotation, out yRotation, out zRotation)) { if (!CGHelper.クォータニオンをYZX回転に分解する(targetDrawable.モデル状態.回転, out yRotation, out zRotation, out xRotation)) { CGHelper.クォータニオンをZXY回転に分解する(targetDrawable.モデル状態.回転, out zRotation, out xRotation, out yRotation); // type = 2; } else { // type = 1; } } else { // type = 0; } if (_target == TargetObject.Rx) { 数.AsScalar().Set(xRotation); } else if (_target == TargetObject.Ry) { 数.AsScalar().Set(yRotation); } else if (_target == TargetObject.Rz) { 数.AsScalar().Set(zRotation); } else { 数.AsVector().Set(new Vector3(xRotation, yRotation, zRotation)); } break; case TargetObject.Si: 数.AsScalar().Set(targetDrawable.モデル状態.率.Length()); break; case TargetObject.Tr: // TODO: Trへの対応 break; default: throw new ArgumentOutOfRangeException(); } } }
public static void Set(this EffectVariable var, Matrix[] value) { var.AsMatrix().SetMatrixArray(value); }
public override void Subscribe(EffectVariable subscribeTo, SubscribeArgument variable) { var currentModel = variable.Context.CurrentTargetContext.WorldSpace.getDrawableByFileName(name); if (currentModel == null) { return; } IDrawable targetDrawable = isSelf ? variable.Model : currentModel; if (target == TargetObject.UnUsed) { switch (variableType) { case VariableType.Float4x4: subscribeTo.AsMatrix().SetMatrix(variable.Context.MatrixManager.WorldMatrixManager.getWorldMatrix(targetDrawable)); break; case VariableType.Float3: subscribeTo.AsVector().Set(targetDrawable.Transformer.Position); break; case VariableType.Float4: subscribeTo.AsVector().Set(new Vector4(targetDrawable.Transformer.Position, 1f)); break; case VariableType.Float: subscribeTo.AsScalar().Set(targetDrawable.Transformer.Scale.Length()); break; case VariableType.Bool: subscribeTo.AsScalar().Set(targetDrawable.Visibility); break; default: break; } } else if (target == TargetObject.BoneName) { IEnumerable <PMXBone> targetBone = (from bone in ((PMXModel)targetDrawable).Skinning.Bone where bone.BoneName == itemName select bone); foreach (var bone in targetBone) { Matrix mat = bone.GlobalPose * variable.Context.MatrixManager.WorldMatrixManager.getWorldMatrix(targetDrawable); switch (variableType) { case VariableType.Float4x4: subscribeTo.AsMatrix().SetMatrix(mat); break; case VariableType.Float3: subscribeTo.AsVector().Set(Vector3.TransformCoordinate(bone.Position, mat)); break; case VariableType.Float4: subscribeTo.AsVector().Set(new Vector4(Vector3.TransformCoordinate(bone.Position, mat), 1f)); break; default: break; } break; } } else if (target == TargetObject.FaceName) { IMorphManager morphManager = ((PMXModel)targetDrawable).Morphmanager; subscribeTo.AsScalar().Set(morphManager.getMorphProgress(name)); } else { switch (target) { case TargetObject.X: subscribeTo.AsScalar().Set(targetDrawable.Transformer.Position.X); break; case TargetObject.Y: subscribeTo.AsScalar().Set(targetDrawable.Transformer.Position.Y); break; case TargetObject.Z: subscribeTo.AsScalar().Set(targetDrawable.Transformer.Position.Z); break; case TargetObject.XYZ: subscribeTo.AsVector().Set(targetDrawable.Transformer.Position); break; case TargetObject.Rx: case TargetObject.Ry: case TargetObject.Rz: case TargetObject.Rxyz: float xRotation, yRotation, zRotation; //X,Y,Z軸回転量に変換する。 int type = 0; //分解パターン if ( !CGHelper.FactoringQuaternionXYZ(targetDrawable.Transformer.Rotation, out xRotation, out yRotation, out zRotation)) { if ( !CGHelper.FactoringQuaternionYZX(targetDrawable.Transformer.Rotation, out yRotation, out zRotation, out xRotation)) { CGHelper.FactoringQuaternionZXY(targetDrawable.Transformer.Rotation, out zRotation, out xRotation, out yRotation); type = 2; } else { type = 1; } } else { type = 0; } if (target == TargetObject.Rx) { subscribeTo.AsScalar().Set(xRotation); } else if (target == TargetObject.Ry) { subscribeTo.AsScalar().Set(yRotation); } else if (target == TargetObject.Rz) { subscribeTo.AsScalar().Set(zRotation); } else { subscribeTo.AsVector().Set(new Vector3(xRotation, yRotation, zRotation)); } break; case TargetObject.Si: subscribeTo.AsScalar().Set(targetDrawable.Transformer.Scale.Length()); break; case TargetObject.Tr: //TODO Trへの対応 break; default: throw new ArgumentOutOfRangeException(); } } }
/// <summary> /// To register as the matrix effect /// </summary> /// <param name="matrix">To register the matrix</param> /// <param name="effect">Effects</param> /// <param name="index">Index of the variable</param> protected void SetAsMatrix(Matrix matrix, EffectVariable variable) { variable.AsMatrix().SetMatrix(matrix); }
protected void 行列を登録する(Matrix 行列, EffectVariable 数) { 数.AsMatrix().SetMatrix(行列); }
public EffectOnlyMatrixArrayVariable(EffectVariable v) { _v = v.AsMatrix(); }