Mercurial > hg > forks > gldragon
view dmmodel.h @ 21:1404dfcee7b8
More work on scenefile and model loading support.
Can now load PLY models and simple scene definition files.
Converted dragon mesh to binary PLY format.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 22 Nov 2019 03:03:52 +0200 |
parents | a329f0216491 |
children | 03b86b9c2f29 |
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; std::string *key; }; 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 DMVector3 { float x, y, z; }; struct DMVector4 { float x, y, z, w; }; struct DMModel { int nvertices, nfaces; std::vector<DMVector3> vertices, normals; std::vector<unsigned int> faces; DMColor color; DMVector3 translate, scale, rotate; unsigned int id_prog, id_fs, id_vs; std::string modelFile, fragShaderFile, vertShaderFile, fragShaderStr, vertShaderStr; 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() { nfaces = nvertices = 0; translate.x = translate.y = translate.z = 0; rotate.x = rotate.y = rotate.z = 0; scale.x = scale.y = scale.z = 1; } }; struct DMLight { DMVector3 pos, pointAt; DMVector4 ambient, diffuse, specular; }; struct DMCamera { DMVector3 pos, pointAt; }; struct DMSimpleScene { DMCamera camera; std::vector<DMLight> lights; std::vector<DMModel> models; bool loadInfo(const std::string &filename); }; #endif