// Modern compilers are smart enough to do these multiplications intelligently.
__forceinlineint32_tMulScale14(int32_ta,int32_tb){return(int32_t)(((int64_t)a*b)>>14);}// only used by R_DrawVoxel
__forceinlineint32_tMulScale30(int32_ta,int32_tb){return(int32_t)(((int64_t)a*b)>>30);}// only used once in the node builder
__forceinlineint32_tMulScale32(int32_ta,int32_tb){return(int32_t)(((int64_t)a*b)>>32);}// only used by R_DrawVoxel
__forceinlineuint32_tUMulScale16(uint32_ta,uint32_tb){return(uint32_t)(((uint64_t)a*b)>>16);}// used for sky drawing
__forceinlineint32_tDMulScale3(int32_ta,int32_tb,int32_tc,int32_td){return(int32_t)(((int64_t)a*b+(int64_t)c*d)>>3);}// used for setting up slopes for Build maps
__forceinlineint32_tDMulScale6(int32_ta,int32_tb,int32_tc,int32_td){return(int32_t)(((int64_t)a*b+(int64_t)c*d)>>6);}// only used by R_DrawVoxel
__forceinlineint32_tDMulScale10(int32_ta,int32_tb,int32_tc,int32_td){return(int32_t)(((int64_t)a*b+(int64_t)c*d)>>10);}// only used by R_DrawVoxel
__forceinlineint32_tDMulScale18(int32_ta,int32_tb,int32_tc,int32_td){return(int32_t)(((int64_t)a*b+(int64_t)c*d)>>18);}// only used by R_DrawVoxel
__forceinlineint32_tDMulScale32(int32_ta,int32_tb,int32_tc,int32_td){return(int32_t)(((int64_t)a*b+(int64_t)c*d)>>32);}// used by R_PointOnSide.
// Sadly, for divisions this is not true but these are so infrequently used that the C versions are just fine, despite not being fully optimal.
__forceinlineint32_tDivScale6(int32_ta,int32_tb){return(int32_t)(((int64_t)a<<6)/b);}// only used by R_DrawVoxel
__forceinlineint32_tDivScale21(int32_ta,int32_tb){return(int32_t)(((int64_t)a<<21)/b);}// only used by R_DrawVoxel
__forceinlineint32_tDivScale30(int32_ta,int32_tb){return(int32_t)(((int64_t)a<<30)/b);}// only used once in the node builder