示例#1
0
        /// <summary>
        /// ボーンを指定したフレーム番号の姿勢に更新する
        /// </summary>
        /// <param name="frameNumber">フレーム番号</param>
        public void ReviseBone(ulong frameNumber)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData pastFrame, futureFrame;
            frameManager.SearchKeyFrame(frameNumber, out pastFrame, out futureFrame);
            var pastBoneFrame   = (BoneFrame)pastFrame;
            var futureBoneFrame = (BoneFrame)futureFrame;

            // 現在のフレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する
            float s = (pastBoneFrame.frameNumber == futureBoneFrame.frameNumber)? 0 :
                      (float)(frameNumber - pastBoneFrame.frameNumber) / (float)(futureBoneFrame.frameNumber - pastBoneFrame.frameNumber); // 進行度
            BezInterpolParams p = pastBoneFrame.interpolParameters;
            float             s_X, s_Y, s_Z, s_R;

            if (p != null)
            {
                s_X = BezEvaluate(p.X1, p.X2, s);
                s_Y = BezEvaluate(p.Y1, p.Y2, s);
                s_Z = BezEvaluate(p.Z1, p.Z2, s);
                s_R = BezEvaluate(p.R1, p.R2, s); // ペジェ変換後の進行度
            }
            else
            {//ベジェ曲線のパラメータがないときは線形補完の量としてsを利用する
                s_X = s_Y = s_Z = s_R = s;
            }
            // ボーンを更新する
            bone.Translation = new SlimDX.Vector3(
                CGHelper.Lerp(pastBoneFrame.position.x, futureBoneFrame.position.x, s_X),
                CGHelper.Lerp(pastBoneFrame.position.y, futureBoneFrame.position.y, s_Y),
                CGHelper.Lerp(pastBoneFrame.position.z, futureBoneFrame.position.z, s_Z));
            bone.Rotation = SlimDX.Quaternion.Slerp(pastBoneFrame.rotation.ToSlimDX(), futureBoneFrame.rotation.ToSlimDX(), s_R);
        }
