enum PrimitiveTopology { PT_POINTS = 0, PT_LINES, PT_LINE_STRIP, PT_TRIANGLES, PT_TRIANGLE_STRIP, PT_TRIANGLE_FAN, PT_QUADS, PT_QUAD_STRIP }; enum GraphicsAPI { DirectX11, DirectX10, DirectX10_1, DirectX9, OpenGL, OpenGLES }; template <GraphicsAPI API> int getPrimitiveTopology(PrimitiveTopology pt) { switch (API) { case DirectX11: case DirectX10: case DirectX10_1: switch(pt) { case PT_POINTS: return D3D_PRIMITIVE_TOPOLOGY_POINTLIST; break; case PT_LINES: return D3D_PRIMITIVE_TOPOLOGY_LINELIST; break; case PT_LINE_STRIP: return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP; break; case PT_TRIANGLES: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; break; case PT_TRIANGLE_STRIP: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; break; case PT_TRIANGLE_FAN: return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; break; default: assert(0 && "getPrimitiveTopology::DirectX10+ Unknown or unsupported primitive topology !"); return -1; break; } break; case DirectX9: switch(pt) { case PT_POINTS: return D3DPT_POINTLIST; break; case PT_LINES: return D3DPT_LINELIST; break; case PT_LINE_STRIP: return D3DPT_LINESTRIP; break; case PT_TRIANGLES: return D3DPT_TRIANGLELIST; break; case PT_TRIANGLE_STRIP: return D3DPT_TRIANGLESTRIP; break; case PT_TRIANGLE_FAN: return D3DPT_TRIANGLEFAN; break; default: assert(0 && "getPrimitiveTopology::DirectX9 Unknown or unsupported primitive topology !"); return -1; break; } break; case OpenGL: case OpenGLES: switch(pt) { case PT_POINTS: return GL_POINTS; break; case PT_LINES: return GL_LINES; break; case PT_LINE_STRIP: return GL_LINE_STRIP; break; case PT_TRIANGLES: return GL_TRIANGLES; break; case PT_TRIANGLE_STRIP: return GL_TRIANGLE_STRIP; break; case PT_TRIANGLE_FAN: return GL_TRIANGLE_FAN; break; default: assert(0 && "getPrimitiveTopology::OpenGL/ES Unknown or unsupported primitive topology !"); return -1; break; } break; default: assert(0 && "getPrimitiveTopology() Unknown API !"); return -1; break; } }
A good compiler should optimize the dead code.
Also if you want to avoid the dependency on the graphics API headers, here are the necessary enums:
enum D3D_PRIMITIVE_TOPOLOGY { D3D_PRIMITIVE_TOPOLOGY_UNDEFINED = 0, D3D_PRIMITIVE_TOPOLOGY_POINTLIST = 1, D3D_PRIMITIVE_TOPOLOGY_LINELIST = 2, D3D_PRIMITIVE_TOPOLOGY_LINESTRIP = 3, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4, D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5 }; enum D3DPRIMITIVETYPE { D3DPT_POINTLIST = 1, D3DPT_LINELIST = 2, D3DPT_LINESTRIP = 3, D3DPT_TRIANGLELIST = 4, D3DPT_TRIANGLESTRIP = 5, D3DPT_TRIANGLEFAN = 6, D3DPT_FORCE_DWORD = 0x7fffffff, }; enum GLPrimitiveTopology { GL_POINTS = 0x0000, GL_LINES = 0x0001, GL_LINE_LOOP = 0x0002, GL_LINE_STRIP = 0x0003, GL_TRIANGLES = 0x0004, GL_TRIANGLE_STRIP = 0x0005, GL_TRIANGLE_FAN = 0x0006, GL_QUADS = 0x0007, GL_QUAD_STRIP = 0x0008, GL_POLYGON = 0x0009, };
If you define the native types yourself, watch out for conflicts !