204 lines
5.9 KiB
C++
204 lines
5.9 KiB
C++
|
#define SFML_STATIC
|
||
|
#define GLEW_STATIC
|
||
|
#include <SFML/Graphics.hpp>
|
||
|
#include <GL/glew.h>
|
||
|
#include <glm/glm.hpp>
|
||
|
#include <glm/gtc/matrix_transform.hpp>
|
||
|
#include "ShaderManager.h"
|
||
|
#define PI 3.14159
|
||
|
|
||
|
double degToRad(double deg) {return deg*(PI/180.f);}
|
||
|
double radToDeg(double rad) {return rad*(180.f/PI);}
|
||
|
|
||
|
glm::mat4 calcCameraMatrix(glm::vec3 &camTarget, glm::vec3 &camSphere);
|
||
|
|
||
|
int main() {
|
||
|
sf::RenderWindow window(sf::VideoMode(200, 200), "opengl or something", sf::Style::Default, sf::ContextSettings(32));
|
||
|
window.setVerticalSyncEnabled(true);
|
||
|
|
||
|
if(glewInit() != GLEW_OK) return -1;
|
||
|
|
||
|
agl::ShaderProgram shader;
|
||
|
int err = shader.initProgram(2, "vertex.vert" , GL_VERTEX_SHADER,
|
||
|
"fragment.frag" , GL_FRAGMENT_SHADER);
|
||
|
|
||
|
if(err == -1) {
|
||
|
printf("%s\n", shader.getLastError());
|
||
|
getchar();
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
GLuint sp = shader.getProgram();
|
||
|
|
||
|
GLint camToClip = glGetUniformLocation(sp, "camToClip"),
|
||
|
worldToCam = glGetUniformLocation(sp, "worldToCam"),
|
||
|
modelToWorld = glGetUniformLocation(sp, "modelToWorld");
|
||
|
|
||
|
glm::mat4 frustum = glm::perspective<float>(90.0f, window.getSize().x/window.getSize().y, 1.0, 1000.0);
|
||
|
|
||
|
//glm::vec3 camTarget(-38.f, -104.f, -94.f);
|
||
|
glm::vec3 camTarget(0, .4f, 0);
|
||
|
glm::vec3 camSphereCoords(67.5f, -46.0f, 150.0f);
|
||
|
|
||
|
GLuint vao, vbuf, vabuf;
|
||
|
|
||
|
const float vertexData[] = {
|
||
|
+1.0f, +1.0f, +1.0f, // 0
|
||
|
+1.0f, +1.0f, -1.0f, // 1
|
||
|
+1.0f, -1.0f, +1.0f, // 2
|
||
|
+1.0f, -1.0f, -1.0f, // 3
|
||
|
-1.0f, +1.0f, +1.0f, // 4
|
||
|
-1.0f, +1.0f, -1.0f, // 5
|
||
|
-1.0f, -1.0f, +1.0f, // 6
|
||
|
-1.0f, -1.0f, -1.0f // 7
|
||
|
|
||
|
+0.0f, +0.0f, +0.0f,
|
||
|
+0.0f, +0.0f, +1.0f,
|
||
|
+0.0f, +1.0f, +0.0f,
|
||
|
+0.0f, +1.0f, +1.0f,
|
||
|
+1.0f, +0.0f, +0.0f,
|
||
|
+1.0f, +0.0f, +1.0f,
|
||
|
+1.0f, +1.0f, +0.0f,
|
||
|
+1.0f, +1.0f, +1.0f
|
||
|
};
|
||
|
|
||
|
const GLshort indexData[] = {
|
||
|
// front
|
||
|
4, 0, 6,
|
||
|
0, 2, 6,
|
||
|
|
||
|
// right
|
||
|
0, 1, 2,
|
||
|
1, 3, 2,
|
||
|
|
||
|
// back
|
||
|
1, 5, 3,
|
||
|
5, 7, 3,
|
||
|
|
||
|
// left
|
||
|
5, 4, 7,
|
||
|
4, 6, 7,
|
||
|
|
||
|
// top
|
||
|
5, 1, 4,
|
||
|
1, 0, 4,
|
||
|
|
||
|
// bottom
|
||
|
3, 7, 2,
|
||
|
7, 6, 2
|
||
|
};
|
||
|
|
||
|
glGenBuffers(1, &vbuf);
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, vbuf);
|
||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||
|
|
||
|
glGenBuffers(1, &vabuf);
|
||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vabuf);
|
||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||
|
|
||
|
glGenVertexArrays(1, &vao);
|
||
|
glBindVertexArray(vao);
|
||
|
glBindBuffer(GL_ARRAY_BUFFER, vbuf);
|
||
|
size_t cpos = sizeof(float)*24; // 3*8
|
||
|
|
||
|
glEnableVertexAttribArray(0);
|
||
|
glEnableVertexAttribArray(1);
|
||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
|
||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)cpos);
|
||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vabuf);
|
||
|
glBindVertexArray(0);
|
||
|
|
||
|
glEnable(GL_CULL_FACE);
|
||
|
glCullFace(GL_BACK);
|
||
|
glFrontFace(GL_CW);
|
||
|
|
||
|
glEnable(GL_DEPTH_TEST);
|
||
|
glDepthMask(GL_TRUE);
|
||
|
glDepthFunc(GL_LEQUAL);
|
||
|
glDepthRange(0.0, 1.0);
|
||
|
|
||
|
sf::Clock clk;
|
||
|
|
||
|
shader.StartProgram();
|
||
|
glUniformMatrix4fv(camToClip, 1, GL_FALSE, &frustum[0][0]);
|
||
|
shader.EndProgram();
|
||
|
|
||
|
while (window.isOpen()) {
|
||
|
glClearColor(0.0,0.0,0.0,0.0);
|
||
|
glClearDepth(1.0);
|
||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||
|
|
||
|
shader.StartProgram();
|
||
|
glBindVertexArray(vao);
|
||
|
|
||
|
glm::mat4 model = glm::scale(glm::mat4(1.0f), glm::vec3(50.f, 50.f, 50.f));
|
||
|
printf("camtarget %f %f %f\n", camTarget.x, camTarget.y, camTarget.z);
|
||
|
glUniformMatrix4fv(worldToCam, 1, GL_FALSE, &(calcCameraMatrix(camTarget, camSphereCoords))[0][0]);
|
||
|
glUniformMatrix4fv(modelToWorld, 1, GL_FALSE, &model[0][0]);
|
||
|
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
|
||
|
|
||
|
glBindVertexArray(0);
|
||
|
shader.EndProgram();
|
||
|
|
||
|
window.display();
|
||
|
|
||
|
sf::Event event;
|
||
|
while (window.pollEvent(event)) {
|
||
|
if (event.type == sf::Event::Closed)
|
||
|
window.close();
|
||
|
else if(event.type == sf::Event::Resized) {
|
||
|
glViewport(0, 0, event.size.width, event.size.height);
|
||
|
frustum = glm::perspective<float>(90.0f, float(event.size.width)/float(event.size.height), 0.5, 100.0);
|
||
|
shader.StartProgram();
|
||
|
glUniformMatrix4fv(camToClip, 1, GL_FALSE, &frustum[0][0]);
|
||
|
shader.EndProgram();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) camTarget.x -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) camTarget.x += .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)) camTarget.z -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) camTarget.z += .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) camTarget.y -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::E)) camTarget.y += .1f;
|
||
|
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::I)) camSphereCoords.y -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::K)) camSphereCoords.y += .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::J)) camSphereCoords.x -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::L)) camSphereCoords.x += .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::U)) camSphereCoords.z -= .1f;
|
||
|
if(sf::Keyboard::isKeyPressed(sf::Keyboard::O)) camSphereCoords.z += .1f;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
glm::mat4 calcCameraMatrix(glm::vec3 &camTarget, glm::vec3 &camSphere) {
|
||
|
float phi = degToRad(camSphere.x);
|
||
|
float theta = degToRad(camSphere.y + 90.f);
|
||
|
float radius = camSphere.z;
|
||
|
|
||
|
glm::vec3 dirToCam(sin(theta)*cos(phi), cos(theta), sin(theta)*sin(phi));
|
||
|
glm::vec3 camPt = (dirToCam * radius) + camTarget;
|
||
|
printf("%f %f %f\n", camPt.x, camPt.y, camPt.z);
|
||
|
|
||
|
glm::vec3 lookDir = glm::normalize(camTarget - camPt);
|
||
|
glm::vec3 upDir = glm::normalize(glm::vec3(0.0f, 1.0, 0.0f));
|
||
|
|
||
|
glm::vec3 rightDir = glm::normalize(glm::cross(lookDir, upDir));
|
||
|
glm::vec3 perpUpDir = glm::cross(rightDir, lookDir);
|
||
|
|
||
|
glm::mat4 rotMat(1.0f);
|
||
|
rotMat[0] = glm::vec4(rightDir, 0.0f);
|
||
|
rotMat[1] = glm::vec4(perpUpDir, 0.0f);
|
||
|
rotMat[2] = glm::vec4(-lookDir, 0.0f);
|
||
|
|
||
|
rotMat = glm::transpose(rotMat);
|
||
|
|
||
|
glm::mat4 transMat(1.0f);
|
||
|
transMat[3] = glm::vec4(-camPt, 1.0f);
|
||
|
|
||
|
return rotMat * transMat;
|
||
|
}
|