Mercurial > hg > forks > gldragon
diff dmscene.h @ 61:7b138613e2fc
Rename dmmodel.* to dmscene.*
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 14 Dec 2019 14:08:51 +0200 |
parents | dmmodel.h@8b335eb444ae |
children | 701bef61dcf1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmscene.h Sat Dec 14 14:08:51 2019 +0200 @@ -0,0 +1,220 @@ +// +// GLDragon - OpenGL PLY model viewer / simple benchmark +// -- Scene and model handling + PLY file parsing +// Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org> +// (C) Copyright 2019 Tecnic Software productions (TNSP) +// +// See file "COPYING" for license information. +// +#ifndef DMSCENE_H +#define DMSCENE_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 DMVector3 +{ + float x, y, z; +}; + + +union DMVector4 +{ + struct { float x, y, z, w; } p; + struct { float r, g, b, a; } c; + float values[4]; +}; + + +struct DMMaterial +{ + DMVector4 ambient, diffuse, specular; + int shininess; +}; + + +struct DMModel +{ + int nvertices, nfaces; + std::vector<DMVector3> vertices, normals; + std::vector<unsigned int> faces; + + DMMaterial material; + DMVector3 translate, scale, rotate; + bool translateSet, scaleSet, rotateSet; + + 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); + + DMModel() + { + nfaces = nvertices = 0; + + translate.x = translate.y = translate.z = 0; + rotate.x = rotate.y = rotate.z = 0; + scale.x = scale.y = scale.z = 0; + translateSet = rotateSet = scaleSet = false; + + material.diffuse.c.r = material.diffuse.p.z = 0.56471f; + material.diffuse.c.g = 0.5f; + material.diffuse.c.a = 1.0f; + + material.specular.c.r = material.specular.c.g = material.specular.c.b = 0.8f; + material.specular.c.a = 1.0f; + + material.shininess = 96; + } +}; + + +struct DMLight +{ + DMMaterial color; + DMVector4 position, pointAt; + + DMLight() + { + color.ambient.c.r = color.ambient.c.g = color.ambient.p.z = 0.2f; color.ambient.c.a = 1.0f; + color.diffuse.c.r = color.diffuse.c.g = color.diffuse.p.z = 0.8f; color.diffuse.c.a = 1.0f; + color.specular.c.r = color.specular.c.g = color.specular.p.z = 0.5f; color.specular.c.a = 1.0f; + + position.p.x = 10.0f; + position.p.y = 10.0f; + position.p.z = 0.0f; + position.p.w = 0.0f; + } +}; + + +struct DMCamera +{ + DMVector4 position, pointAt; +}; + + +struct DMSimpleScene +{ + DMCamera camera; + std::vector<DMLight> lights; + std::vector<DMModel> models; + + bool loadInfo(const std::string &filename); +}; + +#endif