#include <glm/glm.hpp>
#include <glm/ext.hpp>
#include <glm/gtc/type_ptr.hpp>
+#include <assimp/Importer.hpp>
+#include <assimp/scene.h>
+#include <assimp/postprocess.h>
#include "model.hpp"
#include "program.hpp"
#include "skybox.hpp"
std::vector<Skybox> skyboxes;
int activeSkybox = 0;
-Model *chest, *mirrorCube, *pbr;
+Assimp::Importer importer; // Need to keep this around, otherwise stuff disappears!
+Model *sceneModel;
-glm::vec3 camPos = glm::vec3(0.0f, 0.0f, -5.f);
-glm::vec3 camFront = glm::vec3(0.0f, 0.0f, 1.0f);
-glm::vec3 camUp = glm::vec3(0.0f, 1.0f, 0.0f);
+glm::vec3 camPos = {0, 0, -5}, camFront = {0, 0, 1}, camUp = {0, 1, 0};
+float fov = glm::radians(30.f), znear = 0.01f, zfar = 10000.f;
float yaw = 1.57, pitch = 0;
struct Light {
}
glm::mat4 projMat() {
- return glm::perspective(glm::radians(45.f), aspect(), 0.01f, 10000.f);
+ return glm::perspective(fov, aspect(), znear, zfar);
}
glm::mat4 viewMat() {
glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightColors"), 6, glm::value_ptr(lightColors[0]));
/* pbr->getRoot()->model = glm::rotate(glm::mat4(1.f), glm::radians(d * 10), glm::vec3(0, 1, 0)); */
- pbr->draw(skyboxes[activeSkybox], d * 1000);
+ sceneModel->draw(skyboxes[activeSkybox], d * 1000);
for (Light &light: lights) drawLight(light);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
}
+int findNodeTrans(struct aiNode *n, const struct aiString name, glm::mat4 *dest) {
+ if (strcmp(n->mName.data, name.data) == 0) {
+ *dest = aiMatrixToMat4(n->mTransformation);
+ return 0;
+ }
+ for (int i = 0; i < n->mNumChildren; i++) {
+ if (findNodeTrans(n->mChildren[i], name, dest) == 0) {
+ glm::mat4 t = aiMatrixToMat4(n->mTransformation);
+ *dest = t * *dest;
+ return 0;
+ }
+ }
+ return 1;
+}
+
void init() {
plainProg = new Program("plainvertex.glsl", "plainfrag.glsl");
glUseProgram(plainProg->progId);
pbrProg = new Program("pbrvert.glsl", "pbrfrag.glsl");
glUseProgram(pbrProg->progId);
- pbr = new Model("models/newtonsCradle.glb", *pbrProg);
+
+ const aiScene *scene = importer.ReadFile("models/newtonsCradle.glb", aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_GenNormals | aiProcess_FlipUVs);
+ if (!scene) {
+ std::cerr << importer.GetErrorString() << std::endl;
+ exit(1);
+ }
+
+ if (scene->mNumCameras > 0) {
+ struct aiCamera *cam = scene->mCameras[0];
+ glm::mat4 camTrans;
+ if (findNodeTrans(scene->mRootNode, cam->mName, &camTrans) != 0)
+ abort(); // there must be a node with the same name as camera
+
+ camPos = { camTrans[3][0], camTrans[3][1], camTrans[3][2] };
+
+ glm::vec3 camLookAt = glm::vec3(cam->mLookAt.x, cam->mLookAt.y, cam->mLookAt.z);
+ camFront = camLookAt - camPos;
+
+ camUp = glm::vec3(cam->mUp.x, cam->mUp.y, cam->mUp.z);
+
+ fov = cam->mHorizontalFOV;
+ // TODO: aspectRatio = cam->mAspect;
+ znear = cam->mClipPlaneNear;
+ zfar = cam->mClipPlaneFar;
+ }
+
+ sceneModel = new Model(scene, *pbrProg);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGB|GLUT_3_2_CORE_PROFILE);
glutInitWindowSize(windowWidth, windowHeight);
- int win = glutCreateWindow("Physically Based Rendering");
+ glutCreateWindow("Physically Based Rendering");
glutDisplayFunc(display);
glutReshapeFunc(reshape);