Add demo shader and spinning colored cube
This commit is contained in:
1 parent
8e6ec5f820
commit
8dc6e97585
8 files changed
+149
-38
No files matched your search
Submodule
+1
Submodule libs/gl3n added at cb233335f5.
@@ -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
@@ -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);
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user