3doparser.h

来自「这是整套横扫千军3D版游戏的源码」· C头文件 代码 · 共 124 行

H
124
字号
// 3DOParser.h: interface for the C3DOParser class.
//
//////////////////////////////////////////////////////////////////////
#ifndef SPRING_3DOPARSER_H
#define SPRING_3DOPARSER_H

#include <vector>
#include <string>
#include "float3.h"
#include "Rendering/Textures/TextureHandler.h"
#include <map>
#include <set>
#include "3DModelParser.h"

using namespace std;
class CMatrix44f;

class CFileHandler;

struct S3DOVertex {
	float3 pos;
	float3 normal;
	std::vector<int> prims;
};

struct S3DOPrimitive {
	std::vector<int> vertices;
	std::vector<float3> normals;		//normals per vertex
	float3 normal;
	int numVertex;
	CTextureHandler::UnitTexture* texture;
};

struct S3DO {
	std::string name;
	std::vector<S3DO*> childs;
	std::vector<S3DOPrimitive> prims;
	std::vector<S3DOVertex> vertices;
	float3 offset;
	unsigned int displist;
	bool isEmpty;
	float radius;
	float3 relMidPos;
	float maxx,maxy,maxz;
	float minx,miny,minz;

	void DrawStatic();
	~S3DO();
};

class C3DOParser
{
	typedef struct _3DObject
	{
		int VersionSignature;
		int NumberOfVertices;
		int NumberOfPrimitives;
		int SelectionPrimitive;
		int XFromParent;
		int YFromParent;
		int ZFromParent;
		int OffsetToObjectName;
		int Always_0;
		int OffsetToVertexArray;
		int OffsetToPrimitiveArray;
		int OffsetToSiblingObject;
		int OffsetToChildObject;
	} _3DObject;

	typedef struct _Vertex
	{
		int x;
		int y;
		int z;
	} _Vertex;

	typedef struct _Primitive
	{
		int PaletteEntry;
		int NumberOfVertexIndexes;
		int Always_0;
		int OffsetToVertexIndexArray;
		int OffsetToTextureName;
		int Unknown_1;
		int Unknown_2;
		int Unknown_3;
	} _Primitive;

	typedef std::vector<float3> vertex_vector;

public:
	C3DOParser();
	virtual ~C3DOParser();
	S3DOModel* Load3DO(string name,float scale=1,int side=1);
	S3DOModel* Load3DO(string name,float scale,int side,const float3& offsets);
	LocalS3DOModel *CreateLocalModel(S3DOModel *model, vector<struct PieceInfo> *pieces);

private:
	void FindCenter(S3DO* object);
	float FindRadius(S3DO* object,float3 offset);
	float FindHeight(S3DO* object,float3 offset);
	void CalcNormals(S3DO* o);

	void DeleteS3DO(S3DO* o);
	void CreateLists(S3DO* o);
	float scaleFactor;

	void GetPrimitives(S3DO* obj,int pos,int num,vertex_vector* vv,int excludePrim,int side);
	void GetVertexes(_3DObject* o,S3DO* object);
	std::string GetText(int pos);
	bool ReadChild(int pos,S3DO* root,int side, int *numobj);
	void DrawSub(S3DO* o);
	void CreateLocalModel(S3DO *model, LocalS3DOModel *lmodel, vector<struct PieceInfo> *pieces, int *piecenum);

	map<string,S3DOModel*> units;
	set<string> teamtex;

	int curOffset;
	unsigned char* fileBuf;
	void SimStreamRead(void* buf,int length);
};

#endif // SPRING_3DOPARSER_H

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?