1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef ASS_PARSER_H
#define ASS_PARSER_H
#include <vector>
#include "3DModel.h"
#include "IModelParser.h"
#include "System/float3.h"
#include "System/type2.h"
#include "System/UnorderedMap.hpp"
struct aiNode;
struct aiScene;
class LuaTable;
typedef SVertexData SAssVertex;
struct SAssPiece: public S3DModelPiece
{
SAssPiece() = default;
SAssPiece(const SAssPiece&) = delete;
SAssPiece(SAssPiece&& p) { *this = std::move(p); }
SAssPiece& operator = (const SAssPiece& p) = delete;
SAssPiece& operator = (SAssPiece&& p) {
#if 0
// piece is never actually moved, just need the operator for pool
vertices = std::move(p.vertices);
indices = std::move(p.indices);
#endif
return *this;
}
void Clear() override {
S3DModelPiece::Clear();
vertices.clear();
indices.clear();
numTexCoorChannels = 0;
}
unsigned int GetVertexCount() const override { return vertices.size(); }
unsigned int GetVertexDrawIndexCount() const override { return indices.size(); }
const float3& GetVertexPos(const int idx) const override { return vertices[idx].pos; }
const float3& GetNormal(const int idx) const override { return vertices[idx].normal; }
const std::vector<SAssVertex>& GetVertexElements() const override { return vertices; }
const std::vector<unsigned>& GetVertexIndices() const override { return indices; }
unsigned int GetNumTexCoorChannels() const { return numTexCoorChannels; }
void SetNumTexCoorChannels(unsigned int n) { numTexCoorChannels = n; }
public:
std::vector<SAssVertex> vertices;
std::vector<unsigned int> indices;
unsigned int numTexCoorChannels = 0;
};
class CAssParser: public IModelParser
{
public:
typedef spring::unordered_map<std::string, S3DModelPiece*> ModelPieceMap;
typedef spring::unordered_map<std::string, std::string> ParentNameMap;
void Init() override;
void Kill() override;
S3DModel Load(const std::string& modelFileName) override;
private:
static void PreProcessFileBuffer(std::vector<unsigned char>& fileBuffer);
static void SetPieceName(
SAssPiece* piece,
const S3DModel* model,
const aiNode* pieceNode,
ModelPieceMap& pieceMap
);
static void SetPieceParentName(
SAssPiece* piece,
const S3DModel* model,
const aiNode* pieceNode,
const LuaTable& pieceTable,
ParentNameMap& parentMap
);
static void LoadPieceTransformations(
SAssPiece* piece,
const S3DModel* model,
const aiNode* pieceNode,
const LuaTable& pieceTable
);
static void LoadPieceGeometry(
SAssPiece* piece,
const S3DModel* model,
const aiNode* pieceNode,
const aiScene* scene
);
SAssPiece* AllocPiece();
SAssPiece* LoadPiece(
S3DModel* model,
const aiNode* pieceNode,
const aiScene* scene,
const LuaTable& modelTable,
ModelPieceMap& pieceMap,
ParentNameMap& parentMap
);
static void BuildPieceHierarchy(S3DModel* model, ModelPieceMap& pieceMap, const ParentNameMap& parentMap);
static void CalculateModelDimensions(S3DModel* model, S3DModelPiece* piece);
static void CalculateModelProperties(S3DModel* model, const LuaTable& pieceTable);
static void FindTextures(
S3DModel* model,
const aiScene* scene,
const LuaTable& pieceTable,
const std::string& modelPath,
const std::string& modelName
);
private:
unsigned int maxIndices = 0;
unsigned int maxVertices = 0;
unsigned int numPoolPieces = 0;
std::vector<SAssPiece> piecePool;
spring::mutex poolMutex;
};
#endif /* ASS_PARSER_H */
|