示例#2
0
        public PlaneBoard(RenderContext context, ShaderResourceView resView, Vector2 size)
        {
            this.context           = context;
            this._resView          = resView;
            this.Visibility        = true;
            this.SpriteEffect      = CGHelper.CreateEffectFx5FromResource("MMF.Resource.Shader.SpriteShader.fx", context.DeviceManager.Device);
            this.VertexInputLayout = new InputLayout(context.DeviceManager.Device, this.SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, SpriteVertexLayout.InputElements);
            this.renderPass        = this.SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(0);
            float       width = size.X / 2, height = size.Y / 2;
            List <byte> vertexBytes = new List <byte>();

            CGHelper.AddListBuffer(new Vector3(-width, height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(width, height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-width, -height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(width, height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(width, -height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-width, -height, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            using (DataStream ds = new DataStream(vertexBytes.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription()
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)ds.Length
                };
                this.VertexBuffer = new Buffer(context.DeviceManager.Device, ds, bufDesc);
            }
            this.Transformer       = new BasicTransformer();
            this.Transformer.Scale = new Vector3(0.2f);
        }
示例#3
0
        public CircleEffect(GameContext context) : base(context)
        {
            _context = context;
            effect   = CGHelper.CreateEffectFx5("Resources\\Shader\\circleShader.fx",
                                                context.RenderContext.DeviceManager.Device);
            beffect = CGHelper.CreateEffectFx5("Resources\\Shader\\convergenceBeam.fx",
                                               context.RenderContext.DeviceManager.Device);
            noiseView = context.LoadTexture("Resources\\Effect\\noise.png");
            beamView  = context.LoadTexture("Resources\\Effect\\lazer.png");
            ShaderResourceView view = context.LoadTexture("Resources\\Effect\\circle.png");

            frontCircle = new DividedPlaneBoard(context.RenderContext, view, 100,
                                                new Vector2(100, 100),
                                                new PlaneBoard.PlaneBoardDescription(BlendStateManager.BlendStates.Add, effect, false, RenderFront));
            frontCircle.Initialize();
            for (int i = 0; i < 3; i++)
            {
                subCircle[i] = new PlaneBoard(context.RenderContext, view, new Vector2(30, 30),
                                              new PlaneBoard.PlaneBoardDescription(BlendStateManager.BlendStates.Add, effect, false, RenderFront));
                subCircle[i].Initialize();
            }
            for (int i = 0; i < 5; i++)
            {
                beamEffects[i] = new DividedPlaneBoard(context.RenderContext, view, 100,
                                                       new Vector2(100, 100),
                                                       new PlaneBoard.PlaneBoardDescription(BlendStateManager.BlendStates.Add, beffect, false, Renderbeam));
                beamEffects[i].Initialize();
            }
        }
示例#4
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="context">レンダーコンテキスト</param>
        /// <param name="width">描画に利用するテクスチャの解像度の幅</param>
        /// <param name="height">描画に利用するテクスチャの解像度の高さ</param>
        public GDISpriteBatch(RenderContext context, int width, int height)
        {
            this.Context = context;
            Resize(width, height);
            SpriteEffect      = CGHelper.CreateEffectFx5("Shader\\sprite.fx", context.DeviceManager.Device);
            renderPass        = SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(0);
            VertexInputLayout = new InputLayout(context.DeviceManager.Device, SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, SpriteVertexLayout.InputElements);
            SamplerDescription desc = new SamplerDescription();

            desc.Filter   = Filter.MinMagMipLinear;
            desc.AddressU = TextureAddressMode.Wrap;
            desc.AddressV = TextureAddressMode.Wrap;
            desc.AddressW = TextureAddressMode.Wrap;
            sampler       = SamplerState.FromDescription(context.DeviceManager.Device, desc);
            mapedGraphic  = Graphics.FromImage(mapedBitmap);
            BlendStateDescription blendDesc = new BlendStateDescription();

            blendDesc.AlphaToCoverageEnable  = false;
            blendDesc.IndependentBlendEnable = false;
            for (int i = 0; i < blendDesc.RenderTargets.Length; i++)
            {
                blendDesc.RenderTargets[i].BlendEnable           = true;
                blendDesc.RenderTargets[i].SourceBlend           = BlendOption.SourceAlpha;
                blendDesc.RenderTargets[i].DestinationBlend      = BlendOption.InverseSourceAlpha;
                blendDesc.RenderTargets[i].BlendOperation        = BlendOperation.Add;
                blendDesc.RenderTargets[i].SourceBlendAlpha      = BlendOption.One;
                blendDesc.RenderTargets[i].DestinationBlendAlpha = BlendOption.Zero;
                blendDesc.RenderTargets[i].BlendOperationAlpha   = BlendOperation.Add;
                blendDesc.RenderTargets[i].RenderTargetWriteMask = ColorWriteMaskFlags.All;
            }
            ViewMatrix = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
            state      = BlendState.FromDescription(context.DeviceManager.Device, blendDesc);
            NeedRedraw = true;
            Update();
        }
示例#5
0
        public void 初期化する()
        {
            // シェイプシェーダーを作成する。

            _D3DEffect = CGHelper.EffectFx5を作成するFromResource(@"MikuMikuFlex.Resource.Shader.ShapeShader.fx", RenderContext.Instance.DeviceManager.D3DDevice);


            // 頂点リストを作成し、それをもとに頂点バッファを作成する。

            var 頂点リスト = new List <Vector4>();

            InitializePositions(頂点リスト);
            _D3D頂点バッファ = CGHelper.D3Dバッファを作成する(頂点リスト, RenderContext.Instance.DeviceManager.D3DDevice, BindFlags.VertexBuffer);


            // インデックスバッファを作成する。

            var builder = new インデックスバッファBuilder();

            InitializeIndex(builder);
            _D3Dインデックスバッファ = builder.インデックスバッファを作成する();


            // 入力レイアウトを作成する。

            _D3D入力レイアウト = new InputLayout(
                RenderContext.Instance.DeviceManager.D3DDevice,
                _D3DEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature,
                シェイプ用入力エレメント.VertexElements);
        }
示例#6
0
 public void UpdateMaterials()
 {
     this.AmbientColor  = CGHelper.MulEachMember(this.InitialMaterialInfo.AmbientColor, this.MulMaterialInfo.AmbientColor) + this.AddMaterialInfo.AmbientColor;
     this.DiffuseColor  = CGHelper.MulEachMember(this.InitialMaterialInfo.DiffuseColor, this.MulMaterialInfo.DiffuseColor) + this.AddMaterialInfo.DiffuseColor;
     this.SpecularColor = CGHelper.MulEachMember(this.InitialMaterialInfo.SpecularColor, this.MulMaterialInfo.SpecularColor) + this.AddMaterialInfo.SpecularColor;
     this.SpecularPower = this.InitialMaterialInfo.SpecularPower * this.MulMaterialInfo.SpecularPower + this.AddMaterialInfo.SpecularPower;
     this.EdgeColor     = CGHelper.MulEachMember(this.InitialMaterialInfo.EdgeColor, this.MulMaterialInfo.EdgeColor) + this.AddMaterialInfo.EdgeColor;
     ResetMorphMember();
 }
示例#7
0
        public プレーンボードシェイプ(WeakReference <ShaderResourceView> resourceView, Vector2 プレーンボードのサイズ)
        {
            _シェーダーリソースビュー = resourceView;

            表示中 = true;

            スプライトの描画に利用するエフェクト = CGHelper.EffectFx5を作成するFromResource("MikuMikuFlex.Resource.Shader.SpriteShader.fx", RenderContext.Instance.DeviceManager.D3DDevice);

            VertexInputLayout = new InputLayout(
                RenderContext.Instance.DeviceManager.D3DDevice,
                スプライトの描画に利用するエフェクト.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature,
                スプライトの頂点レイアウト.InputElements);

            _描画パス = スプライトの描画に利用するエフェクト.GetTechniqueByIndex(0).GetPassByIndex(0);


            // 頂点リストを作成

            float width  = プレーンボードのサイズ.X / 2f;
            float height = プレーンボードのサイズ.Y / 2f;

            var 頂点リスト = new List <byte>();

            // 三角形1
            CGHelper.AddListBuffer(new Vector3(-width, height, 0), 頂点リスト);                    // x, y, z
            CGHelper.AddListBuffer(new Vector2(0, 0), 頂点リスト);                                 // u, v         以下同
            CGHelper.AddListBuffer(new Vector3(width, height, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector2(1, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector3(-width, -height, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector2(0, 1), 頂点リスト);

            // 三角形2
            CGHelper.AddListBuffer(new Vector3(width, height, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector2(1, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector3(width, -height, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector2(1, 1), 頂点リスト);
            CGHelper.AddListBuffer(new Vector3(-width, -height, 0), 頂点リスト);
            CGHelper.AddListBuffer(new Vector2(0, 1), 頂点リスト);


            // 頂点リストから頂点バッファを作成

            using (DataStream ds = DataStream.Create(頂点リスト.ToArray(), true, true))
            {
                var bufDesc = new BufferDescription()
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)ds.Length
                };

                D3D頂点バッファ = new SharpDX.Direct3D11.Buffer(RenderContext.Instance.DeviceManager.D3DDevice, ds, bufDesc);
            }

            モデル状態   = new モデル状態既定実装();
            モデル状態.率 = new Vector3(0.2f);                    // さいしょっから 0.2 倍?
        }
示例#8
0
        /// <summary>
        ///     頂点バッファ作成
        /// </summary>
        private void MakeGridVectors()
        {
            List <Vector3> gridVector = new List <Vector3>();

            effect = CGHelper.CreateEffectFx5FromResource(@"MMF.Resource.Shader.GridShader.fx",
                                                          RenderContext.DeviceManager.Device);
            for (int i = 0; i <= GridCount; i++)
            {
                if (i != GridCount / 2)
                {
                    gridVector.Add(new Vector3(-GridLength, 0, -GridLength + i * GridWidth));
                    gridVector.Add(new Vector3(GridLength, 0, -GridLength + i * GridWidth));
                }
            }
            for (int i = 0; i <= GridCount; i++)
            {
                if (i != GridCount / 2)
                {
                    gridVector.Add(new Vector3(-GridLength + i * GridWidth, 0, -GridLength));
                    gridVector.Add(new Vector3(-GridLength + i * GridWidth, 0, GridLength));
                }
            }
            using (DataStream vs = new DataStream(gridVector.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)vs.Length
                };
                vertexBuffer = new Buffer(RenderContext.DeviceManager.Device, vs, bufDesc);
            }
            vectorCount = gridVector.Count;
            List <float> axisVector = new List <float>();

            addAxisVector(axisVector, AxisLength, 0, 0, new Vector4(1, 0, 0, 1));
            addAxisVector(axisVector, 0, AxisLength, 0, new Vector4(0, 1, 0, 1));
            addAxisVector(axisVector, 0, 0, AxisLength, new Vector4(0, 0, 1, 1));
            using (DataStream vs = new DataStream(axisVector.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)vs.Length
                };
                axisVertexBuffer = new Buffer(RenderContext.DeviceManager.Device, vs, bufDesc);
            }
            axisVectorCount = axisVector.Count;
            ShaderSignature v = effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature;

            layout      = new InputLayout(RenderContext.DeviceManager.Device, v, MeasureGridLayout.VertexElements);
            v           = effect.GetTechniqueByIndex(0).GetPassByIndex(1).Description.Signature;
            axisLayout  = new InputLayout(RenderContext.DeviceManager.Device, v, AxisGridLayout.VertexElements);
            VertexCount = axisVectorCount + vectorCount;
        }
示例#9
0
 /// <summary>
 /// //X,Y,Z軸回転量に分解する
 /// </summary>
 /// <param name="Rotation">Amount of rotation</param>
 /// <param name="xRotation">XRotation axis</param>
 /// <param name="yRotation">YRotation axis</param>
 /// <param name="zRotation">ZRotation axis</param>
 /// <returns>Decomposition patterns</returns>
 private int SplitRotation(Quaternion Rotation, out float xRotation, out float yRotation, out float zRotation)
 {
     if (CGHelper.FactoringQuaternionXYZ(Rotation, out xRotation, out yRotation, out zRotation))
     {
         return(0);
     }
     if (CGHelper.FactoringQuaternionYZX(Rotation, out yRotation, out zRotation, out xRotation))
     {
         return(1);
     }
     CGHelper.FactoringQuaternionZXY(Rotation, out zRotation, out xRotation, out yRotation);
     return(2);
 }
示例#10
0
 public void UpdateMaterials()
 {
     AmbientColor = CGHelper.MulEachMember(InitialMaterialInfo.AmbientColor, MulMaterialInfo.AmbientColor) + AddMaterialInfo.AmbientColor;
     DiffuseColor = CGHelper.MulEachMember(InitialMaterialInfo.DiffuseColor, MulMaterialInfo.DiffuseColor) +
                    AddMaterialInfo.DiffuseColor;
     SpecularColor = CGHelper.MulEachMember(InitialMaterialInfo.SpecularColor, MulMaterialInfo.SpecularColor) +
                     AddMaterialInfo.SpecularColor;
     SpecularPower = InitialMaterialInfo.SpecularPower * MulMaterialInfo.SpecularPower +
                     AddMaterialInfo.SpecularPower;
     EdgeColor = CGHelper.MulEachMember(InitialMaterialInfo.EdgeColor, MulMaterialInfo.EdgeColor) +
                 AddMaterialInfo.EdgeColor;
     ResetMorphMember();
 }
示例#11
0
        public void Initialize()
        {
            this.effect = CGHelper.CreateEffectFx5FromResource(@"MMF.Resource.Shader.ShapeShader.fx", this.RenderContext.DeviceManager.Device);
            List <Vector4> positions = new List <Vector4>();

            InitializePositions(positions);
            this.vertexBuffer = CGHelper.CreateBuffer(positions, this.RenderContext.DeviceManager.Device, BindFlags.VertexBuffer);
            IndexBufferBuilder builder = new IndexBufferBuilder(this.RenderContext);

            InitializeIndex(builder);
            this.indexBuffer = builder.build();
            this.layout      = new InputLayout(this.RenderContext.DeviceManager.Device, this.effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, ShapeInputLayout.VertexElements);
        }
示例#12
0
        /// <summary>
        /// 指定したフレーム番号のモーフの値を取得する
        /// </summary>
        /// <param name="frame">フレーム番号</param>
        public float GetMorphValue(float frameNumber)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData pastFrame, futureFrame;
            frameManager.SearchKeyFrame(frameNumber, out pastFrame, out futureFrame);
            var pastMorphFrame   = (MorphFrameData)pastFrame;
            var futureMorphFrame = (MorphFrameData)futureFrame;

            // 現在のフレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する
            float s = (futureMorphFrame.FrameNumber == pastMorphFrame.FrameNumber) ? 0 :
                      (float)(frameNumber - pastMorphFrame.FrameNumber) / (float)(futureMorphFrame.FrameNumber - pastMorphFrame.FrameNumber); // 進行度

            return(CGHelper.Lerp(pastMorphFrame.MorphValue, futureMorphFrame.MorphValue, s));
        }
示例#13
0
        /// <summary>
        /// Returns a morph of the specified frame number
        /// </summary>
        /// <param name="frameNumber">Frame number</param>
        public float GetMorphValue(ulong frameNumber)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData pastFrame, futureFrame;
            this.frameManager.SearchKeyFrame(frameNumber, out pastFrame, out futureFrame);
            var pastMorphFrame   = (MorphFrame)pastFrame;
            var futureMorphFrame = (MorphFrame)futureFrame;

            // 現在のフレームの前後キーフレーム間での進行度を求める
            float s = (futureMorphFrame.frameNumber == pastMorphFrame.frameNumber)? 0 :
                      (float)(frameNumber - pastMorphFrame.frameNumber) / (float)(futureMorphFrame.frameNumber - pastMorphFrame.frameNumber); // 進行度

            // 線形補完で値を求める
            return(CGHelper.Lerp(pastMorphFrame.value, futureMorphFrame.value, s));
        }
示例#14
0
        public DebugDotManager(RenderContext context)
        {
            this.Context = context;
            List <byte> listBuffer = new List <byte>();

            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, -dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, -dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, -dotlength / 2, 0), listBuffer);
            this.VertexBuffer = CGHelper.CreateBuffer(listBuffer, context.DeviceManager.Device, BindFlags.VertexBuffer);
            this.Effect       = CGHelper.CreateEffectFx5("Shader\\debugDot.fx", context.DeviceManager.Device);
            this.RenderPass   = this.Effect.GetTechniqueByIndex(0).GetPassByIndex(0);
            this.VertexLayout = new InputLayout(context.DeviceManager.Device, this.Effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, DebugDotInputLayout.InputElements);
        }
示例#15
0
        /// <summary>
        /// 進行度合から移行度合を取得
        /// </summary>
        /// <param name="Progress">進行度合</param>
        /// <returns>移行度合</returns>
        public float Evaluate(float Progress)
        {
            //ニュートン法による近似
            float t = CGHelper.Clamp(Progress, 0, 1);
            float dt;

            do
            {
                dt = -(fx(t) - Progress) / dfx(t);
                if (float.IsNaN(dt))
                {
                    break;
                }
                t += CGHelper.Clamp(dt, -1f, 1f);  //大幅に移動して別の解に到達するのを防止する用
            } while (Math.Abs(dt) > Epsilon);
            return(CGHelper.Clamp(fy(t), 0f, 1f)); //念のため、0-1の間に収まるようにした
        }
示例#16
0
        /// <summary>
        ///     現在の材質情報を更新する。
        /// </summary>
        /// <remarks>
        ///     外部で <see cref="乗算差分"/> と <see cref="加算差分"/> が更新されているという前提で、それを反映する。
        ///     上記2つは反映後にリセットされて、また外部からの更新を待つ。
        /// </remarks>
        public void 更新する()
        {
            // 値 = 初期値 × 乗算値 + 加算値

            環境色  = CGHelper.MulEachMember(初期値.環境色, 乗算差分.環境色) + 加算差分.環境色;
            拡散色  = CGHelper.MulEachMember(初期値.拡散色, 乗算差分.拡散色) + 加算差分.拡散色;
            反射色  = CGHelper.MulEachMember(初期値.反射色, 乗算差分.反射色) + 加算差分.反射色;
            反射係数 = 初期値.反射係数 * 乗算差分.反射係数 + 加算差分.反射係数;

            if (エッジが有効である)
            {
                エッジ色 = CGHelper.MulEachMember(初期値.エッジ色, 乗算差分.エッジ色) + 加算差分.エッジ色;
                エッジ幅 = 初期値.エッジ幅 * 乗算差分.エッジ幅 + 加算差分.エッジ幅;
            }

            _リセットする();
        }
示例#17
0
        /// <summary>
        /// Advanced degree from a transition degree
        /// </summary>
        /// <param name="Progress">Advanced degree</param>
        /// <returns>Transition degree</returns>
        public float Evaluate(float Progress)
        {
            //Newton method approximation
            float t = CGHelper.Clamp(Progress, 0, 1);
            float dt;

            do
            {
                dt = -(fx(t) - Progress) / dfx(t);
                if (float.IsNaN(dt))
                {
                    break;
                }
                t += CGHelper.Clamp(dt, -1f, 1f);  //To prevent moving dramatically, reaching a different solution for
            } while (Math.Abs(dt) > Epsilon);
            return(CGHelper.Clamp(fy(t), 0f, 1f)); //Just in case the fit between 0-1.
        }
示例#18
0
        public D2DSpriteBatch(RenderContext context)
        {
            this.context           = context;
            this.DeviceManager     = context.DeviceManager;
            this.SpriteEffect      = CGHelper.CreateEffectFx5FromResource("MMF.Resource.Shader.SpriteShader.fx", this.DeviceManager.Device);
            this.renderPass        = this.SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(1);
            this.VertexInputLayout = new InputLayout(this.DeviceManager.Device, this.SpriteEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, SpriteVertexLayout.InputElements);
            SamplerDescription desc = new SamplerDescription();

            desc.Filter   = Filter.MinMagMipLinear;
            desc.AddressU = TextureAddressMode.Wrap;
            desc.AddressV = TextureAddressMode.Wrap;
            desc.AddressW = TextureAddressMode.Wrap;
            this.sampler  = SamplerState.FromDescription(this.DeviceManager.Device, desc);
            BlendStateDescription blendDesc = new BlendStateDescription();

            blendDesc.AlphaToCoverageEnable  = false;
            blendDesc.IndependentBlendEnable = false;
            for (int i = 0; i < blendDesc.RenderTargets.Length; i++)
            {
                blendDesc.RenderTargets[i].BlendEnable           = true;
                blendDesc.RenderTargets[i].SourceBlend           = BlendOption.SourceAlpha;
                blendDesc.RenderTargets[i].DestinationBlend      = BlendOption.InverseSourceAlpha;
                blendDesc.RenderTargets[i].BlendOperation        = BlendOperation.Add;
                blendDesc.RenderTargets[i].SourceBlendAlpha      = BlendOption.One;
                blendDesc.RenderTargets[i].DestinationBlendAlpha = BlendOption.Zero;
                blendDesc.RenderTargets[i].BlendOperationAlpha   = BlendOperation.Add;
                blendDesc.RenderTargets[i].RenderTargetWriteMask = ColorWriteMaskFlags.All;
            }
            this.state = BlendState.FromDescription(this.DeviceManager.Device, blendDesc);

            BlendStateDescription bsd = new BlendStateDescription();

            bsd.RenderTargets[0].BlendEnable           = true;
            bsd.RenderTargets[0].SourceBlend           = BlendOption.SourceAlpha;
            bsd.RenderTargets[0].DestinationBlend      = BlendOption.InverseSourceAlpha;
            bsd.RenderTargets[0].BlendOperation        = BlendOperation.Add;
            bsd.RenderTargets[0].SourceBlendAlpha      = BlendOption.One;
            bsd.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
            bsd.RenderTargets[0].BlendOperationAlpha   = BlendOperation.Add;
            bsd.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
            this.TransParentBlendState = BlendState.FromDescription(this.DeviceManager.Device, bsd);
            Resize();
        }
示例#19
0
        /// <summary>
        /// テクスチャのサイズを変更する
        /// </summary>
        /// <param name="width">幅</param>
        /// <param name="height">高さ</param>
        public void Resize(int width, int height)
        {
            TextureSize = new Vector2(width, height);
            float       w = width / 2f, h = height / 2f;
            List <byte> vertexBytes = new List <byte>();

            TransparentColor = new Vector3(0, 0, 0);
            CGHelper.AddListBuffer(new Vector3(-w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            using (DataStream ds = new DataStream(vertexBytes.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription()
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)ds.Length
                };
                VertexBuffer = new Buffer(Context.DeviceManager.Device, ds, bufDesc);
            }
            SpriteProjectionMatrix = Matrix.OrthoLH(width, height, 0, 100);
            spriteViewport         = new Viewport()
            {
                Width  = width,
                Height = height,
                MaxZ   = 1
            };
            mapedBitmap = new Bitmap(width, height);
            if (mapedGraphic != null)
            {
                mapedGraphic.Dispose();
            }
            mapedGraphic = Graphics.FromImage(mapedBitmap);
        }
示例#20
0
        /// <summary>
        /// To update the position of the bones to the specified frame number
        /// </summary>
        /// <param name="frameNumber">The current frame number</param>
        public void ReviseBone(float frameNumber)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData pastFrame, futureFrame;
            this.frameManager.SearchKeyFrame(frameNumber, out pastFrame, out futureFrame);
            var pastBoneFrame   = (BoneFrameData)pastFrame;
            var futureBoneFrame = (BoneFrameData)futureFrame;

            // 現在のフレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する
            float s = (futureBoneFrame.FrameNumber == pastBoneFrame.FrameNumber) ? 0 :
                      (float)(frameNumber - pastBoneFrame.FrameNumber) / (float)(futureBoneFrame.FrameNumber - pastBoneFrame.FrameNumber); // 進行度
            var ss = new float[4];

            for (int i = 0; i < ss.Length; ++i)
            {
                ss[i] = pastBoneFrame.Curves[i].Evaluate(s);
            }

            // ボーンを更新する
            this.bone.Translation = CGHelper.ComplementTranslate(pastBoneFrame, futureBoneFrame, new Vector3(ss[0], ss[1], ss[2]));
            this.bone.Rotation    = CGHelper.ComplementRotateQuaternion(pastBoneFrame, futureBoneFrame, ss[3]);
        }
示例#21
0
        public DebugDotManager()
        {
            var listBuffer = new List <byte>();

            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, -dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(dotlength / 2, -dotlength / 2, 0), listBuffer);
            CGHelper.AddListBuffer(new Vector3(-dotlength / 2, -dotlength / 2, 0), listBuffer);

            VertexBuffer = CGHelper.D3Dバッファを作成する(listBuffer, RenderContext.Instance.DeviceManager.D3DDevice, BindFlags.VertexBuffer);

            Effect = CGHelper.EffectFx5を作成する("Shader\\debugDot.fx", RenderContext.Instance.DeviceManager.D3DDevice);

            RenderPass = Effect.GetTechniqueByIndex(0).GetPassByIndex(0);

            VertexLayout = new InputLayout(
                RenderContext.Instance.DeviceManager.D3DDevice,
                Effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature,
                DebugDotInputLayout.InputElements);
        }
示例#22
0
        private void Initialize()
        {
            List <BasicInputLayout> verticies = new List <BasicInputLayout>();

            foreach (var face in this.mesh.Faces)
            {
                foreach (int vIndex in face.Indices)
                {
                    BasicInputLayout input = new BasicInputLayout();
                    input.Position = this.mesh.Vertices[vIndex].ToSlimDXVec4().InvX();
                    input.Normal   = this.mesh.Normals[vIndex].ToSlimDX();
                    if (this.mesh.GetTextureCoords(0) != null)
                    {
                        Vector3 vec = this.mesh.GetTextureCoords(0)[vIndex].ToSlimDX();
                        input.UV = new Vector2(vec.X, 1 - vec.Y);
                    }
                    input.BoneWeight1 = 1f;
                    input.BoneIndex1  = 0;
                    verticies.Add(input);
                }
            }
            this.vBuffer = CGHelper.CreateBuffer(verticies, this.context.DeviceManager.Device, BindFlags.VertexBuffer);
        }
示例#23
0
        private void InitializeBuffer(object model, Device device)
        {
            ModelData modelData = (ModelData)model;
            List <BasicInputLayout> verticies = new List <BasicInputLayout>();
            List <uint>             indexes   = new List <uint>();

            for (int i = 0; i < modelData.VertexList.VertexCount; i++)
            {
                LoadVertex(modelData.VertexList.Vertexes[i], verticies);
            }
            vertexDataBox = new DataBox(0, 0, new DataStream(verticies.ToArray(), true, true));
            VertexBuffer  = CGHelper.CreateBuffer(device, verticies.Count * BasicInputLayout.SizeInBytes, BindFlags.VertexBuffer);
            device.ImmediateContext.UpdateSubresource(vertexDataBox, VertexBuffer, 0);

            InputVerticies = verticies.ToArray();
            foreach (SurfaceData surface in modelData.SurfaceList.Surfaces)
            {
                indexes.Add(surface.p);
                indexes.Add(surface.q);
                indexes.Add(surface.r);
            }
            IndexBuffer = CGHelper.CreateBuffer(indexes, device, BindFlags.IndexBuffer);
        }
示例#24
0
        private void LeapFrame(CameraFrameData cf1, CameraFrameData cf2, CameraProvider cp, IProjectionMatrixProvider proj, float f)
        {
            float ProgX, ProgY, ProgZ, ProgR, ProgL, ProgP;;

            ProgX           = cf1.Curves[0].Evaluate(f);
            ProgY           = cf1.Curves[1].Evaluate(f);
            ProgZ           = cf1.Curves[2].Evaluate(f);
            ProgR           = cf1.Curves[3].Evaluate(f);
            ProgL           = cf1.Curves[4].Evaluate(f);
            ProgP           = cf1.Curves[5].Evaluate(f);
            cp.CameraLookAt = CGHelper.ComplementTranslate(cf1, cf2,
                                                           new Vector3(ProgX, ProgY, ProgZ));
            Quaternion rotation = CGHelper.ComplementRotateQuaternion(cf1, cf2,
                                                                      ProgR);
            float   length          = CGHelper.Lerp(cf1.Distance, cf2.Distance, ProgL);
            float   angle           = CGHelper.Lerp(cf1.ViewAngle, cf2.ViewAngle, ProgP);
            Vector3 Position2target = Vector3.TransformCoordinate(new Vector3(0, 0, 1),
                                                                  Matrix.RotationQuaternion(rotation));
            Vector3 TargetPosition = cp.CameraLookAt + length * Position2target;

            cp.CameraPosition = TargetPosition;
            proj.Fovy         = CGHelper.ToRadians(angle);
        }
示例#25
0
        public void Resize()
        {
            Viewport vp     = this.DeviceManager.Context.Rasterizer.GetViewports()[0];
            int      width  = (int)vp.Width;
            int      height = (int)vp.Height;

            if (height == 0 || width == 0)
            {
                return;
            }
            this.TextureSize = new Vector2(width, height);
            float       w = width / 2f, h = height / 2f;
            List <byte> vertexBytes = new List <byte>();

            CGHelper.AddListBuffer(new Vector3(-w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(1, 1), vertexBytes);
            CGHelper.AddListBuffer(new Vector3(-w, -h, 0), vertexBytes);
            CGHelper.AddListBuffer(new Vector2(0, 1), vertexBytes);
            using (DataStream ds = new DataStream(vertexBytes.ToArray(), true, true))
            {
                BufferDescription bufDesc = new BufferDescription()
                {
                    BindFlags   = BindFlags.VertexBuffer,
                    SizeInBytes = (int)ds.Length
                };
                if (this.VertexBuffer != null && !this.VertexBuffer.Disposed)
                {
                    this.VertexBuffer.Dispose();
                }
                this.VertexBuffer = new SlimDX.Direct3D11.Buffer(this.DeviceManager.Device, ds, bufDesc);
            }
            this.SpriteProjectionMatrix = Matrix.OrthoLH(width, height, 0, 100);
            this.spriteViewport         = new Viewport()
            {
                Width  = width,
                Height = height,
                MaxZ   = 1
            };


            this.ViewMatrix = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), new Vector3(0, 1, 0));

            //DirectX11 for texture creation
            if (this.TextureD3D11 != null && !this.TextureD3D11.Disposed)
            {
                this.TextureD3D11.Dispose();
            }
            this.TextureD3D11 = new Texture2D(this.DeviceManager.Device, new Texture2DDescription()
            {
                Width             = width,
                Height            = height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = Format.B8G8R8A8_UNorm,
                SampleDescription = new SampleDescription(1, 0),
                Usage             = ResourceUsage.Default,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                CpuAccessFlags    = CpuAccessFlags.None,
                OptionFlags       = ResourceOptionFlags.KeyedMutex
            });
            //Share DX10 and DX11 texture resources
            Resource sharedResource = new Resource(this.TextureD3D11);

            if (this.TextureD3D10 != null && !this.TextureD3D10.Disposed)
            {
                this.TextureD3D10.Dispose();
            }
            this.TextureD3D10 = this.DeviceManager.Device10.OpenSharedResource <SlimDX.Direct3D10.Texture2D>(sharedResource.SharedHandle);
            if (this.MutexD3D10 != null && !this.MutexD3D10.Disposed)
            {
                this.MutexD3D10.Dispose();
            }
            if (this.MutexD3D11 != null && !this.MutexD3D11.Disposed)
            {
                this.MutexD3D11.Dispose();
            }
            this.MutexD3D10 = new KeyedMutex(this.TextureD3D10);
            this.MutexD3D11 = new KeyedMutex(this.TextureD3D11);
            sharedResource.Dispose();
            Surface surface            = this.TextureD3D10.AsSurface();
            RenderTargetProperties rtp = new RenderTargetProperties();

            rtp.MinimumFeatureLevel = FeatureLevel.Direct3D10;
            rtp.Type        = RenderTargetType.Hardware;
            rtp.Usage       = RenderTargetUsage.None;
            rtp.PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Premultiplied);
            if (this.DWRenderTarget != null && !this.DWRenderTarget.Disposed)
            {
                this.DWRenderTarget.Dispose();
            }
            this.DWRenderTarget = RenderTarget.FromDXGI(this.context.D2DFactory, surface, rtp);
            surface.Dispose();

            if (RenderTargetRecreated != null)
            {
                RenderTargetRecreated(this, new EventArgs());
            }
        }
