public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            var 更新内容 = new 定数バッファレイアウト {
                AmbientLight  = 引数.材質.環境色,
                DiffuseLight  = 引数.材質.拡散色,
                SpecularLight = 引数.材質.反射色,
                SpecularPower = 引数.材質.反射係数
            };

            _定数バッファ管理.定数バッファを使って変数を更新する(更新内容);
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case Object種別.カメラ:
                行列を登録する(RenderContext.Instance.行列管理.ワールド行列管理.モデルのワールド変換行列を作成して返す(引数.モデル), 数);
                break;

            case Object種別.ライト:      // TODO: 未実装
                break;
            }
        }
Exemple #3
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case ターゲット種別.ジオメトリ:
                エフェクト変数にベクトルを設定する(引数.材質.トゥーン色, 数, Vector3である);
                break;

            case ターゲット種別.ライト:
                break;      // 対応しない。
            }
        }
Exemple #4
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case ターゲット種別.ジオメトリ:
                エフェクト変数にスカラを設定する(引数.材質.反射係数, 数);
                break;

            case ターゲット種別.ライト:
                break;      // 対応しない。
            }
        }
Exemple #5
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case ターゲット種別.ジオメトリ:
                エフェクト変数にベクトルを設定する(new Vector4(引数.材質.拡散色.X, 引数.材質.拡散色.Y, 引数.材質.拡散色.Z, 0), 数, Vector3である);
                break;

            case ターゲット種別.ライト:
                break;          // TODO: 未実装?
            }
        }
Exemple #6
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case ターゲット種別.ジオメトリ:
                エフェクト変数にベクトルを設定する(引数.材質.反射色, 数, Vector3である);
                break;

            case ターゲット種別.ライト:           // TODO: 未実装?
                break;
            }
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case Object種別.カメラ:
                行列を登録する(RenderContext.Instance.行列管理.射影行列管理.射影行列, 数);
                break;

            case Object種別.ライト:
                break;          // TODO: 未実装
            }
        }
Exemple #8
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            if (!_isCached)
            {
                _modelCache = 引数.モデル as PMXModel;
                _isCached   = true;
            }

            if (_modelCache != null)
            {
                数を更新する(数, _modelCache.モーション管理);
            }
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case Object種別.カメラ:
                行列を登録する(
                    Matrix.Transpose(RenderContext.Instance.行列管理.ワールドビュー射影行列を作成する(引数.モデル)),
                    数);
                break;

            case Object種別.ライト:
                break;      // TODO: 未実装
            }
        }
Exemple #10
0
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            switch (ターゲットオブジェクト)
            {
            case Object種別.カメラ:
                行列を登録する(
                    Matrix.Transpose(
                        RenderContext.Instance.行列管理.ビュー行列管理.ビュー行列), 数);
                break;

            case Object種別.ライト:
                行列を登録する(
                    Matrix.Transpose(
                        RenderContext.Instance.照明行列管理.ビュー行列管理.ビュー行列), 数);
                break;
            }
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            // 変数には、登録値に関係なく、現在の RenderContext の内容を反映する。

            switch (Object)
            {
            case Object種別.カメラ:
                数.AsVector().Set(RenderContext.Instance.行列管理.ビュー行列管理.カメラの位置);
                break;

            case Object種別.ライト:
                数.AsVector().Set(RenderContext.Instance.照明行列管理.照明の位置);
                break;

            default:
                throw new System.NotSupportedException();
            }
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            var layout = new FULLMATERIALCONSTANT変数用の定数バッファレイアウト {
                AmbientColor             = 引数.材質.環境色,
                DiffuseColor             = 引数.材質.拡散色,
                SpecularColor            = 引数.材質.反射色,
                SpecularPower            = 引数.材質.反射係数,
                AddingSphereTexture      = 引数.材質.スフィア加算値,
                AddingTexture            = 引数.材質.テクスチャ加算値,
                EdgeColor                = 引数.材質.エッジ色,
                EmissiveColor            = 引数.材質.放射色,
                GroundShadowColor        = 引数.材質.地面影色,
                MultiplyingSphereTexture = 引数.材質.スフィア乗算値,
                MultiplyingTexture       = 引数.材質.テクスチャ乗算値,
                ToonColor                = 引数.材質.トゥーン色
            };

            _Manager.定数バッファを使って変数を更新する(layout);
        }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            // 深度ステンシルビューを取得する。
            RenderContext.Instance.DeviceManager.D3DDeviceContext.OutputMerger.GetRenderTargets(out var depthStencilView);

            using (depthStencilView)
                using (var depthStencilBuffer = depthStencilView.ResourceAs <Texture2D>())
                {
                    #region " 未作成または深度ステンシルバッファといろいろ異なっている場合、Texture2D と ShaderResourceView を作成する。"
                    //----------------
                    if (null == _Texture2D ||
                        null == _ShaderResourceView ||
                        depthStencilBuffer.Description.Width != _Texture2D.Description.Width ||
                        depthStencilBuffer.Description.Height != _Texture2D.Description.Height ||
                        depthStencilBuffer.Description.Format != _Texture2D.Description.Format)
                    {
                        数.AsShaderResource().SetResource(null);
                        _ShaderResourceView?.Dispose();
                        _Texture2D?.Dispose();

                        // 深度ステンシルバッファと同じサイズ・同じフォーマットのテクスチャを作成する。

                        _Texture2D = new Texture2D(
                            RenderContext.Instance.DeviceManager.D3DDevice,
                            new Texture2DDescription {
                            ArraySize         = 1,
                            BindFlags         = BindFlags.DepthStencil | BindFlags.ShaderResource,
                            CpuAccessFlags    = CpuAccessFlags.None, // CPUからアクセス不要
                            Format            = SharpDX.DXGI.Format.R32_Typeless,
                            Width             = depthStencilBuffer.Description.Width,
                            Height            = depthStencilBuffer.Description.Height,
                            MipLevels         = 1,
                            OptionFlags       = ResourceOptionFlags.None,
                            SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                            Usage             = ResourceUsage.Default,
                        });

                        // テクスチャのシェーダーリソースビューを作成する。

                        _ShaderResourceView = new ShaderResourceView(
                            RenderContext.Instance.DeviceManager.D3DDevice,
                            _Texture2D,
                            new ShaderResourceViewDescription {
                            Format    = SharpDX.DXGI.Format.R32_Float,
                            Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                            Texture2D = new ShaderResourceViewDescription.Texture2DResource {
                                MipLevels       = 1,
                                MostDetailedMip = 0,
                            },
                        });


                        // シェーダーリソースビューを変数に設定する。

                        数.AsShaderResource().SetResource(_ShaderResourceView);
                    }
                    //----------------
                    #endregion


                    // 深度ステンシルバッファの内容を Texture2D に複写する。

                    RenderContext.Instance.DeviceManager.D3DDeviceContext.CopyResource(depthStencilBuffer, _Texture2D);
                }
        }
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     数.AsShaderResource().SetResource(_shaderResource);
 }
