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