|
|
|
|
@@ -8,10 +8,10 @@
|
|
|
|
|
|
|
|
|
|
#include <abstractscene.h>
|
|
|
|
|
#include <camera3d.h>
|
|
|
|
|
#include <examplescene.h>
|
|
|
|
|
#include <meshrenderer.h>
|
|
|
|
|
#include <model.h>
|
|
|
|
|
#include <resourcemanager.h>
|
|
|
|
|
#include <examplescene.h>
|
|
|
|
|
#include <texture.h>
|
|
|
|
|
|
|
|
|
|
using namespace Qtk;
|
|
|
|
|
@@ -20,31 +20,31 @@ using namespace Qtk;
|
|
|
|
|
* Constructors, Destructors
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
ExampleScene::ExampleScene()
|
|
|
|
|
{
|
|
|
|
|
ExampleScene::ExampleScene() {
|
|
|
|
|
Camera().transform().setTranslation(0.0f, 0.0f, 20.0f);
|
|
|
|
|
Camera().transform().setRotation(-5.0f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExampleScene::~ExampleScene()
|
|
|
|
|
{
|
|
|
|
|
ExampleScene::~ExampleScene() {
|
|
|
|
|
delete mTestPhong;
|
|
|
|
|
delete mTestSpecular;
|
|
|
|
|
delete mTestDiffuse;
|
|
|
|
|
delete mTestAmbient;
|
|
|
|
|
for (auto & mesh : mMeshes) delete mesh;
|
|
|
|
|
for (auto & model : mModels) delete model;
|
|
|
|
|
for(auto & mesh : mMeshes) {
|
|
|
|
|
delete mesh;
|
|
|
|
|
}
|
|
|
|
|
for(auto & model : mModels) {
|
|
|
|
|
delete model;
|
|
|
|
|
}
|
|
|
|
|
delete mSkybox;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Public Member Functions
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
void ExampleScene::init()
|
|
|
|
|
{
|
|
|
|
|
Qtk::Skybox * sb = new Qtk::Skybox("Skybox");
|
|
|
|
|
void ExampleScene::init() {
|
|
|
|
|
auto * sb = new Qtk::Skybox("Skybox");
|
|
|
|
|
setSkybox(sb);
|
|
|
|
|
|
|
|
|
|
// Initialize Phong example cube
|
|
|
|
|
@@ -63,16 +63,15 @@ void ExampleScene::init()
|
|
|
|
|
mTestPhong->mNBO.create();
|
|
|
|
|
mTestPhong->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
|
|
|
mTestPhong->mNBO.bind();
|
|
|
|
|
mTestPhong->mNBO.allocate(mTestPhong->getNormals().data(),
|
|
|
|
|
mTestPhong->getNormals().size()
|
|
|
|
|
* sizeof(mTestPhong->getNormals()[0]));
|
|
|
|
|
mTestPhong->mNBO.allocate(
|
|
|
|
|
mTestPhong->getNormals().data(),
|
|
|
|
|
mTestPhong->getNormals().size() * sizeof(mTestPhong->getNormals()[0]));
|
|
|
|
|
mTestPhong->mProgram.enableAttributeArray(1);
|
|
|
|
|
mTestPhong->mProgram.setAttributeBuffer(1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mTestPhong->mNBO.release();
|
|
|
|
|
mTestPhong->mVAO.release();
|
|
|
|
|
mTestPhong->mProgram.release();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initialize Ambient example cube
|
|
|
|
|
mTestAmbient = new Qtk::MeshRenderer("ambient", Cube());
|
|
|
|
|
mTestAmbient->mTransform.setTranslation(7.0f, 0.0f, -2.0f);
|
|
|
|
|
@@ -87,12 +86,13 @@ void ExampleScene::init()
|
|
|
|
|
mTestAmbient->mNBO.create();
|
|
|
|
|
mTestAmbient->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
|
|
|
mTestAmbient->mNBO.bind();
|
|
|
|
|
mTestAmbient->mNBO.allocate(mTestAmbient->getNormals().data(),
|
|
|
|
|
mTestAmbient->getNormals().size()
|
|
|
|
|
* sizeof(mTestAmbient->getNormals()[0]));
|
|
|
|
|
mTestAmbient->mNBO.allocate(
|
|
|
|
|
mTestAmbient->getNormals().data(),
|
|
|
|
|
mTestAmbient->getNormals().size()
|
|
|
|
|
* sizeof(mTestAmbient->getNormals()[0]));
|
|
|
|
|
mTestAmbient->mProgram.enableAttributeArray(1);
|
|
|
|
|
mTestAmbient->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mTestAmbient->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mTestAmbient->mNBO.release();
|
|
|
|
|
mTestAmbient->mVAO.release();
|
|
|
|
|
mTestAmbient->mProgram.release();
|
|
|
|
|
@@ -111,12 +111,13 @@ void ExampleScene::init()
|
|
|
|
|
mTestDiffuse->mNBO.create();
|
|
|
|
|
mTestDiffuse->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
|
|
|
mTestDiffuse->mNBO.bind();
|
|
|
|
|
mTestDiffuse->mNBO.allocate(mTestDiffuse->getNormals().data(),
|
|
|
|
|
mTestDiffuse->getNormals().size()
|
|
|
|
|
* sizeof(mTestDiffuse->getNormals()[0]));
|
|
|
|
|
mTestDiffuse->mNBO.allocate(
|
|
|
|
|
mTestDiffuse->getNormals().data(),
|
|
|
|
|
mTestDiffuse->getNormals().size()
|
|
|
|
|
* sizeof(mTestDiffuse->getNormals()[0]));
|
|
|
|
|
mTestDiffuse->mProgram.enableAttributeArray(1);
|
|
|
|
|
mTestDiffuse->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mTestDiffuse->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mTestDiffuse->mNBO.release();
|
|
|
|
|
mTestDiffuse->mVAO.release();
|
|
|
|
|
mTestDiffuse->mProgram.release();
|
|
|
|
|
@@ -137,12 +138,13 @@ void ExampleScene::init()
|
|
|
|
|
mTestSpecular->mNBO.create();
|
|
|
|
|
mTestSpecular->mNBO.setUsagePattern(QOpenGLBuffer::StaticDraw);
|
|
|
|
|
mTestSpecular->mNBO.bind();
|
|
|
|
|
mTestSpecular->mNBO.allocate(mTestSpecular->getNormals().data(),
|
|
|
|
|
mTestSpecular->getNormals().size()
|
|
|
|
|
* sizeof(mTestSpecular->getNormals()[0]));
|
|
|
|
|
mTestSpecular->mNBO.allocate(
|
|
|
|
|
mTestSpecular->getNormals().data(),
|
|
|
|
|
mTestSpecular->getNormals().size()
|
|
|
|
|
* sizeof(mTestSpecular->getNormals()[0]));
|
|
|
|
|
mTestSpecular->mProgram.enableAttributeArray(1);
|
|
|
|
|
mTestSpecular->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mTestSpecular->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mTestSpecular->mNBO.release();
|
|
|
|
|
mTestSpecular->mVAO.release();
|
|
|
|
|
mTestSpecular->mProgram.release();
|
|
|
|
|
@@ -150,7 +152,8 @@ void ExampleScene::init()
|
|
|
|
|
//
|
|
|
|
|
// Model loading
|
|
|
|
|
|
|
|
|
|
mModels.push_back(new Qtk::Model("backpack", ":/models/backpack/backpack.obj"));
|
|
|
|
|
mModels.push_back(
|
|
|
|
|
new Qtk::Model("backpack", ":/models/backpack/backpack.obj"));
|
|
|
|
|
// Sometimes model textures need flipped in certain directions
|
|
|
|
|
mModels.back()->flipTexture("diffuse.jpg", false, true);
|
|
|
|
|
mModels.back()->mTransform.setTranslation(0.0f, 0.0f, -10.0f);
|
|
|
|
|
@@ -165,7 +168,8 @@ void ExampleScene::init()
|
|
|
|
|
mModels.back()->mTransform.setTranslation(-3.0f, -1.0f, -10.0f);
|
|
|
|
|
mModels.back()->mTransform.scale(0.15f);
|
|
|
|
|
|
|
|
|
|
mModels.push_back(new Qtk::Model("alien", ":/models/alien-hominid/alien.obj"));
|
|
|
|
|
mModels.push_back(
|
|
|
|
|
new Qtk::Model("alien", ":/models/alien-hominid/alien.obj"));
|
|
|
|
|
mModels.back()->mTransform.setTranslation(2.0f, -1.0f, -5.0f);
|
|
|
|
|
mModels.back()->mTransform.scale(0.15f);
|
|
|
|
|
|
|
|
|
|
@@ -174,27 +178,26 @@ void ExampleScene::init()
|
|
|
|
|
mModels.back()->mTransform.rotate(-90.0f, 1.0f, 0.0f, 0.0f);
|
|
|
|
|
mModels.back()->mTransform.rotate(90.0f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
|
|
|
|
|
mModels.push_back(new Qtk::Model("masterChief", ":/models/spartan/spartan.obj"));
|
|
|
|
|
mModels.push_back(
|
|
|
|
|
new Qtk::Model("masterChief", ":/models/spartan/spartan.obj"));
|
|
|
|
|
mModels.back()->mTransform.setTranslation(-1.5f, 0.5f, -2.0f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Building example mesh objects
|
|
|
|
|
|
|
|
|
|
// Render an alien with specular
|
|
|
|
|
// Test alien Model with phong lighting and specular mapping
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"alienTestLight", Triangle(Qtk::QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(4.0f, 1.5f, 10.0f);
|
|
|
|
|
mMeshes.back()->mTransform.scale(0.25f);
|
|
|
|
|
// This function changes values we have allocated in a buffer, so init() after
|
|
|
|
|
mMeshes.back()->setColor(GREEN);
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
|
|
|
|
|
mModels.push_back(
|
|
|
|
|
new Qtk::Model("alienTest", ":/models/alien-hominid/alien.obj",
|
|
|
|
|
":/model-specular.vert", ":/model-specular.frag")
|
|
|
|
|
);
|
|
|
|
|
mModels.push_back(new Qtk::Model(
|
|
|
|
|
"alienTest", ":/models/alien-hominid/alien.obj", ":/model-specular.vert",
|
|
|
|
|
":/model-specular.frag"));
|
|
|
|
|
mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f);
|
|
|
|
|
mModels.back()->mTransform.scale(0.15f);
|
|
|
|
|
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
@@ -209,21 +212,18 @@ void ExampleScene::init()
|
|
|
|
|
mModels.back()->setUniform("uLight.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
mModels.back()->setUniform("uLight.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test spartan Model with phong lighting, specular and normal mapping
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS))
|
|
|
|
|
);
|
|
|
|
|
new Qtk::MeshRenderer("spartanTestLight", Triangle(QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(1.0f, 1.5f, 10.0f);
|
|
|
|
|
mMeshes.back()->mTransform.scale(0.25f);
|
|
|
|
|
// This function changes values we have allocated in a buffer, so init() after
|
|
|
|
|
mMeshes.back()->setColor(GREEN);
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
|
|
|
|
|
mModels.push_back(
|
|
|
|
|
new Qtk::Model("spartanTest", ":/models/spartan/spartan.obj",
|
|
|
|
|
":/model-normals.vert", ":/model-normals.frag")
|
|
|
|
|
);
|
|
|
|
|
mModels.push_back(new Qtk::Model(
|
|
|
|
|
"spartanTest", ":/models/spartan/spartan.obj", ":/model-normals.vert",
|
|
|
|
|
":/model-normals.frag"));
|
|
|
|
|
mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f);
|
|
|
|
|
mModels.back()->mTransform.scale(2.0f);
|
|
|
|
|
mModels.back()->setUniform("uMaterial.ambient", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
@@ -237,7 +237,6 @@ void ExampleScene::init()
|
|
|
|
|
mModels.back()->setUniform("uLight.diffuse", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
mModels.back()->setUniform("uLight.specular", QVector3D(1.0f, 1.0f, 1.0f));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test basic cube with phong.vert and phong.frag shaders
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("testLight", Triangle(QTK_DRAW_ELEMENTS)));
|
|
|
|
|
@@ -248,8 +247,7 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->setColor(GREEN);
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer("testPhong", Cube(QTK_DRAW_ARRAYS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 10.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/phong.vert", ":/phong.frag");
|
|
|
|
|
mMeshes.back()->setColor(QVector3D(0.0f, 0.25f, 0.0f));
|
|
|
|
|
@@ -260,12 +258,13 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
@@ -329,20 +328,21 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
|
|
|
|
|
// RGB Normals cube to show normals are correct with QTK_DRAW_ELEMENTS_NORMALS
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"rgbNormalsCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, 2.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
@@ -351,19 +351,21 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
|
|
|
|
|
// Texturing a cube using texture coordinates and glDrawArrays
|
|
|
|
|
// + Texturing with UVs using glDrawElements requires QTK_DRAW_ELEMENTS_NORMALS
|
|
|
|
|
// + Texturing with UVs using glDrawElements requires
|
|
|
|
|
// QTK_DRAW_ELEMENTS_NORMALS
|
|
|
|
|
// + UVs required duplicating element position data from QTK_DRAW_ELEMENTS
|
|
|
|
|
// + This is because the same position must use different UV coordinates
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
@@ -373,26 +375,28 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
mMeshes.back()->setTexture(
|
|
|
|
|
OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
mMeshes.back()->setUniform("uTexture", 0);
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mVAO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.destroy();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
|
|
|
|
|
// Test drawing a cube with texture coordinates using glDrawElements
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("uvCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"uvCubeElementsTest", Cube(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(-1.7f, 0.0f, -2.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
@@ -401,13 +405,15 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->setTexture(
|
|
|
|
|
OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mProgram.setUniformValue("uTexture", 0);
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
@@ -421,7 +427,8 @@ void ExampleScene::init()
|
|
|
|
|
new Qtk::MeshRenderer("testCubeMap", Cube(QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(-3.0f, 1.0f, -2.0f);
|
|
|
|
|
mMeshes.back()->mTransform.setRotation(45.0f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/texture-cubemap.vert", ":/texture-cubemap.frag");
|
|
|
|
|
mMeshes.back()->setShaders(
|
|
|
|
|
":/texture-cubemap.vert", ":/texture-cubemap.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
@@ -432,12 +439,13 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.destroy();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
@@ -454,20 +462,21 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
|
|
|
|
|
// RGB Normals triangle to show normals are correct with QTK_DRAW_ARRAYS
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("rgbTriangleArraysTest", Triangle(QTK_DRAW_ARRAYS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"rgbTriangleArraysTest", Triangle(QTK_DRAW_ARRAYS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 2.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
@@ -476,20 +485,20 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mVAO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
|
|
|
|
|
// RGB Normals triangle to show normals are correct with QTK_DRAW_ELEMENTS
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("rgbTriangleElementsTest",
|
|
|
|
|
Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"rgbTriangleElementsTest", Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(7.0f, 0.0f, 4.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/rgb-normals.vert", ":/rgb-normals.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
@@ -498,12 +507,13 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mVAO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->getNormals().data(),
|
|
|
|
|
mMeshes.back()->getNormals().size()
|
|
|
|
|
* sizeof(mMeshes.back()->getNormals()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 3, sizeof(QVector3D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
@@ -523,26 +533,26 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.destroy();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
|
|
|
|
|
// Test drawing triangle with glDrawElements with texture coordinates
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("testTriangleElementsUV",
|
|
|
|
|
Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer(
|
|
|
|
|
"testTriangleElementsUV", Triangle(QTK_DRAW_ELEMENTS_NORMALS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(-2.5f, 0.0f, -1.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/texture2d.vert", ":/texture2d.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
|
|
|
|
|
// mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
// mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
|
|
|
|
mMeshes.back()->mTexture.setTexture(":/crate.png");
|
|
|
|
|
mMeshes.back()->setUniform("uTexture", 0);
|
|
|
|
|
|
|
|
|
|
@@ -550,12 +560,13 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mNBO.destroy();
|
|
|
|
|
mMeshes.back()->mNBO.create();
|
|
|
|
|
mMeshes.back()->mNBO.bind();
|
|
|
|
|
mMeshes.back()->mNBO.allocate(mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mNBO.allocate(
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().data(),
|
|
|
|
|
mMeshes.back()->mShape.getTexCoords().size()
|
|
|
|
|
* sizeof(mMeshes.back()->mShape.getTexCoords()[0]));
|
|
|
|
|
mMeshes.back()->mProgram.enableAttributeArray(1);
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(1, GL_FLOAT, 0,
|
|
|
|
|
2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mProgram.setAttributeBuffer(
|
|
|
|
|
1, GL_FLOAT, 0, 2, sizeof(QVector2D));
|
|
|
|
|
mMeshes.back()->mNBO.release();
|
|
|
|
|
mMeshes.back()->mVAO.release();
|
|
|
|
|
mMeshes.back()->mProgram.release();
|
|
|
|
|
@@ -564,11 +575,10 @@ void ExampleScene::init()
|
|
|
|
|
// Lighting cube examples
|
|
|
|
|
|
|
|
|
|
// Example of a cube with no lighting applied
|
|
|
|
|
mMeshes.push_back(
|
|
|
|
|
new Qtk::MeshRenderer("noLight", Cube(QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.push_back(new Qtk::MeshRenderer("noLight", Cube(QTK_DRAW_ELEMENTS)));
|
|
|
|
|
mMeshes.back()->mTransform.setTranslation(5.0f, 0.0f, -2.0f);
|
|
|
|
|
mMeshes.back()->setShaders(":/solid-perspective.vert",
|
|
|
|
|
":/solid-perspective.frag");
|
|
|
|
|
mMeshes.back()->setShaders(
|
|
|
|
|
":/solid-perspective.vert", ":/solid-perspective.frag");
|
|
|
|
|
mMeshes.back()->init();
|
|
|
|
|
mMeshes.back()->mProgram.bind();
|
|
|
|
|
mMeshes.back()->setUniform("uColor", QVector3D(0.0f, 0.25f, 0.0f));
|
|
|
|
|
@@ -591,39 +601,44 @@ void ExampleScene::init()
|
|
|
|
|
mMeshes.back()->mTransform.scale(0.25f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ExampleScene::draw()
|
|
|
|
|
{
|
|
|
|
|
void ExampleScene::draw() {
|
|
|
|
|
Scene::draw();
|
|
|
|
|
|
|
|
|
|
for (const auto & model : mModels) model->draw();
|
|
|
|
|
for(const auto & model : mModels) {
|
|
|
|
|
model->draw();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const auto & mesh : mMeshes) mesh->draw();
|
|
|
|
|
for(const auto & mesh : mMeshes) {
|
|
|
|
|
mesh->draw();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mTestPhong->mProgram.bind();
|
|
|
|
|
mTestPhong->setUniform("uModelInverseTransposed",
|
|
|
|
|
mTestPhong->mTransform.toMatrix().normalMatrix());
|
|
|
|
|
mTestPhong->setUniform(
|
|
|
|
|
"uModelInverseTransposed",
|
|
|
|
|
mTestPhong->mTransform.toMatrix().normalMatrix());
|
|
|
|
|
mTestPhong->setUniform(
|
|
|
|
|
"uLightPosition",
|
|
|
|
|
MeshRenderer::getInstance("phongLight")->mTransform.getTranslation());
|
|
|
|
|
mTestPhong->setUniform("uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestPhong->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestPhong->mProgram.release();
|
|
|
|
|
mTestPhong->draw();
|
|
|
|
|
|
|
|
|
|
mTestAmbient->mProgram.bind();
|
|
|
|
|
mTestAmbient->setUniform("uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestAmbient->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestAmbient->mProgram.release();
|
|
|
|
|
mTestAmbient->draw();
|
|
|
|
|
|
|
|
|
|
mTestDiffuse->mProgram.bind();
|
|
|
|
|
mTestDiffuse->setUniform("uModelInverseTransposed",
|
|
|
|
|
mTestDiffuse->mTransform.toMatrix().normalMatrix());
|
|
|
|
|
mTestDiffuse->setUniform(
|
|
|
|
|
"uModelInverseTransposed",
|
|
|
|
|
mTestDiffuse->mTransform.toMatrix().normalMatrix());
|
|
|
|
|
mTestDiffuse->setUniform(
|
|
|
|
|
"uLightPosition",
|
|
|
|
|
MeshRenderer::getInstance("diffuseLight")->mTransform.getTranslation());
|
|
|
|
|
mTestDiffuse->setUniform("uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestDiffuse->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestDiffuse->mProgram.release();
|
|
|
|
|
mTestDiffuse->draw();
|
|
|
|
|
|
|
|
|
|
@@ -634,67 +649,66 @@ void ExampleScene::draw()
|
|
|
|
|
mTestSpecular->setUniform(
|
|
|
|
|
"uLightPosition",
|
|
|
|
|
MeshRenderer::getInstance("specularLight")->mTransform.getTranslation());
|
|
|
|
|
mTestSpecular->setUniform("uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestSpecular->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
mTestSpecular->mProgram.release();
|
|
|
|
|
mTestSpecular->draw();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ExampleScene::update()
|
|
|
|
|
{
|
|
|
|
|
auto position = MeshRenderer::getInstance(
|
|
|
|
|
"alienTestLight")->mTransform.getTranslation();
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uLight.position", position);
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
void ExampleScene::update() {
|
|
|
|
|
auto position =
|
|
|
|
|
MeshRenderer::getInstance("alienTestLight")->mTransform.getTranslation();
|
|
|
|
|
Model::getInstance("alienTest")->setUniform("uLight.position", position);
|
|
|
|
|
Model::getInstance("alienTest")
|
|
|
|
|
->setUniform(
|
|
|
|
|
"uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
auto posMatrix = Model::getInstance("alienTest")->mTransform.toMatrix();
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uMVP.model", posMatrix);
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
Model::getInstance("alienTest")->setUniform(
|
|
|
|
|
"uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
Model::getInstance("alienTest")
|
|
|
|
|
->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
Model::getInstance("alienTest")->setUniform("uMVP.model", posMatrix);
|
|
|
|
|
Model::getInstance("alienTest")
|
|
|
|
|
->setUniform("uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
Model::getInstance("alienTest")
|
|
|
|
|
->setUniform("uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
Model::getInstance("alienTest")->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
|
|
|
|
|
position = MeshRenderer::getInstance(
|
|
|
|
|
"spartanTestLight")->mTransform.getTranslation();
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uLight.position", position);
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
position = MeshRenderer::getInstance("spartanTestLight")
|
|
|
|
|
->mTransform.getTranslation();
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform("uLight.position", position);
|
|
|
|
|
Model::getInstance("spartanTest")
|
|
|
|
|
->setUniform(
|
|
|
|
|
"uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
posMatrix = Model::getInstance("spartanTest")->mTransform.toMatrix();
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uMVP.model", posMatrix);
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform(
|
|
|
|
|
"uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
Model::getInstance("spartanTest")
|
|
|
|
|
->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
Model::getInstance("spartanTest")->setUniform("uMVP.model", posMatrix);
|
|
|
|
|
Model::getInstance("spartanTest")
|
|
|
|
|
->setUniform("uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
Model::getInstance("spartanTest")
|
|
|
|
|
->setUniform("uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
Model::getInstance("spartanTest")->mTransform.rotate(0.75f, 0.0f, 1.0f, 0.0f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->mTransform.rotate(
|
|
|
|
|
0.75f, 1.0f, 0.5f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->mTransform.rotate(0.75f, 1.0f, 0.5f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->mProgram.bind();
|
|
|
|
|
position = MeshRenderer::getInstance("testLight")->mTransform.getTranslation();
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uLight.position", position);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uCameraPosition", ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
position =
|
|
|
|
|
MeshRenderer::getInstance("testLight")->mTransform.getTranslation();
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->setUniform("uLight.position", position);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->setUniform(
|
|
|
|
|
"uCameraPosition",
|
|
|
|
|
ExampleScene::Camera().transform().getTranslation());
|
|
|
|
|
posMatrix = MeshRenderer::getInstance("testPhong")->mTransform.toMatrix();
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uMVP.model", posMatrix);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform(
|
|
|
|
|
"uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->setUniform("uMVP.normalMatrix", posMatrix.normalMatrix());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->setUniform("uMVP.model", posMatrix);
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->setUniform("uMVP.view", ExampleScene::Camera().toMatrix());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")
|
|
|
|
|
->setUniform("uMVP.projection", ExampleScene::Projection());
|
|
|
|
|
MeshRenderer::getInstance("testPhong")->mProgram.release();
|
|
|
|
|
|
|
|
|
|
// Rotate lighting example cubes
|
|
|
|
|
@@ -708,36 +722,36 @@ void ExampleScene::update()
|
|
|
|
|
// Examples of various translations and rotations
|
|
|
|
|
|
|
|
|
|
// Rotate in multiple directions simultaneously
|
|
|
|
|
MeshRenderer::getInstance("rgbNormalsCube")->mTransform.rotate(
|
|
|
|
|
0.75f, 0.2f, 0.4f, 0.6f);
|
|
|
|
|
MeshRenderer::getInstance("rgbNormalsCube")
|
|
|
|
|
->mTransform.rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
|
|
|
|
|
|
|
|
|
// Pitch forward and roll sideways
|
|
|
|
|
MeshRenderer::getInstance("leftTriangle")->mTransform.rotate(
|
|
|
|
|
0.75f, 1.0f, 0.0f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("rightTriangle")->mTransform.rotate(
|
|
|
|
|
0.75f, 0.0f, 0.0f, 1.0f);
|
|
|
|
|
MeshRenderer::getInstance("leftTriangle")
|
|
|
|
|
->mTransform.rotate(0.75f, 1.0f, 0.0f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("rightTriangle")
|
|
|
|
|
->mTransform.rotate(0.75f, 0.0f, 0.0f, 1.0f);
|
|
|
|
|
|
|
|
|
|
// Move between two positions over time
|
|
|
|
|
static float translateX = 0.025f;
|
|
|
|
|
float limit = -9.0f; // Origin position.x - 2.0f
|
|
|
|
|
float limit = -9.0f; // Origin position.x - 2.0f
|
|
|
|
|
float posX =
|
|
|
|
|
MeshRenderer::getInstance("topTriangle")->mTransform.getTranslation().x();
|
|
|
|
|
if (posX < limit || posX > limit + 4.0f) {
|
|
|
|
|
if(posX < limit || posX > limit + 4.0f) {
|
|
|
|
|
translateX = -translateX;
|
|
|
|
|
}
|
|
|
|
|
MeshRenderer::getInstance("topTriangle")->mTransform.translate(
|
|
|
|
|
translateX, 0.0f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("bottomTriangle")->mTransform.translate(
|
|
|
|
|
-translateX, 0.0f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("topTriangle")
|
|
|
|
|
->mTransform.translate(translateX, 0.0f, 0.0f);
|
|
|
|
|
MeshRenderer::getInstance("bottomTriangle")
|
|
|
|
|
->mTransform.translate(-translateX, 0.0f, 0.0f);
|
|
|
|
|
// And lets rotate the triangles in two directions at once
|
|
|
|
|
MeshRenderer::getInstance("topTriangle")->mTransform.rotate(
|
|
|
|
|
0.75f, 0.2f, 0.0f, 0.4f);
|
|
|
|
|
MeshRenderer::getInstance("bottomTriangle")->mTransform.rotate(
|
|
|
|
|
0.75f, 0.0f, 0.2f, 0.4f);
|
|
|
|
|
MeshRenderer::getInstance("topTriangle")
|
|
|
|
|
->mTransform.rotate(0.75f, 0.2f, 0.0f, 0.4f);
|
|
|
|
|
MeshRenderer::getInstance("bottomTriangle")
|
|
|
|
|
->mTransform.rotate(0.75f, 0.0f, 0.2f, 0.4f);
|
|
|
|
|
// And make the bottom triangle green, instead of RGB
|
|
|
|
|
|
|
|
|
|
// Rotate center cube in several directions simultaneously
|
|
|
|
|
// + Not subject to gimbal lock since we are using quaternions :)
|
|
|
|
|
MeshRenderer::getInstance("centerCube")->mTransform.rotate(
|
|
|
|
|
0.75f, 0.2f, 0.4f, 0.6f);
|
|
|
|
|
MeshRenderer::getInstance("centerCube")
|
|
|
|
|
->mTransform.rotate(0.75f, 0.2f, 0.4f, 0.6f);
|
|
|
|
|
}
|
|
|
|
|
|