Kaynağa Gözat

Try to factor all the recent GLSL stuff in the new Shader class.

legacy
Sam Hocevar sam 15 yıl önce
ebeveyn
işleme
01be151c62
12 değiştirilmiş dosya ile 187 ekleme ve 51 silme
  1. +1
    -1
      src/Makefile.am
  2. +1
    -0
      src/core.h
  3. +13
    -9
      src/scene.cpp
  4. +101
    -0
      src/shader.cpp
  5. +37
    -0
      src/shader.h
  6. +10
    -41
      src/video.cpp
  7. +2
    -0
      win32/deushax.vcxproj
  8. +6
    -0
      win32/deushax.vcxproj.filters
  9. +2
    -0
      win32/editor.vcxproj
  10. +6
    -0
      win32/editor.vcxproj.filters
  11. +2
    -0
      win32/monsterz.vcxproj
  12. +6
    -0
      win32/monsterz.vcxproj.filters

+ 1
- 1
src/Makefile.am Dosyayı Görüntüle

@@ -9,7 +9,7 @@ liblol_a_SOURCES = \
timer.cpp timer.h bitfield.h profiler.cpp profiler.h input.h input.cpp \
world.cpp world.h sample.cpp sample.h sampler.cpp sampler.h \
text.cpp text.h emitter.cpp emitter.h numeric.h \
worldentity.cpp worldentity.h \
worldentity.cpp worldentity.h shader.cpp shader.h \
\
sdlinput.cpp sdlinput.h \
\


+ 1
- 0
src/core.h Dosyayı Görüntüle

@@ -42,6 +42,7 @@
#include "dict.h"
#include "map.h"
#include "layer.h"
#include "shader.h"

// Managers
#include "ticker.h"


+ 13
- 9
src/scene.cpp Dosyayı Görüntüle

@@ -36,7 +36,7 @@ struct Tile
};

#if LOL_EXPERIMENTAL
extern GLuint prog;
extern Shader *stdshader;
#endif

/*
@@ -160,29 +160,33 @@ void Scene::Render() // XXX: rename to Blit()
{ 0.0, 1.0 },
{ 1.0, 0.0 } };

GLuint vao, vbo[3];
GLuint vao, vbo[3], attr;

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(3, &vbo[0]);

attr = stdshader->GetAttribLocation("in_Position");
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(attr, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attr);

attr = stdshader->GetAttribLocation("in_Color");
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(attr, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attr);

attr = stdshader->GetAttribLocation("in_TexCoord");
glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tex, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(2);
glVertexAttribPointer(attr, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attr);

delete[] vertices;

glUseProgram(prog);
stdshader->Bind();
glBindVertexArray(vao);
Tiler::Bind(1 << 16);
glDrawArrays(GL_TRIANGLES, 0, 6);


+ 101
- 0
src/shader.cpp Dosyayı Görüntüle

@@ -0,0 +1,101 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://sam.zoy.org/projects/COPYING.WTFPL for more details.
//

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#include <cmath>
#include <cstdio>

#ifdef WIN32
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
#endif
#if defined __APPLE__ && defined __MACH__
# include <OpenGL/gl.h>
#else
# define GL_GLEXT_PROTOTYPES
# include <GL/gl.h>
#endif

#include "core.h"

/*
* Shader implementation class
*/

class ShaderData
{
friend class Shader;

private:
GLuint prog_id, vert_id, frag_id;
};

/*
* Public Shader class
*/

Shader::Shader(char const *vert, char const *frag)
: data(new ShaderData())
{
char buf[4096];
GLsizei len;

data->vert_id = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(data->vert_id, 1, &vert, NULL);
glCompileShader(data->vert_id);

glGetShaderInfoLog(data->vert_id, sizeof(buf), &len, buf);
if (len > 0)
fprintf(stderr, "ERROR: failed to compile vertex shader: %s", buf);

data->frag_id = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(data->frag_id, 1, &frag, NULL);
glCompileShader(data->frag_id);

glGetShaderInfoLog(data->frag_id, sizeof(buf), &len, buf);
if (len > 0)
fprintf(stderr, "ERROR: failed to compile fragment shader: %s", buf);

data->prog_id = glCreateProgram();
glAttachShader(data->prog_id, data->vert_id);
glAttachShader(data->prog_id, data->frag_id);

glLinkProgram(data->prog_id);
glValidateProgram(data->prog_id);
}

int Shader::GetAttribLocation(char const *attr) const
{
return glGetAttribLocation(data->prog_id, attr);
}

int Shader::GetUniformLocation(char const *uni) const
{
return glGetUniformLocation(data->prog_id, uni);
}

void Shader::Bind() const
{
glUseProgram(data->prog_id);
}

Shader::~Shader()
{
glDetachShader(data->prog_id, data->vert_id);
glDetachShader(data->prog_id, data->frag_id);
glDeleteShader(data->vert_id);
glDeleteShader(data->frag_id);
glDeleteProgram(data->prog_id);
delete data;
}


+ 37
- 0
src/shader.h Dosyayı Görüntüle

@@ -0,0 +1,37 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://sam.zoy.org/projects/COPYING.WTFPL for more details.
//

//
// The Shader class
// --------------
//

#if !defined __DH_SHADER_H__
#define __DH_SHADER_H__

class ShaderData;

class Shader
{
public:
Shader(char const *vert, char const *frag);
~Shader();

int GetAttribLocation(char const *attr) const;
int GetUniformLocation(char const *uni) const;

void Bind() const;

private:
ShaderData *data;
};

#endif // __DH_SHADER_H__


+ 10
- 41
src/video.cpp Dosyayı Görüntüle

@@ -29,8 +29,7 @@
#include "core.h"

#if LOL_EXPERIMENTAL
GLuint prog, sh1, sh2;
GLint uni_m1, uni_m2, uni_m3;
Shader *stdshader;

float4x4 projection_matrix, view_matrix, model_matrix;
#endif
@@ -86,37 +85,7 @@ void Video::Setup(int width, int height)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

#if LOL_EXPERIMENTAL
sh1 = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(sh1, 1, &vertexshader, NULL);
glCompileShader(sh1);

char buf[4096];
GLsizei dummy;
glGetShaderInfoLog(sh1, 4096, &dummy, buf);
fprintf(stderr, "sh1 %i: %s", sh1, buf);

sh2 = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(sh2, 1, &fragmentshader, NULL);
glCompileShader(sh2);

glGetShaderInfoLog(sh2, 4096, &dummy, buf);
fprintf(stderr, "sh2 %i: %s", sh2, buf);

prog = glCreateProgram();
glAttachShader(prog, sh1);
glAttachShader(prog, sh2);

glBindAttribLocation(prog, 0, "in_Position");
glBindAttribLocation(prog, 1, "in_Color");
glBindAttribLocation(prog, 2, "in_TexCoord");
glLinkProgram(prog);
glValidateProgram(prog);

uni_m1 = glGetUniformLocation(prog, "projection_matrix");
uni_m2 = glGetUniformLocation(prog, "view_matrix");
uni_m3 = glGetUniformLocation(prog, "model_matrix");

glClearColor(0.4f, 0.6f, 0.9f, 0.0f);
stdshader = new Shader(vertexshader, fragmentshader);
#endif
}

@@ -199,9 +168,13 @@ void Video::Clear()
model_matrix[1][1] = 0.5f;
model_matrix[2][2] = 0.5f;

glUniformMatrix4fv(uni_m1, 1, GL_FALSE, &projection_matrix[0][0]);
glUniformMatrix4fv(uni_m2, 1, GL_FALSE, &view_matrix[0][0]);
glUniformMatrix4fv(uni_m3, 1, GL_FALSE, &model_matrix[0][0]);
GLuint uni;
uni = stdshader->GetUniformLocation("projection_matrix");
glUniformMatrix4fv(uni, 1, GL_FALSE, &projection_matrix[0][0]);
uni = stdshader->GetUniformLocation("view_matrix");
glUniformMatrix4fv(uni, 1, GL_FALSE, &view_matrix[0][0]);
uni = stdshader->GetUniformLocation("model_matrix");
glUniformMatrix4fv(uni, 1, GL_FALSE, &model_matrix[0][0]);
#else
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
@@ -225,11 +198,7 @@ void Video::Clear()
void Video::Destroy()
{
#if LOL_EXPERIMENTAL
glDetachShader(prog, sh1);
glDetachShader(prog, sh2);
glDeleteShader(sh1);
glDeleteShader(sh2);
glDeleteProgram(prog);
delete stdshader;
#endif
}



