Mercurial > hg > forks > gldragon
view dmmodel.h @ 19:a329f0216491
Implement PLY file format parsing and extremely simplistic scene setup file format.
Not finished yet.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 07 Nov 2019 20:15:33 +0200 |
parents | |
children | 1404dfcee7b8 |
line wrap: on
line source
// // // #ifndef DMMODEL_H #define DMMODEL_H 1 #include "dmutil.h" #include <cstdint> #include <fstream> #include <unordered_map> #define PLY_PROP_VERTEX_INDICES "vertex_indices" #define PLY_ELEM_FACE "face" #define PLY_ELEM_VERTEX "vertex" enum DMPLYFormat { PLY_FMT_UNKNOWN, PLY_FMT_ASCII, PLY_FMT_BIN_LE, PLY_FMT_BIN_BE }; enum DMPLYPropType { PLY_TYPE_NONE, PLY_TYPE_LIST, PLY_TYPE_UINT8, PLY_TYPE_INT8, PLY_TYPE_INT16, PLY_TYPE_UINT16, PLY_TYPE_INT32, PLY_TYPE_UINT32, PLY_TYPE_FLOAT, PLY_TYPE_DOUBLE }; /* Structures */ union DMPLYPropValue { double v_double; float v_float; unsigned int v_uint; int v_int; }; struct DMPLYFileProperty { std::string name; DMPLYPropType type, list_num_type, list_values_type; DMPLYPropValue value, list_num_value; std::vector<DMPLYPropValue> list_values; }; struct DMPLYFileElement { int value; std::string name; std::unordered_map<std::string, DMPLYFileProperty> prop_map; std::vector<DMPLYFileProperty *> properties; DMPLYFileProperty *checkProp(const std::string &prop) { if (prop_map.count(prop)) return &prop_map[prop]; else return 0; } }; struct DMTextFileInfo { int nline, state; std::string filename; std::string line; std::ifstream file; }; struct DMPLYFileInfo : DMTextFileInfo { DMPLYFormat format; std::unordered_map<std::string, DMPLYFileElement> elem_map; std::vector<DMPLYFileElement *> elements; DMPLYFileElement *element; DMPLYFileInfo() { element = 0; format = PLY_FMT_UNKNOWN; } DMPLYFileElement *checkElem(const std::string &elem) { if (elem_map.count(elem)) return &elem_map[elem]; else return 0; } }; struct DMColor { int r, g, b, alpha; }; struct DMVertex { float x, y, z; }; struct DMModel { int nvertices, nfaces; std::vector<DMVertex> vertices, normals; std::vector<unsigned int> faces; DMColor color; DMVertex translate, scale, rotate; unsigned int id_prog, id_fs, id_vs; bool loadFromPLY(const std::string &filename); bool loadFromPLY(const std::string &filename, DMPLYFileInfo &info); void printInfo() { printf( "MODEL: scale <%1.5f, %1.5f, %1.5f>\n" "MODEL: translate <%1.5f, %1.5f, %1.5f>\n" "MODEL: rotate <%1.5f, %1.5f, %1.5f>\n" , scale.x, scale.y, scale.z, translate.x, translate.y, translate.z, rotate.x, rotate.y, rotate.z); } DMModel() { translate.x = translate.y = translate.z = 0; rotate.x = rotate.y = rotate.z = 0; scale.x = scale.y = scale.z = 1; } }; struct DMLight { DMVertex pos; float ambient[4], diffuse[4], specular[4]; }; struct DMCamera { DMVertex pos, lookAt; }; struct DMSimpleScene { DMModel model; DMCamera camera; std::vector<DMLight> lights; bool loadInfo(const std::string &filename); }; #endif