/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2010-2012 University of Bonn. All rights reserved. * * * This file is part of MoleCuilder. * * MoleCuilder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MoleCuilder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MoleCuilder. If not, see . */ /* * GLMoleculeObject_shape.cpp * * Created on: Aug 3, 2012 * Author: ankele */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "GLMoleculeObject_shape.hpp" #include #include #include #include #include #include #include "CodePatterns/MemDebug.hpp" #include "CodePatterns/Assert.hpp" #include "CodePatterns/Log.hpp" #include "Shapes/Shape.hpp" #include "LinearAlgebra/Vector.hpp" #include "LinkedCell/PointCloudAdaptor.hpp" #include "LinkedCell/linkedcell.hpp" #include "Tesselation/tesselation.hpp" #include "Tesselation/BoundaryLineSet.hpp" #include "Tesselation/BoundaryTriangleSet.hpp" #include "Tesselation/CandidateForTesselation.hpp" #include "Atom/TesselPoint.hpp" typedef QGLSceneNode *MeshList[GLMoleculeObject::DETAILTYPES_MAX]; QGLSceneNode *createShapeMesh(const Shape &shape, QObject *parent) { // Create some points on our shape. std::vector points = shape.getHomogeneousPointsOnSurface(200); // Fill the points into a tesselate-able container. TesselPointSTLList Corners; for (int i=0;isetPosition(points[i]); Walker->setName(toString(i)); Walker->setNr(i); Corners.push_back(Walker); } // Fill the points into a Qt geometry. QGeometryData geo; for(int i=0;i cloud(&Corners, "TesselPointSTLList"); (*T)(cloud, 2); // Fill the tesselated triangles into the geometry. for (TriangleMap::const_iterator runner = T->TrianglesOnBoundary.begin(); runner != T->TrianglesOnBoundary.end(); runner++) { geo.appendIndices(runner->second->endpoints[0]->node->getNr(), runner->second->endpoints[1]->node->getNr(), runner->second->endpoints[2]->node->getNr()); } // Build a mesh from the geometry. QGLBuilder builder; builder.addTriangles(geo); QGLSceneNode *mesh = builder.finalizedSceneNode(); return mesh; } GLMoleculeObject_shape::GLMoleculeObject_shape(const Shape &shape, QObject *parent) : GLMoleculeObject(createShapeMesh(shape, parent), parent), m_shape(shape) { // Create the material. QGLMaterial *material = new QGLMaterial(NULL); material->setAmbientColor( QColor(50, 60, 100, 255) ); material->setDiffuseColor( QColor(150, 160, 200, 180) ); material->setSpecularColor( QColor(60, 60, 60) ); material->setShininess( 128 ); setMaterial(material); } GLMoleculeObject_shape::~GLMoleculeObject_shape() { } void GLMoleculeObject_shape::draw(QGLPainter *painter, const QVector4D &cameraPlane) { painter->modelViewMatrix().push(); painter->setColor(m_material->diffuseColor()); painter->setFaceMaterial(QGL::AllFaces, m_material); // Draw the transparent cube. /* painter->setStandardEffect(QGL::LitMaterial); glCullFace(GL_BACK); //glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glDepthMask(0); glDisable(GL_DEPTH_TEST);*/ m_mesh[0]->draw(painter); /*glEnable(GL_DEPTH_TEST); glDepthMask(1); glDisable(GL_BLEND); //glDisable(GL_CULL_FACE);*/ painter->modelViewMatrix().pop(); }