/* * Copyright © 2008 Ben Smith * Copyright © 2010-2011 Linaro Limited * * This file is part of the glmark2 OpenGL (ES) 2.0 benchmark. * * glmark2 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 3 of the License, or (at your option) any later * version. * * glmark2 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 * glmark2. If not, see <http://www.gnu.org/licenses/>. * * Authors: * Ben Smith (original glmark benchmark) * Alexandros Frantzis (glmark2) */ #include "mesh.h" #include "model.h" #include "vec.h" #include "log.h" #include "options.h" #include "util.h" #include "float.h" #include "math.h" #include <fstream> #include <sstream> #include <memory> string; vector; vec2; vec3; uvec3; #define read_or_fail(file, dst, size) … /** * Computes the bounding box for a Model::Object. * * @param object the Model object */ void Model::compute_bounding_box(const Object& object) { … } /** * Appends the vertices of a Model::Object to a Mesh. * * @param object the object to append * @param mesh the mesh to append to * @param p_pos the attribute position to use for the 'position' attribute * @param n_pos the attribute position to use for the 'normal' attribute * @param t_pos the attribute position to use for the 'texcoord' attribute */ void Model::append_object_to_mesh(const Object &object, Mesh &mesh, int p_pos, int n_pos, int t_pos, int nt_pos, int nb_pos) { … } /** * Converts a model to a mesh using the default attributes bindings. * * The default attributes and their order is: Position, Normal, Texcoord * * @param mesh the mesh to populate */ void Model::convert_to_mesh(Mesh &mesh) { … } /** * Converts a model to a mesh using custom attribute bindings. * * The attribute bindings are pairs of <AttribType, dimensionality>. * * @param mesh the mesh to populate * @param attribs the attribute bindings to use */ void Model::convert_to_mesh(Mesh &mesh, const std::vector<std::pair<AttribType, int> > &attribs) { … } void Model::calculate_texcoords() { … } /** * Calculates the normal vectors of the model vertices. */ void Model::calculate_normals() { … } /** * Load a model from a 3DS file. * * @param filename the name of the file * * @return whether loading succeeded */ bool Model::load_3ds(const std::string &filename) { … } const unsigned int Model::Face::OBJ_FACE_V = …; const unsigned int Model::Face::OBJ_FACE_T = …; const unsigned int Model::Face::OBJ_FACE_N = …; /** * Parse 2-element vertex attribute from an OBJ file. * * @param source the source line to parse * @param v the vec2 to populate */ void Model::obj_get_attrib(const string& source, vec2& v) { … } /** * Parse 3-element vertex attribute from an OBJ file. * * @param source the source line to parse * @param v the vec3 to populate */ void Model::obj_get_attrib(const string& source, vec3& v) { … } void Model::obj_face_get_index(const string& tuple, unsigned int& which, unsigned int& v, unsigned int& t, unsigned int& n) { … } /** * Parse a face description from an OBJ file. * Faces always specify position, but optionally can also contain separate * indices for texcoords and normals. * * @param source the source line to parse * @param v the uvec3 to populate */ void Model::obj_get_face(const string& source, Face& f) { … } /** * Load a model from an OBJ file. * * @param filename the name of the file * * @return whether loading succeeded */ bool Model::load_obj(const std::string &filename) { … } namespace ModelPrivate { ModelMap modelMap; } /** * Locate all available models. * * This method scans the built-in data paths and build a database of usable * models available to scenes. Map is available on a read-only basis to scenes * that might find it useful for listing models, etc. * * @return a map containing information about the located models */ const ModelMap& Model::find_models() { … } /** * Load a model by name. * * You must initialize the available model collection using * Model::find_models() before using this method. * * @param modelName the model name * * @return whether the operation succeeded */ bool Model::load(const string& modelName) { … }