Draw Commands

https://www.khronos.org/opengl/wiki/Vertex_Rendering

DrawCommands.h

#ifndef DRAWCOMMANDS_H

#define DRAWCOMMANDS_H

#define GLEW_STATIC

#include <GL/glew.h>

/* basic drawing */

/**********************************************************************************/

struct DrawArrays

{

GLenum Mode;

GLint First;

GLsizei Count;

};

struct DrawElements

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

};

/**********************************************************************************/

/* multi-draw */

/**********************************************************************************/

struct MultiDrawArrays

{

GLenum Mode;

const GLint* First;

const GLsizei* Count;

GLsizei DrawCount;

};

struct MultiDrawElements

{

GLenum Mode;

const GLsizei* Count;

GLenum Type;

const GLvoid* const* Indices;

GLsizei DrawCount;

};

/**********************************************************************************/

/* base index */

/**********************************************************************************/

struct DrawElementsBaseVertex

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLint BaseVertex;

};

/**********************************************************************************/

/* instancing */

/**********************************************************************************/

struct DrawArraysInstanced

{

GLenum Mode;

GLint First;

GLsizei Count;

GLsizei InstanceCount;

};

struct DrawElementsInstanced

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLsizei InstanceCount;

};

struct DrawArraysInstancedBaseInstance

{

GLenum Mode;

GLint First;

GLsizei Count;

GLsizei InstanceCount;

GLuint BaseInstance;

};

struct DrawElementsInstancedBaseInstance

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLsizei InstanceCount;

GLuint BaseInstance;

};

/**********************************************************************************/

/* range */

/**********************************************************************************/

struct DrawRangeElements

{

GLenum Mode;

GLuint Start;

GLuint End;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

};

/**********************************************************************************/

/* combinations */

/**********************************************************************************/

struct MultiDrawElementsBaseVertex

{

GLenum Mode;

const GLsizei* Count;

GLenum Type;

const GLvoid* const* Indices;

GLsizei Drawcount;

const GLint* BaseVertex;

};

struct DrawRangeElementsBaseVertex

{

GLenum Mode;

GLuint Start;

GLuint End;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLint BaseVertex;

};

struct DrawElementsInstancedBaseVertex

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLsizei PrimCount;

GLint BaseVertex;

};

struct DrawElementsInstancedBaseVertexBaseInstance

{

GLenum Mode;

GLsizei Count;

GLenum Type;

const GLvoid* Indices;

GLsizei PrimCount;

GLint BaseVertex;

GLuint BaseInstance;

};

/**********************************************************************************/

/* transform feedback rendering */

/**********************************************************************************/

struct DrawTransformFeedback

{

GLenum Mode;

GLuint TransformFeedback;

};

struct DrawTransformFeedbackStream

{

GLenum Mode;

GLuint TransformFeedback;

GLuint Stream;

};

struct DrawTransformFeedbackInstanced

{

GLenum Mode;

GLuint TransformFeedback;

GLsizei InstanceCount;

};

struct DrawTransformFeedbackStreamInstanced

{

GLenum Mode;

GLuint TransformFeedback;

GLuint Stream;

GLsizei InstanceCount;

};

/**********************************************************************************/

/* indirect rendering */

/**********************************************************************************/

/* argument type buffered in GL_DRAW_INDIRECT_BUFFER */

struct DrawArraysIndirectCommand

{

GLuint Count;

GLuint InstanceCount;

GLuint First;

GLuint BaseInstance;

};

/* argument type buffered in GL_DRAW_INDIRECT_BUFFER */

struct DrawElementsIndirectCommand

{

GLuint Count;

GLuint InstanceCount;

GLuint FirstIndex;

GLuint BaseVertex;

GLuint BaseInstance;

};

struct DrawArraysIndirect

{

GLenum Mode;

const GLvoid* Indirect;

};

struct MultiDrawArraysIndirect

{

GLenum Mode;

const GLvoid* Indirect;

GLsizei DrawCount;

GLsizei Stride;

};

struct DrawElementsIndirect

{

GLenum Mode;

GLenum Type;

const GLvoid* Indirect;

};

struct MultiDrawElementsIndirect

{

GLenum Mode;

GLenum Type;

const GLvoid* Indirect;

GLsizei DrawCount;

GLsizei Stride;

};

/**********************************************************************************/

