File: AssParser.h

package info (click to toggle)
spring 106.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 55,316 kB
  • sloc: cpp: 543,954; ansic: 44,800; python: 12,575; java: 12,201; awk: 5,889; sh: 1,796; asm: 1,546; xml: 655; perl: 405; php: 211; objc: 194; makefile: 76; sed: 2
file content (137 lines) | stat: -rw-r--r-- 3,490 bytes parent folder | download | duplicates (3)
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 */