Add EulerAngles to Quaternion and Shaders System
This commit is contained in:
parent
639e1b7608
commit
78dc21fee8
15 changed files with 291 additions and 32 deletions
|
@ -1,5 +1,7 @@
|
||||||
#require opengl,glew,glut,glu,al,alc,sndfile library
|
#require opengl,glew,glut,glu,al,alc,sndfile library
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
cmake_policy(SET CMP0015 NEW)
|
cmake_policy(SET CMP0015 NEW)
|
||||||
|
|
||||||
|
|
6
res/shaders/test.frag
Normal file
6
res/shaders/test.frag
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
uniform float a;
|
||||||
|
|
||||||
|
void main(void){
|
||||||
|
if(a >= 0)gl_FragColor = vec4(a,0,0,1);
|
||||||
|
else gl_FragColor = vec4(0,-a,0,1);
|
||||||
|
}
|
6
res/shaders/test.vert
Normal file
6
res/shaders/test.vert
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
void main(void){
|
||||||
|
gl_FrontColor = gl_Color;
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||||
|
}
|
|
@ -3,8 +3,11 @@
|
||||||
ALCdevice* Audio::device;
|
ALCdevice* Audio::device;
|
||||||
ALCcontext* Audio::context;
|
ALCcontext* Audio::context;
|
||||||
|
|
||||||
ALuint Audio::loadSound(const std::string Filename){
|
ALuint Audio::loadSound(std::string Filename){
|
||||||
// Ouverture du fichier audio avec libsndfile
|
// Ouverture du fichier audio avec libsndfile
|
||||||
|
std::string* path = new std::string("res/sounds/");
|
||||||
|
Filename = *path + Filename;
|
||||||
|
delete path;
|
||||||
SF_INFO FileInfos;
|
SF_INFO FileInfos;
|
||||||
SNDFILE* File = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
|
SNDFILE* File = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
|
||||||
if (File == NULL){
|
if (File == NULL){
|
||||||
|
|
|
@ -15,7 +15,7 @@ class Audio{
|
||||||
public:
|
public:
|
||||||
static void initOpenAL();
|
static void initOpenAL();
|
||||||
static void destroyOpenAL();
|
static void destroyOpenAL();
|
||||||
static ALuint loadSound(const std::string);
|
static ALuint loadSound(std::string);
|
||||||
static ALuint createSource(ALuint*);
|
static ALuint createSource(ALuint*);
|
||||||
static ALuint createSource(const std::string);
|
static ALuint createSource(const std::string);
|
||||||
static void destroySound(ALuint*);
|
static void destroySound(ALuint*);
|
||||||
|
|
16
src/main.cpp
16
src/main.cpp
|
@ -1,11 +1,10 @@
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
#include "renderer.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
//43,2ko
|
|
||||||
|
|
||||||
void event(SDL_Event e){
|
void event(SDL_Event e){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,24 +12,29 @@ void event(SDL_Event e){
|
||||||
int main(int argc, char** argv){
|
int main(int argc, char** argv){
|
||||||
Window::initWindow(800,600,"Test");
|
Window::initWindow(800,600,"Test");
|
||||||
Audio::initOpenAL();
|
Audio::initOpenAL();
|
||||||
|
GLuint s = Shader::createShader("test.vert","test.frag");
|
||||||
|
float i = 0;
|
||||||
|
Shader::bindShader(&s);
|
||||||
while(!Window::closeRequested){//main loop
|
while(!Window::closeRequested){//main loop
|
||||||
|
Shader::setUniform(&s,"a",cos(i));
|
||||||
Window::pollEvent(&event);
|
Window::pollEvent(&event);
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glBegin(GL_POINTS);
|
glBegin(GL_QUADS);
|
||||||
glVertex2f(-1,-1);
|
glVertex2f(-1,-1);
|
||||||
glVertex2f(-1,1);
|
glVertex2f(-1,1);
|
||||||
glVertex2f(1,-1);
|
glVertex2f(1,1);
|
||||||
glVertex2f(1,-1);
|
glVertex2f(1,-1);
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
Window::displayUpdate();
|
Window::displayUpdate();
|
||||||
|
i+=1/5000.0f;
|
||||||
}
|
}
|
||||||
|
Shader::destroyShader(&s);
|
||||||
Audio::destroyOpenAL();
|
Audio::destroyOpenAL();
|
||||||
Window::destroyWindow();
|
Window::destroyWindow();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,10 +40,6 @@ int norm(float v){
|
||||||
return (v>=0)?1:-1;
|
return (v>=0)?1:-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float abs(float a){
|
|
||||||
return (a<0)?-a:a;
|
|
||||||
}
|
|
||||||
|
|
||||||
float nearest(float a, float b, float v){
|
float nearest(float a, float b, float v){
|
||||||
float absA = abs(a);
|
float absA = abs(a);
|
||||||
float absB = abs(b);
|
float absB = abs(b);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
extern const float PI;
|
extern const float PI;
|
||||||
float lerp(float,float,float);
|
float lerp(float,float,float);
|
||||||
|
@ -15,7 +16,6 @@ float max(float,float);
|
||||||
float toRadians(float);
|
float toRadians(float);
|
||||||
float toDegrees(float);
|
float toDegrees(float);
|
||||||
int norm(float);
|
int norm(float);
|
||||||
float abs(float);
|
|
||||||
float nearest(float,float,float);
|
float nearest(float,float,float);
|
||||||
|
|
||||||
class Vector4f;
|
class Vector4f;
|
||||||
|
@ -201,6 +201,7 @@ class Quaternion{
|
||||||
Matrix4f ToMatrix();
|
Matrix4f ToMatrix();
|
||||||
Quaternion NLerp(Quaternion,float,bool);
|
Quaternion NLerp(Quaternion,float,bool);
|
||||||
Quaternion SLerp(Quaternion,float,bool);
|
Quaternion SLerp(Quaternion,float,bool);
|
||||||
|
Vector3f EulerAngles();
|
||||||
Vector3f GetForward();
|
Vector3f GetForward();
|
||||||
Vector3f GetBackward();
|
Vector3f GetBackward();
|
||||||
Vector3f GetRight();
|
Vector3f GetRight();
|
||||||
|
|
|
@ -220,3 +220,4 @@ float* Matrix4f::GetComponents(){
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@ Quaternion::Quaternion(float x, float y, float z, float w){
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion::Quaternion(Vector3f axis,float angle){
|
Quaternion::Quaternion(Vector3f axis,float angle){
|
||||||
float s = (float) sin(angle / 2);
|
float s = (float) sin(angle / 2.0);
|
||||||
float c = (float) cos(angle / 2);
|
float c = (float) cos(angle / 2.0);
|
||||||
|
|
||||||
this->x = axis.x * s;
|
this->x = axis.x * s;
|
||||||
this->y = axis.y * s;
|
this->y = axis.y * s;
|
||||||
|
@ -44,22 +44,19 @@ Quaternion::Quaternion(const Quaternion& q,Vector3f axis,float angle){
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion::Quaternion(Vector3f euler){
|
Quaternion::Quaternion(Vector3f euler){
|
||||||
float c1 = (float) cos(euler.x / 2);
|
double h = euler.y * PI/360.0f;
|
||||||
float s1 = (float) sin(euler.x / 2);
|
double a = euler.z * PI/360.0f;
|
||||||
|
double b = euler.x * PI/360.0f;
|
||||||
float c2 = (float) cos(euler.y / 2);
|
double c1 = cos(h);
|
||||||
float s2 = (float) sin(euler.y / 2);
|
double c2 = cos(a);
|
||||||
|
double c3 = cos(b);
|
||||||
float c3 = (float) cos(euler.z / 2);
|
double s1 = sin(h);
|
||||||
float s3 = (float) sin(euler.z / 2);
|
double s2 = sin(a);
|
||||||
|
double s3 = sin(b);
|
||||||
float c1c2 = c1 * c2;
|
w = round((c1*c2*c3 - s1*s2*s3)*100000.0)/100000.0;
|
||||||
float s1s2 = s1 * s2;
|
x = round((s1*s2*c3 + c1*c2*s3)*100000.0)/100000.0;
|
||||||
|
y = round((s1*c2*c3 + c1*s2*s3)*100000.0)/100000.0;
|
||||||
x = c1c2 * s3 + s1s2 * c3;
|
z = round((c1*s2*c3 - s1*c2*s3)*100000.0)/100000.0;
|
||||||
y = s1 * c2 * c3 + c1 * s2 * s3;
|
|
||||||
z = c1 * s2 * c3 - s1 * c2 * s3;
|
|
||||||
w = c1c2 * c3 - s1s2 * s3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion::Quaternion(Matrix4f rot){
|
Quaternion::Quaternion(Matrix4f rot){
|
||||||
|
@ -276,3 +273,35 @@ Vector3f Quaternion::GetUp(){
|
||||||
Vector3f Quaternion::GetDown(){
|
Vector3f Quaternion::GetDown(){
|
||||||
return Vector3f(0, -1, 0).Rotate(*this);
|
return Vector3f(0, -1, 0).Rotate(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector3f Quaternion::EulerAngles(){
|
||||||
|
Vector3f euler = Vector3f();
|
||||||
|
double qw = w;
|
||||||
|
double qx = x;
|
||||||
|
double qy = y;
|
||||||
|
double qz = z;
|
||||||
|
double qw2 = qw*qw;
|
||||||
|
double qx2 = qx*qx;
|
||||||
|
double qy2 = qy*qy;
|
||||||
|
double qz2 = qz*qz;
|
||||||
|
double test= qx*qy + qz*qw;
|
||||||
|
if (test > 0.499) {
|
||||||
|
euler.y = 360/PI*atan2(qx,qw);
|
||||||
|
euler.z = 90;
|
||||||
|
euler.x = 0;
|
||||||
|
return euler;
|
||||||
|
}
|
||||||
|
if (test < -0.499) {
|
||||||
|
euler.y = -360/PI*atan2(qx,qw);
|
||||||
|
euler.z = -90;
|
||||||
|
euler.x = 0;
|
||||||
|
return euler;
|
||||||
|
}
|
||||||
|
double h = atan2(2*qy*qw-2*qx*qz,1-2*qy2-2*qz2);
|
||||||
|
double a = asin(2*qx*qy+2*qz*qw);
|
||||||
|
double b = atan2(2*qx*qw-2*qy*qz,1-2*qx2-2*qz2);
|
||||||
|
euler.y = round(h*180/PI);
|
||||||
|
euler.z = round(a*180/PI);
|
||||||
|
euler.x = round(b*180/PI);
|
||||||
|
return euler;
|
||||||
|
}
|
||||||
|
|
38
src/renderer.h
Normal file
38
src/renderer.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef RENDERER_H
|
||||||
|
#define RENDERER_H
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <fstream>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <string>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <SDL2/SDL.h>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
|
|
||||||
|
bool fileExists(const std::string&);
|
||||||
|
|
||||||
|
class Shader{
|
||||||
|
public:
|
||||||
|
static std::string LoadSource(const char*);
|
||||||
|
static GLuint createShader(const char*,const char*);
|
||||||
|
static void destroyShader(GLuint*);
|
||||||
|
static void bindShader(GLuint*);
|
||||||
|
static void unbindShader();
|
||||||
|
static void setUniform(GLuint*,const char*,float);
|
||||||
|
static void setUniform(GLuint*,const char*,Vector3f);
|
||||||
|
static void setUniform(GLuint*,const char*,Vector2f);
|
||||||
|
static void setUniform(GLuint*,const char*,Vector4f);
|
||||||
|
static void setUniform(GLuint*,const char*,Quaternion);
|
||||||
|
static void setUniform(GLuint*,const char*,Matrix4f);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
174
src/shader.cpp
Normal file
174
src/shader.cpp
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
#include "renderer.h"
|
||||||
|
|
||||||
|
std::string Shader::LoadSource(const char* filename){
|
||||||
|
std::string file("");
|
||||||
|
std::ifstream in_stream;
|
||||||
|
std::string line;
|
||||||
|
std::vector<const char*> v;
|
||||||
|
|
||||||
|
std::string* ff = new std::string(filename);
|
||||||
|
std::string* path = new std::string("res/shaders/");
|
||||||
|
*ff = *path + *ff;
|
||||||
|
in_stream.open(ff->c_str());
|
||||||
|
delete ff;
|
||||||
|
delete path;
|
||||||
|
|
||||||
|
int l = 1;
|
||||||
|
for( std::string line; getline( in_stream, line ); )
|
||||||
|
{
|
||||||
|
if(line.substr(0,8) != "#include"){
|
||||||
|
file += line + "\n";
|
||||||
|
}else{
|
||||||
|
std::string str = line;
|
||||||
|
std::istringstream buf(str);
|
||||||
|
std::istream_iterator<std::string> beg(buf), end;
|
||||||
|
|
||||||
|
std::vector<std::string> tokens(beg, end); // done!
|
||||||
|
if(tokens.size() == 2){
|
||||||
|
std::string fileName = tokens.at(1).substr(1,tokens.at(1).size() - 2);
|
||||||
|
bool a = fileExists(fileName);
|
||||||
|
if (a){
|
||||||
|
if(std::find(v.begin(), v.end(), fileName.c_str()) == v.end()){
|
||||||
|
file = file + std::string(Shader::LoadSource(fileName.c_str()));
|
||||||
|
v.push_back(fileName.c_str());
|
||||||
|
}
|
||||||
|
}else{printf("Syntax incorrect #%d : include file '%s' not exist",l,fileName.c_str());}
|
||||||
|
}else{
|
||||||
|
printf("Syntax incorrect #%d : expected identifier after ‘include’ token",l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l++;
|
||||||
|
}
|
||||||
|
in_stream.close();
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::destroyShader(GLuint* s){
|
||||||
|
glDeleteProgram(*s);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint Shader::createShader(const char* vertName,const char* fragName){
|
||||||
|
std::string vert = Shader::LoadSource(vertName);
|
||||||
|
std::string frag = Shader::LoadSource(fragName);
|
||||||
|
GLuint vertShader;
|
||||||
|
GLuint fragShader;
|
||||||
|
|
||||||
|
vertShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
fragShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
if(vertShader == 0 || fragShader == 0){
|
||||||
|
printf("Shader not created !");
|
||||||
|
if(vertShader != 0)glDeleteShader(vertShader);
|
||||||
|
if(fragShader != 0)glDeleteShader(fragShader);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* a = ((const char*)vert.c_str());
|
||||||
|
const char* b = ((const char*)frag.c_str());
|
||||||
|
|
||||||
|
glShaderSource(vertShader,1,(const GLchar**)&a,NULL);
|
||||||
|
glShaderSource(fragShader,1,(const GLchar**)&b,NULL);
|
||||||
|
|
||||||
|
glCompileShader(vertShader);
|
||||||
|
GLint compile_status = GL_TRUE;
|
||||||
|
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &compile_status);
|
||||||
|
if(compile_status != GL_TRUE){
|
||||||
|
char *log = NULL;
|
||||||
|
GLsizei logsize = 0;
|
||||||
|
glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logsize);
|
||||||
|
log = (char*)malloc(logsize + 1);
|
||||||
|
if(log == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "impossible d'allouer de la memoire !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(log, '\0', logsize + 1);
|
||||||
|
glGetShaderInfoLog(vertShader, logsize, &logsize, log);
|
||||||
|
fprintf(stderr, "impossible de compiler le shader '%s' :\n%s",vertName,log);
|
||||||
|
free(log);
|
||||||
|
glDeleteShader(vertShader);
|
||||||
|
glDeleteShader(fragShader);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
glCompileShader(fragShader);
|
||||||
|
compile_status = GL_TRUE;
|
||||||
|
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &compile_status);
|
||||||
|
if(compile_status != GL_TRUE){
|
||||||
|
char *log = NULL;
|
||||||
|
GLsizei logsize = 0;
|
||||||
|
glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logsize);
|
||||||
|
log = (char*)malloc(logsize + 1);
|
||||||
|
if(log == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "impossible d'allouer de la memoire !\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(log, '\0', logsize + 1);
|
||||||
|
glGetShaderInfoLog(fragShader, logsize, &logsize, log);
|
||||||
|
fprintf(stderr, "impossible de compiler le shader '%s' :\n%s",fragName,log);
|
||||||
|
free(log);
|
||||||
|
glDeleteShader(vertShader);
|
||||||
|
glDeleteShader(fragShader);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
GLuint program;
|
||||||
|
program = glCreateProgram();
|
||||||
|
glAttachShader(program,vertShader);
|
||||||
|
glAttachShader(program,fragShader);
|
||||||
|
glLinkProgram(program);
|
||||||
|
GLint linked;
|
||||||
|
glGetProgramiv(program, GL_LINK_STATUS, &linked);
|
||||||
|
if (!linked)
|
||||||
|
{
|
||||||
|
printf("Program not linked !");
|
||||||
|
glDeleteShader(vertShader);
|
||||||
|
glDeleteShader(fragShader);
|
||||||
|
glDeleteProgram(program);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
glValidateProgram(program);
|
||||||
|
glDeleteShader(vertShader);
|
||||||
|
glDeleteShader(fragShader);
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::bindShader(GLuint* s){
|
||||||
|
glUseProgram(*s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::unbindShader(){
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fileExists(const std::string& filename)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
if (stat(filename.c_str(), &buf) != -1)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,float value){
|
||||||
|
glUniform1f(glGetUniformLocation(*program,varName),value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,Vector2f v){
|
||||||
|
glUniform2f(glGetUniformLocation(*program,varName),v.x,v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,Vector3f v){
|
||||||
|
glUniform3f(glGetUniformLocation(*program,varName),v.x,v.y,v.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,Vector4f v){
|
||||||
|
glUniform4f(glGetUniformLocation(*program,varName),v.x,v.y,v.z,v.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,Quaternion v){
|
||||||
|
glUniform4f(glGetUniformLocation(*program,varName),v.x,v.y,v.z,v.w);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shader::setUniform(GLuint* program,const char* varName,Matrix4f ma){
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(*program,varName),01,0,ma.GetComponents());
|
||||||
|
}
|
|
@ -49,7 +49,6 @@ void Window::destroyWindow(){
|
||||||
SDL_GL_DeleteContext ( context ) ;
|
SDL_GL_DeleteContext ( context ) ;
|
||||||
SDL_DestroyWindow(pWindow);
|
SDL_DestroyWindow(pWindow);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::displayUpdate(){
|
void Window::displayUpdate(){
|
||||||
|
|
Reference in a new issue