+ 2
- 0
win32/deushax.vcxproj Dosyayı Görüntüle

@@ -35,6 +35,7 @@
<ClInclude Include="..\src\sampler.h" />
<ClInclude Include="..\src\scene.h" />
<ClInclude Include="..\src\sdlinput.h" />
<ClInclude Include="..\src\shader.h" />
<ClInclude Include="..\src\text.h" />
<ClInclude Include="..\src\ticker.h" />
<ClInclude Include="..\src\tiler.h" />
@@ -67,6 +68,7 @@
<ClCompile Include="..\src\sampler.cpp" />
<ClCompile Include="..\src\scene.cpp" />
<ClCompile Include="..\src\sdlinput.cpp" />
<ClCompile Include="..\src\shader.cpp" />
<ClCompile Include="..\src\text.cpp" />
<ClCompile Include="..\src\ticker.cpp" />
<ClCompile Include="..\src\tiler.cpp" />


+ 6
- 0
win32/deushax.vcxproj.filters Dosyayı Görüntüle

@@ -63,6 +63,9 @@
<ClInclude Include="..\src\sdlinput.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\shader.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\text.h">
<Filter>lolengine</Filter>
</ClInclude>
@@ -148,6 +151,9 @@
<ClCompile Include="..\src\sdlinput.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\shader.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\text.cpp">
<Filter>lolengine</Filter>
</ClCompile>


+ 2
- 0
win32/editor.vcxproj Dosyayı Görüntüle

@@ -35,6 +35,7 @@
<ClInclude Include="..\src\sampler.h" />
<ClInclude Include="..\src\scene.h" />
<ClInclude Include="..\src\sdlinput.h" />
<ClInclude Include="..\src\shader.h" />
<ClInclude Include="..\src\text.h" />
<ClInclude Include="..\src\ticker.h" />
<ClInclude Include="..\src\tiler.h" />
@@ -67,6 +68,7 @@
<ClCompile Include="..\src\sampler.cpp" />
<ClCompile Include="..\src\scene.cpp" />
<ClCompile Include="..\src\sdlinput.cpp" />
<ClCompile Include="..\src\shader.cpp" />
<ClCompile Include="..\src\text.cpp" />
<ClCompile Include="..\src\ticker.cpp" />
<ClCompile Include="..\src\tiler.cpp" />


+ 6
- 0
win32/editor.vcxproj.filters Dosyayı Görüntüle

@@ -63,6 +63,9 @@
<ClInclude Include="..\src\sdlinput.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\shader.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\text.h">
<Filter>lolengine</Filter>
</ClInclude>
@@ -148,6 +151,9 @@
<ClCompile Include="..\src\sdlinput.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\shader.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\text.cpp">
<Filter>lolengine</Filter>
</ClCompile>


+ 2
- 0
win32/monsterz.vcxproj Dosyayı Görüntüle

@@ -40,6 +40,7 @@
<ClInclude Include="..\src\sampler.h" />
<ClInclude Include="..\src\scene.h" />
<ClInclude Include="..\src\sdlinput.h" />
<ClInclude Include="..\src\shader.h" />
<ClInclude Include="..\src\text.h" />
<ClInclude Include="..\src\ticker.h" />
<ClInclude Include="..\src\tiler.h" />
@@ -76,6 +77,7 @@
<ClCompile Include="..\src\sampler.cpp" />
<ClCompile Include="..\src\scene.cpp" />
<ClCompile Include="..\src\sdlinput.cpp" />
<ClCompile Include="..\src\shader.cpp" />
<ClCompile Include="..\src\text.cpp" />
<ClCompile Include="..\src\ticker.cpp" />
<ClCompile Include="..\src\tiler.cpp" />


+ 6
- 0
win32/monsterz.vcxproj.filters Dosyayı Görüntüle

@@ -63,6 +63,9 @@
<ClInclude Include="..\src\sdlinput.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\shader.h">
<Filter>lolengine</Filter>
</ClInclude>
<ClInclude Include="..\src\text.h">
<Filter>lolengine</Filter>
</ClInclude>
@@ -153,6 +156,9 @@
<ClCompile Include="..\src\sdlinput.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\shader.cpp">
<Filter>lolengine</Filter>
</ClCompile>
<ClCompile Include="..\src\text.cpp">
<Filter>lolengine</Filter>
</ClCompile>


Yükleniyor…
İptal
Kaydet