#include "mmscene.h" #include "glpoint.h" #include "glcolorrgba.h" MMScene::MMScene(QQuickItem *parent) : GLItem(parent) { // Initialize with NULL m_cube = NULL; m_sphere = NULL; m_disc = NULL; // Stop rotation toggleMove(); m_vertexShaderFilename = ":/shaders/vshader.vsh"; m_eye = 5.0 * v_XYZ; m_up = v_Z; m_lightingEnabled = true; m_colorArrayEnabled = false; m_texturesEnabled = true; } MMScene::~MMScene() { if (m_cube != NULL) { delete m_cube; m_cube = NULL; } if (m_sphere != NULL) { delete m_sphere; m_sphere = NULL; } if (m_disc != NULL) { delete m_disc; m_disc = NULL; } } void MMScene::paintUnderQmlScene() { m_renderer->pushMvMatrix(); // drawAxes(2.5); drawTriangles(); m_renderer->popMvMatrix(); } void MMScene::paintOnTopOfQmlScene() { m_renderer->pushMvMatrix(); drawAxes(5.0); //drawTriangles(); //drawF(5.0); //m_cube->draw(m_renderer); //m_sphere->draw(m_renderer); m_disc->draw(m_renderer); m_renderer->popMvMatrix(); } void MMScene::setupGeometry() { //createCube(QVector3D(0.0, 0.0, 0.0), QVector3D(1.0, 1.0, 1.0)); //createSphere(); createDisc(); //createF(5.0); //m_colorArrayEnabled = true; m_geometryIsValid = true; } void MMScene::mousePressed(int x, int y) { renderer()->calculateMousePoints(&m_MouseNear, &m_mouseFar, QPoint(x, y)); renderer()->mouseIntersection(&m_lastIntersection, v_Y, 0.0, QPoint(x, y)); //get starting point } void MMScene::drawTriangles() { renderer()->setLightingEnabled(m_lightingEnabled); renderer()->setColorArrayEnabled(m_colorArrayEnabled); renderer()->setTextureEnabled(m_texturesEnabled); //enable required arrays int stride = sizeof(GLPoint); renderer()->activateAttributeArray(GLESRenderer::VERTEX_LOCATION, m_points[0].vertexPointer(), stride); renderer()->activateAttributeArray(GLESRenderer::NORMAL_LOCATION, m_points[0].normalPointer(), stride); renderer()->activateAttributeArray(GLESRenderer::TEXCOORD_LOCATION, m_points[0].texCoordPointer(), stride); renderer()->activateAttributeArray(GLESRenderer::COLOR_LOCATION, m_points[0].colorPointer(), stride); glDrawArrays(GL_TRIANGLES, 0, 36); renderer()->disableAttributeArrays(); } void MMScene::createCube(const QVector3D &lbb, const QVector3D &rtf) { m_cube = new GLCube(); m_cube->setDrawingMode(GL_TRIANGLES); m_cube->makeSurface(&m_points, &m_indices); } void MMScene::createSphere() { m_sphere = new GLSphere(2.0, 100, 100); m_sphere->setDrawingMode(GL_TRIANGLE_STRIP); m_sphere->makeSurface(&m_points, &m_indices); } void MMScene::createDisc() { m_disc = new GLDisc(1.0, 0.5, 10, GLColorRgba::clBlue, ":/textures/white_disc.jpg"); m_disc->setDrawingMode(GL_TRIANGLES); m_disc->makeSurface(&m_points, &m_indices); } void MMScene::createF(double height) { float stdLength = height / 5.0; createCube(QVector3D(0.0, 0.0, 0.0), QVector3D(stdLength, height, stdLength)); createCube(QVector3D(stdLength, height, 0.0), QVector3D(3.0 * stdLength, height - 1.0 * stdLength, stdLength)); createCube(QVector3D(stdLength, height - 2.0 * stdLength, 0.0), QVector3D(2.0 * stdLength, height - 3.0 * stdLength, stdLength)); } void MMScene::drawF(double height) { m_renderer->pushMvMatrix(); // Pretransform for height m_renderer->scale(QVector3D(height / 5.0, height / 5.0, height / 5.0)); m_renderer->pushMvMatrix(); m_renderer->scale(QVector3D(1.0, 5.0, 1.0)); drawTriangles(); m_renderer->popMvMatrix(); m_renderer->pushMvMatrix(); m_renderer->translate(QVector3D(1.0, 4.0, 0.0)); m_renderer->scale(QVector3D(2.0, 1.0, 1.0)); drawTriangles(); m_renderer->popMvMatrix(); m_renderer->pushMvMatrix(); m_renderer->translate(QVector3D(1.0, 2.0, 0.0)); drawTriangles(); m_renderer->popMvMatrix(); m_renderer->popMvMatrix(); // Reset height transformation }