刀子模型取附件位置不对的原因:
通过 CL_CreateVisibleEntity 或者 CL_TempEntAlloc 创建的实体会存入引擎内部一个实体数组 cl_entities 中等待下一帧绘制。
其中 cl_entities 中的实体由引擎内部函数 R_DrawEntitiesOnList 和 R_DrawTEntitiesOnList 分别完成绘制,这两个函数在引擎内部 R_RenderScene 函数中调用。
R_RenderScene 函数渲染出不包括V模型和HUD的整个游戏地图场景,之后引擎才会调用 R_DrawViewModel 来绘制V模型。
也就是说,实际上TEMPENTITY要比V模型先渲染,TEMPENTITY创建出来的时候是没办法获得最新的V模型上的附件的坐标的。
而刀子模型附件坐标不正确的关键原因是 StudioDrawModel 执行了两次。
引擎绘制V模型之前,会先调用一次 StudioDrawModel( STUDIO_EVENT ) 此时 StudioDrawModel 不会绘制任何东西,仅仅计算附件的位置,但此时计算出来附件位置不一定能跟接下来调用 StudioDrawModel( STUDIO_RENDER ) 绘制出的V模型的位置对得上,因此不能用 StudioDrawModel( STUDIO_EVENT ) 计算出来的附件位置。
紧接着引擎会调用 StudioDrawModel( STUDIO_RENDER ) 来绘制V模型,但此时 StudioDrawModel 不会再计算附件位置,而之前 StudioDrawModel( STUDIO_EVENT ) 计算的附件位置又不能用,怎么办呢。只能自己再计算一次了。
测试代码:
https://paste.ubuntu.com/p/GD5TdrBqmx