示例#26
0
 /// <summary>
 ///     MMEのエフェクトとして読み込む
 /// </summary>
 /// <param name="str">エフェクトのパス</param>
 /// <param name="model">使用対象のモデル</param>
 /// <param name="context"></param>
 /// <param name="loader"></param>
 /// <param name="device">デバイス</param>
 /// <returns>MME仕様のエフェクト</returns>
 internal static MMEEffectManager LoadFromResource(string str, IDrawable model, RenderContext context, ISubresourceLoader loader)
 {
     SlimDX.Direct3D11.Effect effect = CGHelper.CreateEffectFx5FromResource(str, context.DeviceManager.Device);
     return(new MMEEffectManager(str, context, effect, model, loader));
 }
示例#27
0
        public void 初期化する(object model, SharpDX.Direct3D11.Effect d3dEffect)
        {
            var d3dDevice = RenderContext.Instance.DeviceManager.D3DDevice;
            var モデル       = (PMXモデル)model;


            // 入力頂点リストを作成する。

            var 頂点リスト = new List <CS_INPUT>();

            for (int i = 0; i < モデル.頂点リスト.Count; i++)
            {
                this._頂点データを頂点レイアウトリストに追加する(モデル.頂点リスト[i], 頂点リスト);
            }

            this.入力頂点リスト = 頂点リスト.ToArray();


            // インデックスバッファを作成する。内容は モデルの面リスト で初期化。

            var インデックスリスト = new List <uint>();

            foreach (面 surface in モデル.面リスト)
            {
                インデックスリスト.Add(surface.頂点1);
                インデックスリスト.Add(surface.頂点2);
                インデックスリスト.Add(surface.頂点3);
            }

            this.D3Dインデックスバッファ = CGHelper.D3Dバッファを作成する(インデックスリスト, d3dDevice, SharpDX.Direct3D11.BindFlags.IndexBuffer);


            // 頂点データストリームを作成する。内容は空。

            this._頂点データストリーム = new DataStream(this.入力頂点リスト.Length * CS_INPUT.SizeInBytes, canRead: true, canWrite: true);


            // D3Dスキニングバッファを作成する。内容は空。

            this.D3Dスキニングバッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes         = CS_INPUT.SizeInBytes * this.入力頂点リスト.Length,
                Usage               = SharpDX.Direct3D11.ResourceUsage.Default,
                BindFlags           = SharpDX.Direct3D11.BindFlags.ShaderResource | SharpDX.Direct3D11.BindFlags.UnorderedAccess,
                CpuAccessFlags      = SharpDX.Direct3D11.CpuAccessFlags.None,
                OptionFlags         = SharpDX.Direct3D11.ResourceOptionFlags.BufferStructured, // 構造化バッファ
                StructureByteStride = CS_INPUT.SizeInBytes,
            });

            D3Dスキニングバッファをリセットする = true;    // 今はストリームもスキニングバッファも空なので、描画前に設定するようフラグを立てておく。


            // 頂点バッファを作成する。

            this.D3D頂点バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes    = VS_INPUT.SizeInBytes * this.入力頂点リスト.Length,
                Usage          = SharpDX.Direct3D11.ResourceUsage.Default,
                BindFlags      = SharpDX.Direct3D11.BindFlags.VertexBuffer | SharpDX.Direct3D11.BindFlags.ShaderResource | SharpDX.Direct3D11.BindFlags.UnorderedAccess, // 非順序アクセス
                CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
                OptionFlags    = SharpDX.Direct3D11.ResourceOptionFlags.BufferAllowRawViews,                                                                             // 生ビューバッファ
            });

            // 頂点シェーダー用の入力レイアウトを作成する。

            this.D3D頂点レイアウト = new SharpDX.Direct3D11.InputLayout(
                d3dDevice,
                d3dEffect.GetTechniqueByName("DefaultObject").GetPassByIndex(0).Description.Signature,
                VS_INPUT.VertexElements);


            // コンピュートシェーダー入力用のシェーダーリソースビューを作成する。

            this.D3DスキニングバッファSRView = new SharpDX.Direct3D11.ShaderResourceView(
                d3dDevice,
                this.D3Dスキニングバッファ,  // 構造化バッファ
                new SharpDX.Direct3D11.ShaderResourceViewDescription {
                Format    = SharpDX.DXGI.Format.Unknown,
                Dimension = SharpDX.Direct3D.ShaderResourceViewDimension.ExtendedBuffer,
                BufferEx  = new SharpDX.Direct3D11.ShaderResourceViewDescription.ExtendedBufferResource {
                    FirstElement = 0,
                    ElementCount = this.入力頂点リスト.Length,
                },
            });


            // コンピュートシェーダー出力用の非順序アクセスビューを作成する。

            this.D3D頂点バッファビューUAView = new SharpDX.Direct3D11.UnorderedAccessView(
                d3dDevice,
                this.D3D頂点バッファ,
                new SharpDX.Direct3D11.UnorderedAccessViewDescription {
                Format    = SharpDX.DXGI.Format.R32_Typeless,
                Dimension = SharpDX.Direct3D11.UnorderedAccessViewDimension.Buffer,
                Buffer    = new SharpDX.Direct3D11.UnorderedAccessViewDescription.BufferResource {
                    FirstElement = 0,
                    ElementCount = VS_INPUT.SizeInBytes * 入力頂点リスト.Length / 4,
                    Flags        = SharpDX.Direct3D11.UnorderedAccessViewBufferFlags.Raw,
                },
            });

            // 定数バッファを作成する。

            this._D3DBoneTransデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneTrans.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneTrans定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneTrans.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });

            this._D3DBoneLocalPositionデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneLocalPosition.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneLocalPosition定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneLocalPosition.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });

            this._D3DBoneQuaternionデータストリーム = new DataStream(this.入力頂点リスト.Length * _D3DBoneQuaternion.SizeInBytes, canRead: true, canWrite: true);

            this._D3DBoneQuaternion定数バッファ = new SharpDX.Direct3D11.Buffer(
                d3dDevice,
                new SharpDX.Direct3D11.BufferDescription {
                SizeInBytes = 入力頂点リスト.Length * _D3DBoneQuaternion.SizeInBytes,
                BindFlags   = SharpDX.Direct3D11.BindFlags.ConstantBuffer,
            });
        }
示例#28
0
 /// <summary>
 ///     MMEのエフェクトとして読み込む
 /// </summary>
 /// <param name="str">エフェクトのパス</param>
 /// <param name="model">使用対象のモデル</param>
 /// <param name="context"></param>
 /// <param name="loader"></param>
 /// <param name="device">デバイス</param>
 /// <returns>MME仕様のエフェクト</returns>
 public static MMEEffectManager Load(string str, IDrawable model, RenderContext context, ISubresourceLoader loader)
 {
     return(new MMEEffectManager(str, context, CGHelper.CreateEffectFx5(str, context.DeviceManager.Device), model, loader));
 }
示例#29
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();
                }
            }
        }
示例#30
0
        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();
                }
            }
        }