我正在为嵌入在 AutoCAD 中的应用程序开发 3D 零件预览器。
3D 是通过 SlimDX(2.0 版本)使用 DirectX 实现的。
我正在使用 .NET Framework 3.5
以下代码初始化 DirectX 设备
foreach (var item in ObjectTable.Objects)
item.Dispose();
_presentParameters = new PresentParameters()
{
BackBufferFormat = Format.Unknown,
SwapEffect = SwapEffect.Discard,
BackBufferWidth = 1500,
BackBufferHeight = 1500,
EnableAutoDepthStencil = true,
AutoDepthStencilFormat = Format.D16,
PresentationInterval = PresentInterval.Immediate
};
_device = new Device(new Direct3D(), 0, DeviceType.Hardware, preview3DTarget.Handle, CreateFlags.HardwareVertexProcessing, _presentParameters);
_device.SetRenderState(RenderState.ZEnable, true);
_device.SetRenderState(RenderState.Lighting, false);
_device.SetRenderState(RenderState.CullMode, Cull.None);
从控件的 OnPaint 方法调用以下代码来渲染预览
_device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
_device.BeginScene();
float ratio = (float)preview3DTarget.ClientSize.Width / preview3DTarget.ClientSize.Height;
_device.SetTransform(TransformState.Projection, Matrix.OrthoLH(200, 200, 0.0f, 200.0f));
_device.SetTransform(TransformState.World, Matrix.Translation(-center.X, -center.Y, -center.Z));
_device.SetTransform(TransformState.View, Matrix.RotationYawPitchRoll(Math.radians(0),
Math.radians(0), 0.0f) *
Matrix.Translation(0f, 0f, 100));
for (int i = 0; i < this.vertices.Count; i += 4)
{
_device.DrawPrimitives(PrimitiveType.TriangleStrip, i, 2);
}
for (int i = 0; i < this.points.Count; i += 5)
{
_device.DrawPrimitives(PrimitiveType.LineStrip, i + this.vertices.Count, 4);
}
_device.EndScene();
_device.Present();
所有这些代码都可以正常工作,但是在第一次渲染预览后,AutoCAD 会停止正常工作。无法选择 AutoCAD 模型空间内的对象。如果调用了 REGEN,则屏幕是清晰的,并且不会重绘任何内容。如果绘制了一个新对象,它会出现,但与现有对象一样,无法选择。
我猜我的应用程序以某种方式接管了 DirectX 引擎并阻止 AutoCAD 使用它。是否有某种我缺少的释放/处置调用可能允许我的应用程序和 AutoCAD 同时使用 DirectX?