#include "kicad_stubs_3d.h" #include "render3d_test_accessor.h" #include "3d_rendering/opengl/render_3d_opengl.h" // Member-pointer private-access technique, same as gal_test_accessor.cpp // (https://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html). template struct result { typedef typename Tag::type type; static type ptr; }; template typename result::type result::ptr; template struct rob : result { struct filler { filler() { result::ptr = p; } }; static filler filler_obj; }; template typename rob::filler rob::filler_obj; // Tags — the typedef's signature picks the right overload of the member. struct R3D_initializeOpenGL { typedef bool ( RENDER_3D_OPENGL::*type )(); }; template struct rob; struct R3D_generateCylinder { typedef void ( RENDER_3D_OPENGL::*type )( const SFVEC2F&, float, float, float, float, unsigned int, TRIANGLE_DISPLAY_LIST* ); }; template struct rob; struct R3D_generateInvCone { typedef void ( RENDER_3D_OPENGL::*type )( const SFVEC2F&, float, float, float, float, unsigned int, TRIANGLE_DISPLAY_LIST*, EDA_ANGLE ); }; template struct rob; struct R3D_generateDisk { typedef void ( RENDER_3D_OPENGL::*type )( const SFVEC2F&, float, float, unsigned int, TRIANGLE_DISPLAY_LIST*, bool ); }; template struct rob; struct R3D_generateDimple { typedef void ( RENDER_3D_OPENGL::*type )( const SFVEC2F&, float, float, float, unsigned int, TRIANGLE_DISPLAY_LIST*, bool ); }; template struct rob; struct R3D_generateRing { typedef void ( RENDER_3D_OPENGL::*type )( const SFVEC2F&, float, float, unsigned int, std::vector&, std::vector&, bool ); }; template struct rob; struct R3D_addObj_Circle { typedef void ( RENDER_3D_OPENGL::*type )( const FILLED_CIRCLE_2D*, TRIANGLE_DISPLAY_LIST*, float, float ); }; template struct rob; struct R3D_addObj_Ring { typedef void ( RENDER_3D_OPENGL::*type )( const RING_2D*, TRIANGLE_DISPLAY_LIST*, float, float ); }; template struct rob; struct R3D_addObj_Poly4 { typedef void ( RENDER_3D_OPENGL::*type )( const POLYGON_4PT_2D*, TRIANGLE_DISPLAY_LIST*, float, float ); }; template struct rob; struct R3D_addObj_Tri { typedef void ( RENDER_3D_OPENGL::*type )( const TRIANGLE_2D*, TRIANGLE_DISPLAY_LIST*, float, float ); }; template struct rob; struct R3D_addObj_Seg { typedef void ( RENDER_3D_OPENGL::*type )( const ROUND_SEGMENT_2D*, TRIANGLE_DISPLAY_LIST*, float, float ); }; template struct rob; struct R3D_appendPostMachining { typedef bool ( RENDER_3D_OPENGL::*type )( TRIANGLE_DISPLAY_LIST*, const SFVEC2F&, PAD_DRILL_POST_MACHINING_MODE, int, int, float, float, bool, float, float, float* ); }; template struct rob; struct R3D_createBoard { typedef OPENGL_RENDER_LIST* ( RENDER_3D_OPENGL::*type )( const SHAPE_POLY_SET&, const BVH_CONTAINER_2D* ); }; template struct rob; struct R3D_generate3dGrid { typedef void ( RENDER_3D_OPENGL::*type )( GRID3D_TYPE ); }; template struct rob; struct R3D_setupMaterials { typedef void ( RENDER_3D_OPENGL::*type )(); }; template struct rob; struct R3D_setLayerMaterial { typedef void ( RENDER_3D_OPENGL::*type )( PCB_LAYER_ID ); }; template struct rob; struct R3D_setArrowMaterial { typedef void ( RENDER_3D_OPENGL::*type )(); }; template struct rob; struct R3D_m_grid { typedef GLuint RENDER_3D_OPENGL::*type; }; template struct rob; // ---- public wrappers ---- bool R3D_InitializeOpenGL( RENDER_3D_OPENGL& aRenderer ) { return ( aRenderer.*result::ptr )(); } void R3D_GenerateCylinder( RENDER_3D_OPENGL& aRenderer, const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius, float aZtop, float aZbot, unsigned int aNrSides, TRIANGLE_DISPLAY_LIST* aDst ) { ( aRenderer.*result::ptr )( aCenter, aInnerRadius, aOuterRadius, aZtop, aZbot, aNrSides, aDst ); } void R3D_GenerateInvCone( RENDER_3D_OPENGL& aRenderer, const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius, float aZtop, float aZbot, unsigned int aNrSides, TRIANGLE_DISPLAY_LIST* aDst, EDA_ANGLE aAngle ) { ( aRenderer.*result::ptr )( aCenter, aInnerRadius, aOuterRadius, aZtop, aZbot, aNrSides, aDst, aAngle ); } void R3D_GenerateDisk( RENDER_3D_OPENGL& aRenderer, const SFVEC2F& aCenter, float aRadius, float aZ, unsigned int aNrSides, TRIANGLE_DISPLAY_LIST* aDst, bool aTop ) { ( aRenderer.*result::ptr )( aCenter, aRadius, aZ, aNrSides, aDst, aTop ); } void R3D_GenerateDimple( RENDER_3D_OPENGL& aRenderer, const SFVEC2F& aCenter, float aRadius, float aZ, float aDepth, unsigned int aNrSides, TRIANGLE_DISPLAY_LIST* aDst, bool aTop ) { ( aRenderer.*result::ptr )( aCenter, aRadius, aZ, aDepth, aNrSides, aDst, aTop ); } void R3D_GenerateRing( RENDER_3D_OPENGL& aRenderer, const SFVEC2F& aCenter, float aInnerRadius, float aOuterRadius, unsigned int aNrSides, std::vector& aInnerContour, std::vector& aOuterContour, bool aInvertOrder ) { ( aRenderer.*result::ptr )( aCenter, aInnerRadius, aOuterRadius, aNrSides, aInnerContour, aOuterContour, aInvertOrder ); } void R3D_AddObjTriangles( RENDER_3D_OPENGL& aRenderer, const FILLED_CIRCLE_2D* aCircle, TRIANGLE_DISPLAY_LIST* aDst, float aZtop, float aZbot ) { ( aRenderer.*result::ptr )( aCircle, aDst, aZtop, aZbot ); } void R3D_AddObjTriangles( RENDER_3D_OPENGL& aRenderer, const RING_2D* aRing, TRIANGLE_DISPLAY_LIST* aDst, float aZtop, float aZbot ) { ( aRenderer.*result::ptr )( aRing, aDst, aZtop, aZbot ); } void R3D_AddObjTriangles( RENDER_3D_OPENGL& aRenderer, const POLYGON_4PT_2D* aPoly, TRIANGLE_DISPLAY_LIST* aDst, float aZtop, float aZbot ) { ( aRenderer.*result::ptr )( aPoly, aDst, aZtop, aZbot ); } void R3D_AddObjTriangles( RENDER_3D_OPENGL& aRenderer, const TRIANGLE_2D* aTri, TRIANGLE_DISPLAY_LIST* aDst, float aZtop, float aZbot ) { ( aRenderer.*result::ptr )( aTri, aDst, aZtop, aZbot ); } void R3D_AddObjTriangles( RENDER_3D_OPENGL& aRenderer, const ROUND_SEGMENT_2D* aSeg, TRIANGLE_DISPLAY_LIST* aDst, float aZtop, float aZbot ) { ( aRenderer.*result::ptr )( aSeg, aDst, aZtop, aZbot ); } bool R3D_AppendPostMachining( RENDER_3D_OPENGL& aRenderer, TRIANGLE_DISPLAY_LIST* aDst, const SFVEC2F& aHoleCenter, PAD_DRILL_POST_MACHINING_MODE aMode, int aSizeIU, int aDepthIU, float aHoleInnerRadius, float aZSurface, bool aIsFront, float aPlatingThickness3d, float aUnitScale, float* aZEnd ) { return ( aRenderer.*result::ptr )( aDst, aHoleCenter, aMode, aSizeIU, aDepthIU, aHoleInnerRadius, aZSurface, aIsFront, aPlatingThickness3d, aUnitScale, aZEnd ); } OPENGL_RENDER_LIST* R3D_CreateBoard( RENDER_3D_OPENGL& aRenderer, const SHAPE_POLY_SET& aBoardPoly, const BVH_CONTAINER_2D* aThroughHoles ) { return ( aRenderer.*result::ptr )( aBoardPoly, aThroughHoles ); } void R3D_Generate3dGrid( RENDER_3D_OPENGL& aRenderer, GRID3D_TYPE aGridType ) { ( aRenderer.*result::ptr )( aGridType ); } unsigned int R3D_GetGridList( RENDER_3D_OPENGL& aRenderer ) { return aRenderer.*result::ptr; } void R3D_SetupMaterials( RENDER_3D_OPENGL& aRenderer ) { ( aRenderer.*result::ptr )(); } void R3D_SetLayerMaterial( RENDER_3D_OPENGL& aRenderer, PCB_LAYER_ID aLayerID ) { ( aRenderer.*result::ptr )( aLayerID ); } void R3D_SetArrowMaterial( RENDER_3D_OPENGL& aRenderer ) { ( aRenderer.*result::ptr )(); }