21.复制

复制功能是三维软件的基础功能,可以提高用户的操作和设计效率。本节课程我们实现选中元素的复制功能,包括线、组件,以及复制过程的预览效果和命令提示过程。

同样,复制功能实现的代码量不大,但贯穿了框架体系的多个关键模块,其实也是依赖和复用了框架体系的能力,来实现预览、命令提示、操作数据处理等过程,然后添加对应实现,继续为基础框架抽象和添加基础能力。我们来看工作机制相关的逻辑流程。

“复制”接口调用逻辑

图:“复制”接口调用逻辑
  1. 点击按钮调用copy进入复制状态,同时调用drawCurve处理预览和完成数据;
  2. 通过ViewerSetting.previewData处理鼠标左键点击事件,第一个点作为复制的基点,后续的连续点作为复制到的目标点,在完成时调用DrawingLinesHolder.CopySelectedDataDrawingComponentHolder.copySelectedData添加复制操作产生的数据;
  3. 在每个渲染循环中调用DrawingLinesHolder.DrawCopyElementsPreviewDrawingComponentHolder.drawCopyElementsPreview将预览效果绘制到GLView中;而复制操作完成添加的数据由对应的draw进行绘制;
  4. ESC键按下时,调用ViewerSetting.ClearCopyImData清除相关临时数据;

由于此前渲染选中效果时已经将选中数据与渲染的桥梁setup完成,在绘制预览数据时只需要更新复制操作偏移计算的(选中元素的)modelMatrix后再次绘制即可。

小学生水平的绘画巨作

图:小学生水平的绘画巨作

小学生水平的绘画巨作来了(苦笑),我们来结合框选(线)、点选(组件)来使用复制功能,记得可以根据命令提示系统来实现精确的复制操作哦。

对“巨作”进行复制

图:对“巨作”进行复制

Attention

我们顺便做了优化:将DrawingComponentHolder中的bodysmeshes元素类型改为了对应对象的指针,这样vector容器在容量达到阈值时拷贝以开辟更大的容量空间情况下,不会有太多的性能损耗,同时getSelectedBody返回的数据也不至于会偶发的失效(那样的话太不可靠啦);同时要记得管理好创建在堆上的这些资源哦,在析构函数中、删除组件时等场景中记得释放。

有了上述知识去详细的探究代码将会容易的多,带着好奇心去探究吧~