mirror of
https://github.com/ConjureETS/LOG750-LAB2.git
synced 2026-03-24 03:21:19 +00:00
WIP part 2
This commit is contained in:
parent
45e775b8f9
commit
d5ead46e24
@ -2,10 +2,10 @@
|
||||
# www.blender.org
|
||||
mtllib sonic_screwdriver.mtl
|
||||
o Plane
|
||||
v 34.241825 -2.527184 34.241825
|
||||
v -34.241825 -2.527184 34.241825
|
||||
v 34.241825 -2.527184 -34.241825
|
||||
v -34.241825 -2.527184 -34.241825
|
||||
v 0.0000 0.0000 0.0000
|
||||
v 0.0000 0.0000 0.0000
|
||||
v 0.0000 0.0000 0.0000
|
||||
v 0.0000 0.0000 0.0000
|
||||
vn 0.0000 1.0000 0.0000
|
||||
usemtl floor
|
||||
s off
|
||||
@ -49,6 +49,7 @@ vn 0.6711 0.7414 0.0000
|
||||
vn -0.6711 0.7414 0.0000
|
||||
vn 0.6711 -0.7414 0.0000
|
||||
vn -0.6711 -0.7414 0.0000
|
||||
g None
|
||||
usemtl None
|
||||
s off
|
||||
f 5//2 9//2 19//2 17//2
|
||||
@ -46904,6 +46905,7 @@ vn 0.1757 -0.2631 -0.9486
|
||||
vn 0.1825 -0.4409 -0.8788
|
||||
vn -0.2648 -0.4154 -0.8703
|
||||
vn -0.2929 -0.2506 -0.9227
|
||||
g metal
|
||||
usemtl metal
|
||||
s off
|
||||
f 3169//16 3161//16 2983//16 3074//16
|
||||
@ -57744,6 +57746,7 @@ f 11834//9151 11835//9215 11983//9181 11979//9201
|
||||
f 11846//9220 11847//9210 11956//9169 11974//8851
|
||||
f 11840//9222 11841//9213 11992//8808 11976//9198
|
||||
f 11842//9212 11843//9221 11975//9196 11991//9175
|
||||
g inside
|
||||
usemtl inside
|
||||
f 3842//9127 3841//9128 4001//8792 4002//8792
|
||||
f 3876//9174 3877//9173 3973//8796 3972//8796
|
||||
@ -57907,6 +57910,7 @@ f 3822//9147 3821//9148 3981//8792 3982//8792
|
||||
f 3851//9118 3850//9119 4010//8792 4011//8792
|
||||
f 3848//9121 3847//9122 4007//8792 4008//8792
|
||||
f 3845//9124 3844//9125 4004//8792 4005//8792
|
||||
g emitter
|
||||
usemtl emitter
|
||||
f 213//9223 317//9224 90//9225 89//9226
|
||||
f 92//9227 61//9228 62//9229 63//9230 64//9231 65//9232 66//9233 67//9234 68//9235 69//9236 70//9237 71//9238 72//9239 73//9240 74//9241 75//9242 76//9243 77//9244 78//9245 79//9246 80//9247 81//9248 82//9249 83//9250 84//9251 85//9252 86//9253 87//9254 88//9255 89//9226 90//9225 91//9256
|
||||
@ -58518,6 +58522,7 @@ f 54//9506 374//9826 375//9763 55//9443
|
||||
f 51//9453 371//9773 372//9774 52//9454
|
||||
f 48//9460 368//9780 369//9814 49//9494
|
||||
f 45//9493 365//9813 366//9746 46//9426
|
||||
g brass
|
||||
usemtl brass
|
||||
f 12613//8792 16576//9863 22882//9864 16575//9865
|
||||
f 12613//8792 16575//9865 22881//9866 16574//9867
|
||||
@ -66519,6 +66524,7 @@ f 15264//16532 22077//16501 25684//16118 21962//16471
|
||||
f 15264//16532 21962//16471 25685//16069 22088//16521
|
||||
f 15264//16532 22088//16521 25717//9178 22026//8774
|
||||
f 15264//16532 22026//8774 25716//8769 22077//16501
|
||||
g handle
|
||||
usemtl handle
|
||||
f 13031//16533 17482//16534 23380//16535 17552//16536
|
||||
f 13031//16533 17552//16536 23377//16537 17487//16538
|
||||
@ -68344,6 +68350,7 @@ f 15304//18315 22152//18244 23719//18004 18167//18102
|
||||
f 15304//18315 18167//18102 23725//18100 22165//18285
|
||||
f 15304//18315 22165//18285 25765//10872 22103//18316
|
||||
f 15304//18315 22103//18316 25759//18245 22152//18244
|
||||
g leather
|
||||
usemtl leather
|
||||
f 12774//18317 16928//18318 23074//18319 16927//18320
|
||||
f 12774//18317 16927//18320 23073//18321 16926//18322
|
||||
@ -69467,6 +69474,7 @@ f 15320//19415 17207//19159 23187//18904 17182//19414
|
||||
f 15320//19415 17182//19414 25800//18983 22199//19013
|
||||
f 15320//19415 22199//19013 25798//19017 17290//19406
|
||||
f 15320//19415 17290//19406 23206//19160 17207//19159
|
||||
g cotton
|
||||
usemtl cotton
|
||||
s off
|
||||
f 12013//19416 15321//19416 22251//19416 15323//19416
|
||||
|
||||
@ -58,7 +58,7 @@ bool Loader::loadFile(const std::string& filename)
|
||||
unload();
|
||||
|
||||
// Open the input file
|
||||
std::ifstream file(filename, std::ifstream::in);
|
||||
std::ifstream file(filename.c_str(), std::ifstream::in);
|
||||
if (!file.is_open())
|
||||
{
|
||||
std::cout << "Error: Failed to open file " << filename << " for reading!" << std::endl;
|
||||
@ -293,7 +293,7 @@ bool Loader::loadFile(const std::string& filename)
|
||||
void Loader::loadMtlFile(const std::string& filename)
|
||||
{
|
||||
// Open the input file
|
||||
std::ifstream file(filename, std::ifstream::in);
|
||||
std::ifstream file(filename.c_str(), std::ifstream::in);
|
||||
if (!file.is_open())
|
||||
{
|
||||
std::cout << "Error: Failed to open material file " << filename << " for reading!" << std::endl;
|
||||
|
||||
@ -3,10 +3,6 @@ uniform vec3 Kd;
|
||||
uniform vec3 Ks;
|
||||
uniform float Kn;
|
||||
|
||||
#version 400 core
|
||||
uniform sampler2D texCol;
|
||||
uniform sampler2D texNormal;
|
||||
|
||||
uniform vec3 lDirection;
|
||||
uniform bool isPhong;
|
||||
uniform vec3 pointLight[3];
|
||||
@ -70,8 +66,6 @@ main()
|
||||
{
|
||||
vec4 texColor;
|
||||
|
||||
texColor = ifColor;
|
||||
if(isPhong) {
|
||||
// Get lighting vectors
|
||||
vec3 LightDirection = normalize(lDirection);
|
||||
vec3 nfNormal = normalize(fNormal);
|
||||
@ -81,7 +75,5 @@ main()
|
||||
+ calcPointLight(texColor, fPosition, fNormal, 0)/4
|
||||
+ calcPointLight(texColor, fPosition, fNormal, 1)/4
|
||||
+ calcPointLight(texColor, fPosition, fNormal, 2)/4;
|
||||
} else {
|
||||
fColor = texColor;
|
||||
}
|
||||
fColor.a = 1.0;
|
||||
}
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
#include "../glnodes/shapes.h"
|
||||
#include "../libs/OBJLoader.h"
|
||||
#include <math.h>
|
||||
|
||||
#include <sstream>
|
||||
#include <qopengl.h>
|
||||
#include <QOpenGLShaderProgram>
|
||||
#include <QCoreApplication>
|
||||
@ -135,9 +135,10 @@ void Viewer::drawSkybox()
|
||||
}
|
||||
|
||||
void Viewer::loadToolObj() {
|
||||
objShader->bind();
|
||||
|
||||
// Load the obj file
|
||||
OBJLoader::Loader loader("../data/sonic_screwdriver.obj");
|
||||
OBJLoader::Loader loader("src/data/sonic_screwdriver.obj");
|
||||
|
||||
// Create a GL object for each mesh extracted from the OBJ file
|
||||
const std::vector<OBJLoader::Mesh>& meshes = loader.getMeshes();
|
||||
@ -175,11 +176,11 @@ void Viewer::loadToolObj() {
|
||||
// Set VAO that binds the shader vertices inputs to the buffer data
|
||||
glBindVertexArray(meshGL.vao);
|
||||
|
||||
glVertexAttribPointer(m_vPositionLoc, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(positionOffset));
|
||||
glEnableVertexAttribArray(m_vPositionLoc);
|
||||
glVertexAttribPointer(o_a_vPos, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(positionOffset));
|
||||
glEnableVertexAttribArray(o_a_vPos);
|
||||
|
||||
glVertexAttribPointer(m_vNormalLoc, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(normalOffset));
|
||||
glEnableVertexAttribArray(m_vNormalLoc);
|
||||
glVertexAttribPointer(o_a_vNorm, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(normalOffset));
|
||||
glEnableVertexAttribArray(o_a_vNorm);
|
||||
|
||||
// Add it to the list
|
||||
_meshesGL.push_back(meshGL);
|
||||
@ -216,6 +217,13 @@ void Viewer::draw()
|
||||
//sunRotate.rotate(15, 1, 0, 0);
|
||||
|
||||
m_program->setUniformValue(m_lDirLoc, (QMatrix4x4(modelViewMatrix.normalMatrix())*sunRotate * sun));
|
||||
|
||||
objShader->bind();
|
||||
|
||||
objShader->setUniformValue(o_u_prjMatrix, projectionMatrix);
|
||||
objShader->setUniformValue(o_u_lDir, (QMatrix4x4(modelViewMatrix.normalMatrix())*sunRotate * sun));
|
||||
|
||||
m_program->bind();
|
||||
selection->transform.setToIdentity();
|
||||
selection->transform.rotate(rotAngle, 0, 1, 0);
|
||||
|
||||
@ -224,6 +232,8 @@ void Viewer::draw()
|
||||
modelStack.push(modelViewMatrix);
|
||||
root.accept(*this);
|
||||
|
||||
drawTool();
|
||||
|
||||
drawUi();
|
||||
|
||||
sunRotate.setToIdentity();
|
||||
@ -231,7 +241,7 @@ void Viewer::draw()
|
||||
}
|
||||
|
||||
void Viewer::drawUi(){
|
||||
|
||||
m_program->bind();
|
||||
glCullFace(GL_BACK);
|
||||
glClear(GL_DEPTH_BUFFER_BIT); // make ui always on top
|
||||
|
||||
@ -377,7 +387,7 @@ void Viewer::init()
|
||||
setCamera(_cam);
|
||||
|
||||
// Our scene will be from -5 to 5 in X and Y (the grid will be 10x10).
|
||||
setSceneRadius(5);
|
||||
setSceneRadius(10);
|
||||
showEntireScene();
|
||||
|
||||
// Init OpenGL objects
|
||||
@ -389,6 +399,7 @@ void Viewer::init()
|
||||
initShaders();
|
||||
initGeometries();
|
||||
initBuffers();
|
||||
loadToolObj();
|
||||
|
||||
|
||||
{
|
||||
@ -462,7 +473,6 @@ void Viewer::resetSphereColors(){
|
||||
void Viewer::initShaders()
|
||||
{
|
||||
|
||||
|
||||
// Load vertex and fragment shaders
|
||||
m_program = new QOpenGLShaderProgram;
|
||||
colorPickerShaderProgram = m_program;
|
||||
@ -481,6 +491,7 @@ void Viewer::initShaders()
|
||||
|
||||
// Specify shader input paramters
|
||||
// The strings "vPosition", "mvMatrix", etc. have to match an attribute name in the vertex shader.
|
||||
{
|
||||
if ((m_vPositionLocation = m_program->attributeLocation("vPosition")) < 0)
|
||||
qDebug() << "Unable to find shader location for " << "vPosition";
|
||||
|
||||
@ -553,6 +564,7 @@ void Viewer::initShaders()
|
||||
if ((m_isPickingModeLoc = m_program->uniformLocation("isPickingMode")) < 0)
|
||||
qDebug() << "Unable to find m_shader location for" << "isPickingMode" << m_program->log();
|
||||
|
||||
}
|
||||
m_program->setUniformValue(m_isPhongLoc, true);
|
||||
m_program->setUniformValue(m_drawTextLoc, false);
|
||||
m_program->setUniformValue(m_isPickingModeLoc, false);
|
||||
@ -561,6 +573,46 @@ void Viewer::initShaders()
|
||||
m_program->setUniformValue(m_texColor, 0);
|
||||
m_program->setUniformValue(m_texNormal, 1);
|
||||
|
||||
objShader = new QOpenGLShaderProgram;
|
||||
if (!objShader->addShaderFromSourceFile(QOpenGLShader::Vertex, "src/shaders/objShader.vert")) {
|
||||
cerr << "Unable to load Shader" << endl
|
||||
<< "Log file:" << endl;
|
||||
qDebug() << objShader->log();
|
||||
}
|
||||
if (!objShader->addShaderFromSourceFile(QOpenGLShader::Fragment, "src/shaders/objShader.frag")) {
|
||||
cerr << "Unable to load Shader" << endl
|
||||
<< "Log file:" << endl;
|
||||
qDebug() << objShader->log();
|
||||
}
|
||||
|
||||
objShader->link();
|
||||
objShader->bind();
|
||||
|
||||
o_u_mvMatrix = objShader->uniformLocation("mvMatrix");
|
||||
o_u_prjMatrix = objShader->uniformLocation("projMatrix");
|
||||
o_u_nmMatrix = objShader->uniformLocation("normalMatrix");
|
||||
o_u_isPhong = objShader->uniformLocation("isPhong");
|
||||
o_u_lDir = objShader->uniformLocation("lDirection");
|
||||
|
||||
for(int i = 0; i < 3; i++) {
|
||||
std::ostringstream posAttr;
|
||||
std::ostringstream colAttr;
|
||||
posAttr << "pointLight[" << i << "]";
|
||||
colAttr << "pointLightCol[" << i << "]";
|
||||
|
||||
o_u_pointLightPos[i] = objShader->uniformLocation(posAttr.str().c_str());
|
||||
o_u_pointLightCol[i] = objShader->uniformLocation(colAttr.str().c_str());
|
||||
}
|
||||
|
||||
o_u_kd = objShader->uniformLocation("Kd");
|
||||
o_u_ks = objShader->uniformLocation("Ks");
|
||||
o_u_kn = objShader->uniformLocation("Kn");
|
||||
o_a_vPos = objShader->attributeLocation("vPosition");
|
||||
o_a_vNorm = objShader->attributeLocation("vNormal");
|
||||
|
||||
objShader->setUniformValue(o_u_isPhong, true);
|
||||
|
||||
m_program->bind();
|
||||
|
||||
s_texture = new QOpenGLTexture(QImage("src/data/skybox.jpg"));/*/
|
||||
s_texture = new QOpenGLTexture(QImage("src/data/uvLayoutGrid.png"));//*/
|
||||
@ -583,6 +635,7 @@ void Viewer::initShaders()
|
||||
|
||||
void Viewer::initGeometries()
|
||||
{
|
||||
m_program->bind();
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glEnable( GL_BLEND );
|
||||
glEnable( GL_CULL_FACE );
|
||||
@ -826,9 +879,38 @@ void Viewer::initBuffers(){
|
||||
|
||||
}
|
||||
|
||||
void Viewer::drawTool() {
|
||||
objShader->bind();
|
||||
|
||||
// Get projection and camera transformations
|
||||
QMatrix4x4 modelViewMatrix;
|
||||
|
||||
camera()->getModelViewMatrix(modelViewMatrix);
|
||||
|
||||
QMatrix4x4 scale = QMatrix4x4();
|
||||
// scale.translate(QVector3D(0,1.5,0));
|
||||
scale.scale(2.0);
|
||||
|
||||
objShader->setUniformValue(o_u_mvMatrix, modelViewMatrix * scale);
|
||||
objShader->setUniformValue(o_u_nmMatrix, modelViewMatrix.normalMatrix());
|
||||
|
||||
// Draw the meshes
|
||||
for (unsigned int i=0; i<_meshesGL.size(); ++i)
|
||||
{
|
||||
// Set its material properties
|
||||
objShader->setUniformValue(o_u_kd, _meshesGL[i].diffuse);
|
||||
objShader->setUniformValue(o_u_ks, _meshesGL[i].specular);
|
||||
objShader->setUniformValue(o_u_kn, _meshesGL[i].specularExponent);
|
||||
|
||||
// Draw the mesh
|
||||
glBindVertexArray(_meshesGL[i].vao);
|
||||
glDrawArrays(GL_TRIANGLES, 0, _meshesGL[i].numVertices);
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::visit(Cube &s)
|
||||
{
|
||||
m_program->bind();
|
||||
QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform);
|
||||
QColor* faceColor = new QColor;
|
||||
|
||||
@ -863,6 +945,8 @@ void Viewer::visit(Sphere &s)
|
||||
// std::cout << "Sphere found";
|
||||
QMatrix4x4 modelViewMatrix = modelStack.top() * QMatrix4x4(s.transform);
|
||||
|
||||
m_program->bind();
|
||||
|
||||
if(!isPickingActivated){
|
||||
glBindVertexArray(m_VAOs[VAO_Sphere]);
|
||||
m_program->setUniformValue(m_isSkyLoc, false);
|
||||
@ -880,13 +964,19 @@ void Viewer::visit(Sphere &s)
|
||||
|
||||
point = modelViewMatrix * point;
|
||||
|
||||
|
||||
int pointLocs[3] = {m_point1Loc, m_point2Loc, m_point3Loc};
|
||||
int pointCLocs[3] = {m_c1Loc, m_c2Loc, m_c3Loc};
|
||||
|
||||
m_program->setUniformValue(pointLocs[currentPoint], point);
|
||||
m_program->setUniformValue(pointCLocs[currentPoint], s.getColor());
|
||||
|
||||
objShader->bind();
|
||||
|
||||
objShader->setUniformValue(o_u_pointLightPos[currentPoint], point);
|
||||
objShader->setUniformValue(o_u_pointLightCol[currentPoint], s.getColor());
|
||||
|
||||
m_program->bind();
|
||||
|
||||
currentPoint = (currentPoint + 1) % 3;
|
||||
|
||||
glDrawElements(GL_TRIANGLES, numTriSphere*3, GL_UNSIGNED_INT, 0);
|
||||
@ -915,6 +1005,8 @@ void Viewer::visit(SceneGroup &s)
|
||||
void Viewer::setPhong(bool on) {
|
||||
m_program->bind();
|
||||
m_program->setUniformValue(m_isPhongLoc, on);
|
||||
objShader->bind();
|
||||
objShader->setUniformValue(o_u_isPhong, on);
|
||||
if(on) std::cout << "Phong ON\n";
|
||||
else std::cout << "Phong OFF\n";
|
||||
this->update();
|
||||
@ -963,6 +1055,14 @@ void Viewer::deleteSelected() {
|
||||
m_program->setUniformValue(pointCLocs[1], QColor(0,0,0));
|
||||
m_program->setUniformValue(pointCLocs[2], QColor(0,0,0));
|
||||
|
||||
objShader->bind();
|
||||
|
||||
objShader->setUniformValue(o_u_pointLightCol[0], QColor(0,0,0));
|
||||
objShader->setUniformValue(o_u_pointLightCol[1], QColor(0,0,0));
|
||||
objShader->setUniformValue(o_u_pointLightCol[2], QColor(0,0,0));
|
||||
|
||||
m_program->bind();
|
||||
|
||||
// Remove Shape from its parent
|
||||
if(selectedObj.shape == nullptr) return;
|
||||
// selectedObj.shape->getParent()->getChildren()->erase(
|
||||
|
||||
@ -90,6 +90,7 @@ signals:
|
||||
protected :
|
||||
virtual void draw();
|
||||
virtual void drawSkybox();
|
||||
virtual void drawTool();
|
||||
virtual void init();
|
||||
|
||||
virtual void mouseMoveEvent(QMouseEvent* e);
|
||||
@ -157,6 +158,19 @@ private:
|
||||
int m_isPickingModeLoc;
|
||||
bool isPickingActivated = false;
|
||||
|
||||
int o_u_mvMatrix;
|
||||
int o_u_prjMatrix;
|
||||
int o_u_nmMatrix;
|
||||
int o_u_isPhong;
|
||||
int o_u_lDir;
|
||||
int o_u_pointLightPos[3];
|
||||
int o_u_pointLightCol[3];
|
||||
int o_u_kd;
|
||||
int o_u_ks;
|
||||
int o_u_kn;
|
||||
int o_a_vPos;
|
||||
int o_a_vNorm;
|
||||
|
||||
float angle_mult;
|
||||
float frame_mult = 1;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user