Initial commit.
This commit is contained in:
commit
44b5f2392f
98 changed files with 11750 additions and 0 deletions
92
shader.cpp
Normal file
92
shader.cpp
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
// -*- C++ -*-
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "model.h"
|
||||
#include "resource.h"
|
||||
#include "shader.h"
|
||||
|
||||
using namespace mbostock;
|
||||
|
||||
static Shader* defaultShader_ = NULL;
|
||||
static Shader* normalShader_ = NULL;
|
||||
static Shader* wireframeShader_ = NULL;
|
||||
|
||||
class DefaultShader : public Shader {
|
||||
public:
|
||||
virtual void display(Model& model) {
|
||||
model.display();
|
||||
}
|
||||
};
|
||||
|
||||
class WireframeShader : public Shader {
|
||||
public:
|
||||
virtual void display(Model& model) {
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
model.display();
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
}
|
||||
};
|
||||
|
||||
Shader* Shaders::defaultShader() {
|
||||
if (defaultShader_ == NULL) {
|
||||
defaultShader_ = new DefaultShader();
|
||||
}
|
||||
return defaultShader_;
|
||||
}
|
||||
|
||||
Shader* Shaders::wireframeShader() {
|
||||
if (wireframeShader_ == NULL) {
|
||||
wireframeShader_ = new WireframeShader();
|
||||
}
|
||||
return wireframeShader_;
|
||||
}
|
||||
|
||||
Shader* Shaders::normalShader() {
|
||||
if (normalShader_ == NULL) {
|
||||
normalShader_ = new GlslShader("normal.vert", "normal.frag");
|
||||
}
|
||||
return normalShader_;
|
||||
}
|
||||
|
||||
GlslShader::GlslShader(const char* vertexPath, const char* fragmentPath)
|
||||
: vertexPath_(vertexPath), fragmentPath_(fragmentPath),
|
||||
program_(GL_NONE) {
|
||||
}
|
||||
|
||||
GlslShader::~GlslShader() {
|
||||
if (program_ != GL_NONE) {
|
||||
glDeleteProgram(program_);
|
||||
}
|
||||
}
|
||||
|
||||
void GlslShader::initialize() {
|
||||
if (program_ != GL_NONE) {
|
||||
glDeleteProgram(program_);
|
||||
}
|
||||
program_ = glCreateProgram();
|
||||
attach(vertexPath_, GL_VERTEX_SHADER);
|
||||
attach(fragmentPath_, GL_FRAGMENT_SHADER);
|
||||
link();
|
||||
}
|
||||
|
||||
void GlslShader::attach(const char* path, GLenum shaderType) {
|
||||
GLuint shader = glCreateShader(shaderType);
|
||||
const char* source = Resources::readFile(path);
|
||||
glShaderSource(shader, 1, &source, NULL);
|
||||
delete[] source;
|
||||
glCompileShader(shader);
|
||||
glAttachShader(program_, shader);
|
||||
}
|
||||
|
||||
void GlslShader::link() {
|
||||
glLinkProgram(program_);
|
||||
}
|
||||
|
||||
void GlslShader::display(Model& model) {
|
||||
glDisable(GL_LIGHTING);
|
||||
glUseProgram(program_);
|
||||
model.display();
|
||||
glUseProgram(GL_NONE);
|
||||
glEnable(GL_LIGHTING);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue