1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-10-05 16:47:19 +02:00
openrw/rwengine/include/render/Model.hpp

163 lines
3.3 KiB
C++
Raw Normal View History

2013-09-25 10:05:18 +02:00
#pragma once
#ifndef _MODEL_HPP_
#define _MODEL_HPP_
2014-02-09 04:14:43 +01:00
#include <glm/glm.hpp>
2013-09-25 10:05:18 +02:00
#include <vector>
#include <string>
#include <memory>
2014-03-01 05:12:35 +01:00
#include <algorithm>
2013-09-25 10:05:18 +02:00
#include <GL/glew.h>
#include <loaders/rwbinarystream.h>
2014-02-10 09:55:01 +01:00
#include "DrawBuffer.hpp"
#include "GeometryBuffer.hpp"
2013-09-25 10:05:18 +02:00
2014-02-13 11:55:11 +01:00
/**
* ModelFrame stores the hierarchy of a model's geometry as well as default
* transformations.
*/
2014-02-09 04:14:43 +01:00
class ModelFrame {
glm::mat3 defaultRotation;
glm::vec3 defaultTranslation;
glm::mat4 matrix;
ModelFrame* parentFrame;
std::string name;
std::vector<size_t> geometries;
std::vector<ModelFrame*> childs;
public:
ModelFrame(ModelFrame* parent, glm::mat3 dR, glm::vec3 dT);
~ModelFrame();
void reset();
void setTransform(const glm::mat4& m);
2014-03-01 12:19:33 +01:00
const glm::mat4& getTransform() const { return matrix; }
2014-02-09 04:14:43 +01:00
void setName(const std::string& fname)
{ name = fname; }
void addGeometry(size_t idx);
glm::vec3 getDefaultTranslation() const
{ return defaultTranslation; }
glm::mat3 getDefaultRotation() const
{ return defaultRotation; }
glm::mat4 getMatrix() const
{ return (parentFrame? parentFrame->getMatrix() : glm::mat4()) * matrix; }
2014-02-12 07:42:07 +01:00
ModelFrame* getParent() const
{ return parentFrame; }
2014-02-09 04:14:43 +01:00
const std::vector<ModelFrame*>& getChildren() const
{ return childs; }
const std::string& getName() const
{ return name; }
const std::vector<size_t>& getGeometries() const
{ return geometries; }
};
2014-02-13 11:55:11 +01:00
/**
* Model stores all the data contained within a DFF, as well as data required
* to render them.
*/
2013-09-25 10:05:18 +02:00
class Model
{
public:
enum FaceType {
Triangles = 0,
TriangleStrip = 1
};
RW::BSClump clump;
struct Texture {
std::string name;
std::string alphaName;
};
2014-02-10 10:22:12 +01:00
enum {
MTF_PrimaryColour = 1 << 0,
MTF_SecondaryColour = 1 << 1
};
2013-09-25 10:05:18 +02:00
struct Material {
std::vector<Texture> textures;
2014-05-25 23:30:50 +02:00
glm::u8vec4 colour;
2014-02-10 10:22:12 +01:00
uint8_t flags;
2013-09-25 10:05:18 +02:00
float diffuseIntensity;
float ambientIntensity;
};
struct SubGeometry {
GLuint start = 0;
size_t material;
uint32_t* indices;
size_t numIndices;
};
2014-02-10 09:55:01 +01:00
struct GeometryVertex {
glm::vec3 position; /* 0 */
glm::vec3 normal; /* 24 */
glm::vec2 texcoord; /* 48 */
glm::vec4 colour; /* 64 */
2014-02-13 11:55:11 +01:00
/** @see GeometryBuffer */
2014-02-10 09:55:01 +01:00
static const AttributeList vertex_attributes() {
return {
{ATRS_Position, 3, sizeof(GeometryVertex), 0ul},
{ATRS_Normal, 3, sizeof(GeometryVertex), sizeof(float)*3},
{ATRS_TexCoord, 2, sizeof(GeometryVertex), sizeof(float)*6},
{ATRS_Colour, 4, sizeof(GeometryVertex), sizeof(float)*8}
};
}
};
2013-09-25 10:05:18 +02:00
struct Geometry {
2014-02-10 09:55:01 +01:00
DrawBuffer dbuff;
GeometryBuffer gbuff;
GLuint EBO;
2013-09-25 10:05:18 +02:00
RW::BSGeometryBounds geometryBounds;
uint32_t clumpNum;
FaceType facetype;
uint32_t flags;
std::vector<Material> materials;
std::vector<SubGeometry> subgeom;
Geometry();
~Geometry();
};
struct Atomic {
uint32_t frame;
uint32_t geometry;
};
2014-02-09 04:14:43 +01:00
std::vector<ModelFrame*> frames;
2014-02-13 11:55:11 +01:00
/** @TODO clean up this mess a little */
2013-09-25 10:05:18 +02:00
std::vector<std::shared_ptr<Geometry>> geometries;
std::vector<Atomic> atomics;
int32_t rootFrameIdx;
2014-03-01 05:12:35 +01:00
ModelFrame* findFrame(const std::string& name) const {
auto fit = std::find_if(
frames.begin(), frames.end(),
[&](ModelFrame* f) { return f->getName() == name; });
return fit != frames.end() ? *fit : nullptr;
}
2013-09-25 10:05:18 +02:00
};
2014-03-01 05:12:35 +01:00
#endif