Exemple #1
0
        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 /* ... */ } {
        }
    }
Exemple #2
0
        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));
                }
            }
        }
Exemple #3
0
        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();
                }
            }
        }
Exemple #4
0
 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();
                }
            }
        }
Exemple #6
0
 /// <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();
 }