Add demo shader and spinning colored cube

This commit is contained in:
josh committed 2024-01-25 20:57:33 -05:00
1 parent 8e6ec5f820
commit 8dc6e97585
8 files changed
+149 -38

No files matched your search

+2 -2
View File
@@ -34,7 +34,7 @@ class Array
/**
* Bind array.
*/
void bind() const
public void bind() const
{
glBindVertexArray(m_id);
}
@@ -42,7 +42,7 @@ class Array
/**
* Get array ID.
*/
@property GLuint id() const
public @property GLuint id() const
{
return m_id;
}
+60 -20
View File
@@ -5,21 +5,22 @@ import gl;
/**
* OpenGL buffer object.
*/
class Buffer
class BufferBase(GLenum target = GL_ARRAY_BUFFER)
{
/** Buffer ID. */
private GLuint m_id;
/** Buffer target. */
private GLenum m_target;
/**
* Construct buffer.
*
* @param target
* OpenGL buffer target (e.g. GL_ARRAY_BUFFER, GL_ELEMENT_BUFFER)
* @param data
* Buffer data.
* @param size
* Buffer data size.
* @param usage
* OpenGL buffer usage (default is GL_STATIC_DRAW)
*/
this(GLenum target)
this(const(void) * data = null, size_t size, GLenum usage = GL_STATIC_DRAW)
{
m_id = 0u;
glGenBuffers(1, &m_id);
@@ -27,7 +28,31 @@ class Buffer
{
throw new Exception("Failed to allocate an OpenGL buffer");
}
m_target = target;
bind();
if (data != null)
{
set_buffer_data(data, size, usage);
}
}
/**
* Construct buffer.
*
* @param data
* Buffer data.
* @param usage
* OpenGL buffer usage (default is GL_STATIC_DRAW)
*/
this(T)(const(T)[] data = null, GLenum usage = GL_STATIC_DRAW)
{
if (data is null)
{
this(null, 0u, usage);
}
else
{
this(data.ptr, data.length * data[0].sizeof, usage);
}
}
/**
@@ -41,15 +66,15 @@ class Buffer
/**
* Bind buffer.
*/
void bind() const
public void bind() const
{
glBindBuffer(m_target, m_id);
glBindBuffer(target, m_id);
}
/**
* Get buffer ID.
*/
@property GLuint id() const
public @property GLuint id() const
{
return m_id;
}
@@ -57,28 +82,43 @@ class Buffer
/**
* Set buffer data.
*
* @param usage
* OpenGL buffer usage (e.g. GL_STATIC_DRAW, ...)
* @param ptr
* @param data
* Pointer to buffer data.
* @param size
* Buffer data size.
* @param usage
* OpenGL buffer usage (default is GL_STATIC_DRAW)
*/
void set_buffer_data(GLenum usage, const void * ptr, size_t size)
public void set_buffer_data(const(void) * data, size_t size, GLenum usage = GL_STATIC_DRAW) const
{
glNamedBufferData(m_id, size, ptr, usage);
glBufferData(target, size, data, usage);
}
/**
* Set buffer data.
*
* @param data
* Buffer data.
* @param usage
* OpenGL buffer usage (e.g. GL_STATIC_DRAW, ...)
* @param array
* Buffer data.
*/
void set_buffer_data(T)(GLenum usage, T[] arr)
public void set_buffer_data(T)(const(T)[] data, GLenum usage = GL_STATIC_DRAW) const
{
glNamedBufferData(m_id, arr.length * arr[0].sizeof, arr.ptr, usage);
glBufferData(target, data.length * data[0].sizeof, data.ptr, usage);
}
}
/**
* Convenience class alias for a Buffer with a GL_ARRAY_BUFFER target.
*/
alias Buffer = BufferBase!(GL_ARRAY_BUFFER);
/**
* Convenience class alias for a Buffer with a GL_ELEMENT_ARRAY_BUFFER target.
*/
alias ElementBuffer = BufferBase!(GL_ELEMENT_ARRAY_BUFFER);
/**
* Convenience class alias for a Buffer with a GL_UNIFORM_BUFFER target.
*/
alias UniformBuffer = BufferBase!(GL_UNIFORM_BUFFER);
+5 -3
View File
@@ -20,7 +20,7 @@ import gl;
* Attributes are specified as an associative array with attribute names as
* keys and attribute locations as values.
*/
class Program(string[string] uniforms = [], int[string] attributes = [])
class Program(alias uniforms = [], alias attributes = [])
{
/** Program ID. */
private GLuint m_id;
@@ -151,13 +151,13 @@ class Program(string[string] uniforms = [], int[string] attributes = [])
mixin("private GLint m_uniform_" ~ uniform_name ~ ";");
mixin("public void set_" ~ uniform_name ~ "(" ~ uniform_param_decl_list(uniform_type) ~ ") const" ~
"{" ~
" glProgramUniform" ~ uniform_type ~ "(m_id, m_uniform_" ~ uniform_name ~ ", " ~ (uniform_type_info(uniform_type).v ? "1, " : "") ~ (uniform_type_info(uniform_type).matrix ? "false, " : "") ~ uniform_param_list(uniform_type) ~ ");" ~
" glProgramUniform" ~ uniform_type ~ "(m_id, m_uniform_" ~ uniform_name ~ ", " ~ (uniform_type_info(uniform_type).v ? "1, " : "") ~ (uniform_type_info(uniform_type).matrix ? "GL_FALSE, " : "") ~ uniform_param_list(uniform_type) ~ ");" ~
"}");
static if (uniform_type_info(uniform_type).v)
{
mixin("public void set_" ~ uniform_name ~ "(GLsizei count, " ~ uniform_param_decl_list(uniform_type) ~ ") const" ~
"{" ~
" glProgramUniform" ~ uniform_type ~ "(m_id, m_uniform_" ~ uniform_name ~ ", count, " ~ (uniform_type_info(uniform_type).matrix ? "false, " : "") ~ uniform_param_list(uniform_type) ~ ");" ~
" glProgramUniform" ~ uniform_type ~ "(m_id, m_uniform_" ~ uniform_name ~ ", count, " ~ (uniform_type_info(uniform_type).matrix ? "GL_FALSE, " : "") ~ uniform_param_list(uniform_type) ~ ");" ~
"}");
}
}
@@ -346,10 +346,12 @@ class Program(string[string] uniforms = [], int[string] attributes = [])
else if (shader_type != 0)
{
shader_source ~= line;
shader_source ~= "\n";
}
else
{
common_source ~= line;
common_source ~= "\n";
}
}
+15 -12
View File
@@ -43,17 +43,20 @@ class Shader
string message = "Error compiling ";
switch (shader_type)
{
case GL_VERTEX_SHADER:
message ~= "vertex";
break;
case GL_FRAGMENT_SHADER:
message ~= "fragment";
break;
default:
message ~= "unknown";
break;
case GL_VERTEX_SHADER:
message ~= "vertex";
break;
case GL_FRAGMENT_SHADER:
message ~= "fragment";
break;
default:
message ~= "unknown";
break;
}
message ~= " shader";
message ~= " shader:\n";
message ~= "---\n";
message ~= source;
message ~= "---\n";
GLint log_length;
glGetShaderiv(m_id, GL_INFO_LOG_LENGTH, &log_length);
@@ -61,7 +64,7 @@ class Shader
{
char[] log = new char[log_length];
glGetShaderInfoLog(m_id, log_length, &log_length, log.ptr);
message ~= "\nShader Log:\n";
message ~= "Shader Log:\n";
message ~= log;
message ~= "\n";
}
@@ -80,7 +83,7 @@ class Shader
/**
* Get shader ID.
*/
@property GLuint id() const
public @property GLuint id() const
{
return m_id;
}