/// <summary> /// エフェクトにマトリックスを適用 /// </summary> /// <param name="mode">描画モード</param> /// <param name="world">ワールド</param> public virtual void SetParams(MMDDrawingMode mode, ref Matrix world) { Matrix view, projection; //カメラ情報の取得 Viewport viewport = effect.Device.Viewport; float aspectRatio = (float)viewport.Width / (float)viewport.Height; SlimMMDXCore.Instance.Camera.GetCameraParam(aspectRatio, out view, out projection); //マトリクス処理 effect.SetValue("World", world); effect.SetValue("View", view); effect.SetValue("Projection", projection); effect.SetValue("EyePosition", SlimMMDXCore.Instance.Camera.Position); //ライティング処理 Vector3 color, dir; SlimMMDXCore.Instance.Light.GetLightParam(out color, out dir); effect.SetValue("AmbientLightColor", color); effect.SetValue("DirLight0Direction", dir); switch (mode) { case MMDDrawingMode.Normal: effect.Technique = "MMDEffect"; break; case MMDDrawingMode.Edge: effect.Technique = "MMDNormalDepth"; break; default: throw new NotImplementedException(); } }
public virtual void SetFace(IMMDFaceManager faceManager) { }//こちらではなにもしない /// <summary> /// 描画 /// </summary> /// <param name="mode">モデル描画モード</param> public virtual void Draw(MMDDrawingMode mode) { SlimMMDXCore.Instance.Device.Indices = indexbuffer; effect.Begin(); effect.BeginPass(0); SlimMMDXCore.Instance.Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertexCount, startIndex, triangleCount); effect.EndPass(); effect.End(); }
/// <summary> /// 各パーツを描画した後に呼ばれる /// </summary> /// <param name="mode">モデル描画モード</param> protected virtual void AfterDraw(MMDDrawingMode mode) { }
/// <summary> /// 各パーツを描画する前に呼ばれる /// </summary> protected override void BeforeDraw(MMDDrawingMode mode) { //頂点バッファの更新 DataStream stream = vertexBuffer.Lock(0, 0, LockFlags.Discard); stream.WriteRange(verticesSource); vertexBuffer.Unlock(); //頂点バッファのセット処理 SlimMMDXCore.Instance.Device.VertexDeclaration = vertexDec; SlimMMDXCore.Instance.Device.SetStreamSource(0, vertexBuffer, 0, Marshal.SizeOf(typeof(VertexPNmTx))); //カリング SlimMMDXCore.Instance.Device.SetRenderState(RenderState.CullMode, Culling ? Cull.Counterclockwise : Cull.None); //透過設定 switch (mode) { case MMDDrawingMode.Normal: SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaBlendEnable, true); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaFunc, Compare.Greater); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaTestEnable, true); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaRef, 0); break; case MMDDrawingMode.Edge: SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaBlendEnable, false); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaFunc, Compare.Always); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaTestEnable, false); SlimMMDXCore.Instance.Device.SetRenderState(RenderState.AlphaRef, 0); break; default: throw new NotImplementedException(); } base.BeforeDraw(mode); }
/// <summary> /// 各パーツを描画する前に呼ばれる /// </summary> /// <param name="mode">モデル描画モード</param> protected virtual void BeforeDraw(MMDDrawingMode mode) { }