Exemple #15
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();
                }
            }
        }
 public abstract void  数を更新する(EffectVariable 数, 数更新時引数 引数);
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // ターゲットオブジェクトに依存しない
     数.AsVector().Set(引数.材質.テクスチャ乗算値);
 }
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     数.AsScalar().Set(引数.材質.テッセレーション係数);
 }
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     数.AsVector().Set(RenderContext.Instance.パネル監視.MousePosition);
 }
Exemple #20
0
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // シェーダーリソースビューを登録。
     数.AsShaderResource().SetResource(_resourceView);
 }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            var viewport = RenderContext.Instance.DeviceManager.D3DDeviceContext.Rasterizer.GetViewports <ViewportF>()[0];

            数.AsVector().Set(new Vector2(viewport.Width, viewport.Height));
        }
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // ターゲットオブジェクトに依存しない
     数.AsScalar().Set(引数.材質.エッジ幅);       // エッジ幅は材質モーフ適用後の値。
 }
        public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
        {
            // スワップチェーンの強参照を取得する。

            if (!(引数.SwapChain.TryGetTarget(out var swapChain)))
            {
                return;     // 失敗したら無視
            }
            // スワップチェーンのバックバッファを取得する。

            using (var backBuffer = swapChain.GetBackBuffer <Texture2D>(0))
            {
                #region " 未作成またはバックバッファといろいろ異なっている場合、Texture2D と ShaderResourceView を作成する。"
                //----------------
                if (null == _Texture2D ||
                    null == _ShaderResourceView ||
                    backBuffer.Description.Width != _Texture2D.Description.Width ||
                    backBuffer.Description.Height != _Texture2D.Description.Height ||
                    backBuffer.Description.Format != _Texture2D.Description.Format)
                {
                    数.AsShaderResource().SetResource(null);
                    _ShaderResourceView?.Dispose();
                    _Texture2D?.Dispose();

                    // バックバッファと同じサイズ・同じフォーマットのテクスチャを作成する。

                    _Texture2D = new Texture2D(
                        RenderContext.Instance.DeviceManager.D3DDevice,
                        new Texture2DDescription {
                        ArraySize         = 1,
                        BindFlags         = BindFlags.ShaderResource,
                        CpuAccessFlags    = CpuAccessFlags.None,    // CPUからアクセス不要
                        Format            = backBuffer.Description.Format,
                        Width             = backBuffer.Description.Width,
                        Height            = backBuffer.Description.Height,
                        MipLevels         = 1,
                        OptionFlags       = ResourceOptionFlags.None,
                        SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                        Usage             = ResourceUsage.Default,
                    });

                    // テクスチャのシェーダーリソースビューを作成する。

                    _ShaderResourceView = new ShaderResourceView(
                        RenderContext.Instance.DeviceManager.D3DDevice,
                        _Texture2D,
                        new ShaderResourceViewDescription {
                        Format    = _Texture2D.Description.Format,
                        Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.Texture2D,
                        Texture2D = new ShaderResourceViewDescription.Texture2DResource {
                            MipLevels       = 1,
                            MostDetailedMip = 0,
                        },
                    });


                    // シェーダーリソースビューを変数に設定する。

                    数.AsShaderResource().SetResource(_ShaderResourceView);
                }
                //----------------
                #endregion


                // 現在のバックバッファの内容を Texture2D に複写する。

                RenderContext.Instance.DeviceManager.D3DDeviceContext.CopyResource(backBuffer, _Texture2D);
            }
        }
Exemple #24
0
 public override void  数を更新する(EffectVariable 数, 数更新時引数 引数)
 {
     // ターゲットオブジェクトに依存しない
     数.AsShaderResource().SetResource(引数.材質.トゥーンテクスチャ);
 }
Exemple #25
0
 public override void  数を更新する(EffectVariable subscribeTo, 数更新時引数 variable)
 {
     // ターゲットオブジェクトに依存しない
     subscribeTo.AsShaderResource().SetResource(variable.材質.テクスチャ);
 }