/// <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); }
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); }
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(); } }
/// <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(); }
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); }
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(); }
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 倍? }
/// <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; }
/// <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); }
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(); }
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); }
/// <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)); }
/// <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)); }
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); }
/// <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の間に収まるようにした }
/// <summary> /// 現在の材質情報を更新する。 /// </summary> /// <remarks> /// 外部で <see cref="乗算差分"/> と <see cref="加算差分"/> が更新されているという前提で、それを反映する。 /// 上記2つは反映後にリセットされて、また外部からの更新を待つ。 /// </remarks> public void 更新する() { // 値 = 初期値 × 乗算値 + 加算値 環境色 = CGHelper.MulEachMember(初期値.環境色, 乗算差分.環境色) + 加算差分.環境色; 拡散色 = CGHelper.MulEachMember(初期値.拡散色, 乗算差分.拡散色) + 加算差分.拡散色; 反射色 = CGHelper.MulEachMember(初期値.反射色, 乗算差分.反射色) + 加算差分.反射色; 反射係数 = 初期値.反射係数 * 乗算差分.反射係数 + 加算差分.反射係数; if (エッジが有効である) { エッジ色 = CGHelper.MulEachMember(初期値.エッジ色, 乗算差分.エッジ色) + 加算差分.エッジ色; エッジ幅 = 初期値.エッジ幅 * 乗算差分.エッジ幅 + 加算差分.エッジ幅; } _リセットする(); }
/// <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. }
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(); }
/// <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); }
/// <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]); }
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); }
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); }
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); }
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); }
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()); } }
/// <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)); }
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, }); }
/// <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)); }
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 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(); } } }