/*

conditional rendering

https://www.khronos.org/opengl/wiki/Vertex_Rendering#Conditional_rendering

occlusion query object needed:

... start occlusion query ...

glBeginConditionalRender(GLuint occlusion_query, GLenum mode​);

... render here complex ...

glEndConditionalRender();

*/

/* render commands */

/**********************************************************************************/

inline void Draw(const DrawArrays& cmd)

{

glDrawArrays(cmd.Mode, cmd.First, cmd.Count);

}

inline void Draw(const DrawElements& cmd)

{

glDrawElements(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices);

}

inline void Draw(const MultiDrawArrays& cmd)

{

glMultiDrawArrays(cmd.Mode, cmd.First, cmd.Count, cmd.DrawCount);

}

inline void Draw(const MultiDrawElements& cmd)

{

glMultiDrawElements(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.DrawCount);

}

inline void Draw(const DrawElementsBaseVertex& cmd)

{

glDrawElementsBaseVertex(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.BaseVertex);

}

inline void Draw(const DrawArraysInstanced& cmd)

{

glDrawArraysInstanced(cmd.Mode, cmd.First, cmd.Count, cmd.InstanceCount);

}

inline void Draw(const DrawElementsInstanced& cmd)

{

glDrawElementsInstanced(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.InstanceCount);

}

inline void Draw(const DrawArraysInstancedBaseInstance& cmd)

{

glDrawArraysInstancedBaseInstance(cmd.Mode, cmd.First, cmd.Count, cmd.InstanceCount, cmd.BaseInstance);

}

inline void Draw(const DrawElementsInstancedBaseInstance& cmd)

{

glDrawElementsInstancedBaseInstance(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.InstanceCount, cmd.BaseInstance);

}

inline void Draw(const DrawRangeElements& cmd)

{

glDrawRangeElements(cmd.Mode, cmd.Start, cmd.End, cmd.Count, cmd.Type, cmd.Indices);

}

inline void Draw(const MultiDrawElementsBaseVertex& cmd)

{

glMultiDrawElementsBaseVertex(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.Drawcount, cmd.BaseVertex);

}

inline void Draw(const DrawRangeElementsBaseVertex& cmd)

{

glDrawRangeElementsBaseVertex(cmd.Mode, cmd.Start, cmd.End, cmd.Count, cmd.Type, cmd.Indices, cmd.BaseVertex);

}

inline void Draw(const DrawElementsInstancedBaseVertex& cmd)

{

glDrawElementsInstancedBaseVertex(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.PrimCount, cmd.BaseVertex);

}

inline void Draw(const DrawElementsInstancedBaseVertexBaseInstance& cmd)

{

glDrawElementsInstancedBaseVertexBaseInstance(cmd.Mode, cmd.Count, cmd.Type, cmd.Indices, cmd.PrimCount, cmd.BaseVertex, cmd.BaseInstance);

}

inline void Draw(const DrawTransformFeedback& cmd)

{

glDrawTransformFeedback(cmd.Mode, cmd.TransformFeedback);

}

inline void Draw(const DrawTransformFeedbackStream& cmd)

{

glDrawTransformFeedbackStream(cmd.Mode, cmd.TransformFeedback, cmd.Stream);

}

inline void Draw(const DrawTransformFeedbackInstanced& cmd)

{

glDrawTransformFeedbackInstanced(cmd.Mode, cmd.TransformFeedback, cmd.InstanceCount);

}

inline void Draw(const DrawTransformFeedbackStreamInstanced& cmd)

{

glDrawTransformFeedbackStreamInstanced(cmd.Mode, cmd.TransformFeedback, cmd.Stream, cmd.InstanceCount);

}

inline void Draw(const DrawArraysIndirect& cmd)

{

glDrawArraysIndirect(cmd.Mode, cmd.Indirect);

}

inline void Draw(const MultiDrawArraysIndirect& cmd)

{

glMultiDrawArraysIndirect(cmd.Mode, cmd.Indirect, cmd.DrawCount, cmd.Stride);

}

inline void Draw(const DrawElementsIndirect& cmd)

{

glDrawElementsIndirect(cmd.Mode, cmd.Type, cmd.Indirect);

}

inline void Draw(const MultiDrawElementsIndirect& cmd)

{

glMultiDrawElementsIndirect(cmd.Mode, cmd.Type, cmd.Indirect, cmd.DrawCount, cmd.Stride);

}

/**********************************************************************************/

#endif // DRAWCOMMANDS_H